最近遇到了这个问题,其实这个问题在源生开发中算是一个很常见的问题。有很多场景都需要通过其他APP或者H5来打开APP并且有时候会携带参数。

所以在这里我说一下我的做法(大神勿喷,有更好的办法请评论区留言,不胜感激)。

我的思路就是:1.APP接收第三方平台的请求方式与源生处理方式不变,然后存储好请求的参数;2.利用平台提供的Flutter与源生交互的通道MethodChannel(android)以及FlutterMethodChannel(iOS),在双端分别创建一个可以访问到存储的请求数据的通道,通过判断存储的数据,来响应第三方平台的请求。

Android端

1.首先在AndroidManifest.xml中修改入口Activity的配置:

            android:name=".MainActivity"android:launchMode="singleTask"android:theme="@style/LaunchTheme"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:exported="true"android:windowSoftInputMode="adjustResize"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.BROWSABLE"/><data android:scheme="scheme" android:host="host" android:pathPrefix="/path"/></intent-filter></activity>

其中 android:launchMode=“singleTask” android:exported=“true” 是新增的
以及

                <action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.BROWSABLE"/><data android:scheme="scheme" android:host="host" android:pathPrefix="/path"/>

2.在MainActivity中接收并保存第三方传递过来的参数信息:

  private void getOpenData(){try {Uri uri = getIntent().getData();if (uri==null){return;}String query = uri.getQuery();String openpage = uri.getQueryParameter("openpage");String data = uri.getQueryParameter("data");Log.d("scheme-", "openpage: " + openpage + ", data: " + data + ", query: " + query);JSONObject jsonObject=new JSONObject();jsonObject.put("openpage",openpage);jsonObject.put("data",data);CampusBarApplication.schemeInfo=jsonObject;} catch (Exception e) {Log.e("scheme-", e.getMessage(), e);}}

我这里用了一个静态变量保存 CampusBarApplication.schemeInfo=jsonObject; 用数据库、SP,文件等都可以,这里为了方便就用了个静态变量。

