如何在Flutter中实现深层链接,并重定向到应用商店?

时间:2018-12-29 07:06:54

标签: dart flutter deep-linking ios-universal-links

有没有一种方法可以实现抖动中的深层链接,因此,如果用户单击链接,则将他们重定向到应用程序的特定部分(假设已安装该应用程序,但如果没有安装,则他们)重定向到相应的应用商店,以安装该应用,然后带到该特定部分。

在寻找解决方案时,我遇到了一个名为{{1}}的软件包,但不确定是否可以满足此要求。

3 个答案:

答案 0 :(得分:2)

您可以为此使用Firebase动态链接:

https://firebase.google.com/docs/dynamic-links

上面写着:

  

如果用户在iOS或Android上打开动态链接并且没有   您的应用已安装,系统会提示用户安装它;然后,   安装后,您的应用程序将启动并可以访问该链接。

您可以在此处找到有关如何使用Flutter实施此操作的信息:

https://pub.dev/packages/firebase_dynamic_links

我已经在Android和iOS上尝试过了,效果很好。如果未安装该应用程序,则将打开Goog​​le Play商店或Apple AppStore。用户可以点击“安装”,然后点击“打开”。之后,启动您的应用程序,并将动态链接发送到您的应用程序(通过剪贴板在iOS上),您可以在其中访问该应用程序,如上面的网站所述。即在第一个initState方法中启动应用后,您可以调用

final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink();
final Uri deepLink = data?.link;

获得深层链接。但是,以我在iOS上的经验来看,现在检索链接还为时过早。尝试时出现“ null”。似乎要花一点时间。然后,我使用了WidgetsBindingObserver,并在didChangeAppLifecycleState方法中查看了AppLifecycleState.resumed。我在那里叫retrieveDynamicLink。由于权限请求(如果用户允许通知),该方法被调用了两次。第一次返回null,但第二次返回深层链接。所以我的解决方案看起来像这样:

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      _retrieveDynamicLink();
    }
  }

  /**
   * Laden des Deep Link nach der Installation.
   */
  Future<void> _retrieveDynamicLink() async {
    final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink();
    final Uri deepLink = data?.link;

    if (deepLink != null) {
        // Use the deepLink
        // ...
    }
}

答案 1 :(得分:1)

从iOS 12开始,如果未安装应用程序,则无法直接重定向到应用商店的应用深链接。

您可以使用网站上的meta标签apple-itunes-app到应用商店的深层链接或在应用内的深层链接。但这只会在页面顶部显示一个小横幅,而不是真正的深层链接。

branch.io是我以前从未使用过但可能值得一试的系统。使用他们的系统,您也许可以实现类似的目标,但是我不确定它是如何工作的。它肯定不是iOS 12的一部分。

答案 2 :(得分:1)

我迟到了,但可能会对其他人有所帮助。

我们可以使用Firebase动态链接在带有firebase_dynamic_links插件的插件中进行深层链接。请参考此链接以获取完整的实现步骤,并创建和接收链接https://medium.com/better-programming/deep-linking-in-flutter-with-firebase-dynamic-links-8a4b1981e1eb。这是用于在应用程序内部接收链接并打开特定屏幕的示例代码。

class MainWidgetState extends State<MainWidget> {

  @override
  void initState() {
    super.initState();
    this.initDynamicLinks();
  }

  initDynamicLinks(BuildContext context) async {
    await Future.delayed(Duration(seconds: 3));
    var data = await FirebaseDynamicLinks.instance.getInitialLink();
    var deepLink = data?.link;
    final queryParams = deepLink.queryParameters;
    if (queryParams.length > 0) {
      var userName = queryParams['userId'];
      openSpecificScreen(userName);
    }
    FirebaseDynamicLinks.instance.onLink(onSuccess: (dynamicLink)
    async {
      var deepLink = dynamicLink?.link;
      final queryParams = deepLink.queryParameters;
      if (queryParams.length > 0) {
        var userName = queryParams['userId'];
        openSpecificScreen(userName);
      }
      debugPrint('DynamicLinks onLink $deepLink');
    }, onError: (e) async {
      debugPrint('DynamicLinks onError $e');
    });
  }

  openSpecificScreen(String userName){
    Navigator.of(context).pushNamed("routeFormScreen", arguments: {"name": userName});
  }
}