Flutter - Firebase 动态链接没有被 onLink 捕获,而是在 iOS 上打开应用

Posted

技术标签:

【中文标题】Flutter - Firebase 动态链接没有被 onLink 捕获,而是在 iOS 上打开应用【英文标题】:Flutter - Firebase Dynamic Link is not caught by onLink but open the app on iOS 【发布时间】:2021-06-01 00:33:07 【问题描述】:

android 上一切正常,但在 ios 上,当应用程序已打开时,单击链接会将应用程序置于前台,但未调用 onLink 方法。

链接:

https://<url>/?link=<link>&apn=<apn>&ibi=<bundle>&isi=<isi>

包装:

firebase_dynamic_links:^0.6.3

代码

import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
import 'package:flutter/material.dart';

class DynamicLinksService 

  Future handleDynamicLinks(BuildContext context) async 
    final PendingDynamicLinkData data =
        await FirebaseDynamicLinks.instance.getInitialLink();

    await _handleDynamicLink(context, data);

    FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLinkData) async 
      await _handleDynamicLink(context, dynamicLinkData);
    , onError: (OnLinkErrorException e) async 
      print('Dynamic link failed: $e.message');
    );
  

  Future _handleDynamicLink(
      BuildContext context, PendingDynamicLinkData data) async 
    final Uri deepLink = data?.link;
    if (deepLink != null) 
      print('_handleDeepLink | deepLink $deepLink');

      await _doSomething(context, deepLink.toString());
     else 
      print('no deepLink');
    
  


【问题讨论】:

您是否将域设置添加到关联域? 是的,我在 firebase 上注册的网址是 dynamic.vendoa.it,我添加了以下 applinks:dynamic.vendoa.it 你搞定了吗? 我也遇到了同样的问题。应用程序打开,但未调用 onLink。有更新吗? 它对我有用!基本上,您需要在启动时添加 2-3 秒的延迟 + 您可以处理来自 (onSuccess) 的深层链接。它终于对我有用了!检查下面的链接betterprogramming.pub/… 【参考方案1】:

根据我的实验,在 iOS 上不会调用 onLink,但是您可以调用 getInitialLink() 并且它将包含链接。我不确定这是设计使然还是错误,但它似乎跨越了几个版本。

示例服务代码:

  Future<Uri> retrieveDynamicLink(BuildContext context) async 
    try 
      final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
      final Uri deepLink = data?.link;
      return deepLink;
     catch (e) 
      print(e.toString());
    

    return null;
  

小部件 sn-p

  @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)
        final _timerLink = Timer(
          const Duration(milliseconds: 1000),
              () async 
            final auth = Provider.of<FirebaseAuthService>(context, listen: false);
            final link = await auth.retrieveDynamicLink(context);
            _handleLink(link);
          ,
        );
      
  

确保添加 WidgetsBindingObserver

class _SignInPageState extends State<SignInPage> with TickerProviderStateMixin, WidgetsBindingObserver

【讨论】:

【参考方案2】:

我不确定为什么会这样,但您必须首先调用 FirebaseMessaging.instance.getInitialMessage() 至少一次,然后您的 onLink 回调才会被 Firebase 激活。

不确定这是设计使然还是错误。

让我知道这是否有效。

【讨论】:

以上是关于Flutter - Firebase 动态链接没有被 onLink 捕获,而是在 iOS 上打开应用的主要内容,如果未能解决你的问题,请参考以下文章

在flutter中处理链接并使用firebase动态链接导航

在 Flutter 中使用 Firebase 动态链接邀请链接到不同的组

Flutter:使用 Firebase 动态链接,有人可以告诉我如何通过链接传递参数列表以及如何接收它吗?

Flutter - 如何在应用邀请功能的 Firebase 动态链接中传递自定义参数?

Flutter Firebase 动态链接不适用于新的 ios 应用安装

Flutter - 无法在flutter web中使用动态链接