3.定义一个Flutter与源生交互的通道:
什么是通道?https://book.flutterchina.club/chapter12/platform-channel.html

 private void initOpenPage() {
//    new MethodChannel()new MethodChannel(getFlutterView(), openpage_chanel).setMethodCallHandler((methodCall, result) -> {if (methodCall.method.equals(checkOpenPage)) {Map<String,String> map=new HashMap<>();if (CampusBarApplication.schemeInfo==null){map.put("code","201");}else {map.put("code","200");map.put("openpage",CampusBarApplication.schemeInfo.getString("openpage"));map.put("data",CampusBarApplication.schemeInfo.getString("data"));CampusBarApplication.schemeInfo=null;//记得在每次相应完清空保存的数据}result.success(map);}});}

4.在flutter代码使用:

  var  platform = MethodChannel(NetUrlConstant.OPENPAGE_CHANEL);platform.invokeMethod(NetUrlConstant.CHECK_OPEN_PAGE).then((onValue){if(onValue["code"]=="200"){println(onValue["data"]+"aassddffgg-----------------------------");//TODO}else if(onValue["code"]=="201"){}});

这样就可以在flutter响应到第三方的请求。

iOS端

1.首先开始跟源生开发一样去配置URL Scheme 或者使用universal link,我在这就不讲怎么配置了。
2.在AppDelegate.m中接收并保存第三方传递过来的参数信息:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{NSLog(@"URL scheme:%@", [url scheme]);NSLog(@"URL query: %@", [url query]);NSMutableDictionary * dic=[NSMutableDictionary dictionary];[dic setObject:[url scheme] forKey:@"openpage"];[dic setObject:[url query] forKey:@"data"];NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];[userDefaults setObject:dic forKey:@"openinfo"];//这里建议同步存储到磁盘中,但是不是必须的[userDefaults synchronize];return YES;
}

3.在AppDelegate.m 中同样是定义一个通道:

    FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;FlutterMethodChannel* channel = [FlutterMethodChannelmethodChannelWithName:@"openpage_chanel"binaryMessenger:controller];[channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {// TODOif ([@"checkOpenPage" isEqualToString:call.method]) {NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];//读取字典类型NSDictionary类型的数据NSMutableDictionary *dic = [userDefaultes dictionaryForKey:@"openinfo"];if (dic) {[dic setObject:@"200" forKey:@"code"];//记得清除保存的信息}else{dic=[NSMutableDictionary dictionary];[dic setObject:@"201" forKey:@"code"];}result(dic);}}];

注意:Android跟iOS要协商好,将通道返回的信息格式保持一致,这样在Flutter就不用判断平台,用一套代码就可以完成双端的操作。

PS:有更好的办法请评论区留言,不胜感激

H5 跳转Flutter APP问题:在Flutter中解决H5能够打开APP并接收H5传递的参数相关推荐

  1. android 模拟器uuid,某APP 注册之uuid详解之从打开APP日志入手

    写在前面的话 前排提示:求链接求联系方式均为违规!这是分析贴... 之前的某哩由于截图处理不恰当被删帖了,所以以后的相关帖,我尽量不放APP或网页的截图 我所使用到的工具和操作环境: 操作环境: WI ...

  2. 【笔记】H5跳转手机应用商店(指定应用页/第三方应用商店)

    文章目录 判断当前设备是ios还是安卓 跳转默认应用商店 常见机型应用市场跳转方式 常见应用商店包名 判断是否是微信 判断当前设备是ios还是安卓 function isIOS() { // ios终 ...

  3. 小程序和android联调,小程序打开APP指定页面

    小程序打开APP指定页面 一.小程序端准备 1.最好将小程序基础调试库调整至较为新的版本.(我选择的是大于2.5.1的版本) 2.从官网把代码 copy 过来,记得看看 button 的小程序打开ap ...

  4. vue生成app二维码,并扫码下载app

    文章目录 项目需求 开发 web官网下载页的开发 web官网地址生成下载二维码 项目需求 公司要做一个web官网的下载页面,功能是微信扫码可以直接下载Ios手机端app.Android手机端app.及 ...

  5. App打开小程序,小程序打开App

    App打开小程序(Android) 需要以下小程序和app的信息: 应用的AppID,小程序的AppID,小程序的原始ID 第一步:App所在开放平台关联要跳转的小程序 管理中心->移动应用-& ...

  6. Android中静态方式破解某App实现所有视频app去除广告功能

    转:  Android中静态方式破解某App实现所有视频app去除广告功能 作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频 ...

  7. 微信QQ通过分享链接直接打开APP问题

    需求:通过分享链接打开APP并定位到分享的页面 x5浏览器可能有URL scheme白名单, 1.第三方浏览器和应用(除了腾讯)打开APP普遍方法是通过 URL scheme 直接打开APP.&quo ...

  8. python 调用adb打开app

    通过python xx.py来执行 # -*- coding: utf-8 -*- """ 唤醒手机并进入应用APP中 """ import ...

  9. Flutter实战 | 从 0 搭建「网易云音乐」APP(五、播放功能逻辑)

    本系列可能会伴随大家很长时间,这里我会从0开始搭建一个「网易云音乐」的APP出来. 下面是该APP 功能的思维导图: 前期回顾: 1.Flutter实战 | 从 0 搭建「网易云音乐」APP(一.创建 ...

最新文章

  1. Tomcat Servlet
  2. 忘了root口令解决方法
  3. erp系统为什么要选稳定性强的?看完你就明白了
  4. 潘通色卡tcx电子版_【收藏】最全“潘通色卡电子版”,只带手机对色一步到位!...
  5. Java中的作用域有哪些
  6. [译]WPF 应用程序和MVVM设计模式 ——Josh Smith
  7. HDU 5145 - NPY and girls
  8. 用VB实现带图片的XP风格的按钮控件
  9. 黑苹果alc269声卡仿冒id_AppleALC仿冒声卡驱动alc269优化版(Lenovo Z580亲测)
  10. 计算机无法识别语音输入,我的电脑每次启动语音识别总是显示“由于语言配置不受支持,无法启动语音识别”;...
  11. resin设置权限_resin加固
  12. matlab在常微分方程的应用,Matlab在常微分方程教学中的应用
  13. 每日一词20190301——比例尺和地图比例尺
  14. hexo搭建个人博客之seo优化
  15. android修改自动背光,自动背光算法-Android 8.1
  16. EasyPoiUtil纯代码生成excel进行下载
  17. Redis Desktop Manager 运行时报0xc000007b
  18. Python中pass的作用
  19. 论文笔记:MPRNet: Multi-Stage Progressive Image Restoration
  20. 因果模型一:因果模型入门综述

热门文章

  1. 串口通信协议常用校验计算以及一些常用方法
  2. VOT2018 SiamNet VS DCF
  3. 分支过程灭绝概率matlab,分支过程
  4. FullCalendar日历插件文档
  5. Oracle 11g SQLPlus命令
  6. CSS基础_CSS样式的几种书写形式
  7. 2022-2027年(新版)中国果汁饮料行业销售渠道与营销趋势预测报告
  8. 有限角位移不是矢量。
  9. Android Studio 获取应用签名 MD5和SHA1等
  10. vs 2019+linux跨平台开发中的sqlite3数据库环境配置