欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Flutter实现外部跳转,跳转到其他app

程序员文章站 2022-03-04 23:25:52
- 外部跳转该功能的实现,需要使用 uni_links 第三方库来协助完成外部页面的 Scheme,在 pubspec.yaml 中增加依赖,然后更新本地库文件。由于 Android 和 iOS 在配置上会有点区别,因此这里分别来介绍。Android 流程在项目中找到这个路径下的文件android/app/src/main/AndroidManifest.xml在配置的 application 下的 activity 内增加如下配置:第 6 行代码就是声明这个 App 的 Schem...

- 外部跳转

该功能的实现,需要使用 uni_links 第三方库来协助完成外部页面的 Scheme,在 pubspec.yaml 中增加依赖,然后更新本地库文件。由于 Android 和 iOS 在配置上会有点区别,因此这里分别来介绍。

Android 流程
在项目中找到这个路径下的文件
android/app/src/main/AndroidManifest.xml
在配置的 application 下的 activity 内增加如下配置:


*<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:scheme="tyfapp"/>
</intent-filter>*

第 6 行代码就是声明这个 App 的 Scheme 的协议。

iOS 流程
在项目中找到这个路径下的文件

ios/Runner/info.plist

在 dict 内增加下面的配置:

CFBundleURLTypes


CFBundleTypeRole
Editor
CFBundleURLName
Two You
CFBundleURLSchemes

tyfapp


其中的第 9 行声明 App 的 Scheme。
以上就完成了基础的配置,接下来我们就使用 uni_links 来实现 Scheme 的监听。
Uni_links 实现外部跳转
首先我们在 pages 目录下新建一个主入口文件 entrance.dart ,该文件需要设计为一个有状态类组件。在组件中最关键的是监听获取到打开 App 的链接地址,实现的方式如下代码。


/// 使用[String]链接实现
Future<void> initPlatformStateForStringUniLinks() async {
  String initialLink;
  // Platform messages may fail, so we use a try/catch PlatformException.
  try {
    ***initialLink = await getInitialLink();***
    if (initialLink != null) {
      //  跳转到指定页面
      router.push(context, initialLink);
    }
  } on PlatformException {
    initialLink = 'Failed to get initial link.';
  } on FormatException {
    initialLink = 'Failed to parse the initial link as Uri.';
  }
  // Attach a listener to the links stream
  **_sub = getLinksStream().listen((String link) {**
    if (!mounted || link == null) return;
    //  跳转到指定页面
    router.push(context, link);
  }, onError: (Object err) {
    if (!mounted) return;
  });

其中第 6 行是处理在外部直接拉起 App 的业务逻辑,第 17 行则表示当前 App 处于打开状态,监听外部拉起事件,监听变化后处理相应的跳转逻辑。由于组件中有一个监听事件,为了避免组件被销毁后还在监听,因此需要在组件销毁阶段移除监听事件,代码如下:

@override
void dispose() {
super.dispose();
if (_sub != null) _sub.cancel();
}

以上就实现了 Scheme 可以直接在内外部使用的跳转逻辑。不过 Scheme 在 App 外部存在一些体验方面的问题,比如:

当需要被拉起的 App 没有被安装时,这个链接就不会生效;

在大部分 App 内 Scheme 是被禁用的,因此在用户体验的时候会非常差;

注册的 Scheme 相同导致冲突;

为了解决上述问题,Andorid 和 iOS 都提供了一套解决方案,在 Android 叫作 App link / Deep links ,在 iOS 叫作 Universal Links / Custom URL schemes。解决的方案就是在未安装 App 时可提供网页跳转,其次可以使用 https 和 http 域名链接的方式来进一步提升唯一性。

App link / Deep links

应用链接仅适用于 https 方案,并且需要指定的主机以及托管文件 assetlinks.json,该配置文件可参考如下:

[{
“relation”: [“delegate_permission/common.handle_all_urls”],
“target”: {
“namespace”: “android_app”,
“package_name”: “com.example”,
“sha256_cert_fingerprints”:
[“14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5”]
}
}]

package_name,在应用的 build.gradle 文件中声明的应用 ID;

sha256_cert_fingerprints:应用签名证书的 SHA256 指纹,你可以利用 Java 密钥工具。

配置好该文件后,同样是修改下面路径下的文件。

android/app/src/main/AndroidManifest.xml

在配置的 application 下的 activity 内增加如下配置:

  <intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- Accepts URIs that begin with https://YOUR_HOST -->
    <data
      android:scheme="https"
      android:host="[YOUR_HOST]" />
  </intent-filter>

具体的过程,你可以在线上项目开发过程中尝试应用。

Universal Links / Custom URL schemes

该方法也是需要一个主机域名来启动应用,因此需要服务的一个在线配置,例如:https://www.example.test/apple-app-site-association 获取 apple-app-site-association 的配置文件如下。

{
“applinks”: {
“apps”: [],
“details”: [
{
“appID”: “8LX3M43WHV.me.gexiao.me”,
“paths”: [ “/*” ]
}
]
}
}
同样我们需要修改下面路径的文件。
ios/Runner/info.plist
在 dict 内增加下面的配置:

com.apple.developer.associated-domains

applinks:[YOUR_HOST]

以上就是外部跳转的实现方案,实现外部跳转的 App Links 和 Universal Link 功能,由于需要域名部署,我这里就没有实际应用,具体你可以在项目开发中尝试。

本文地址:https://blog.csdn.net/u013075460/article/details/110130955