如果应用被该链接关闭并打开,则 getInitialLink 不会捕获 Firebase 动态链接

Dan*_*iel 9 flutter firebase-dynamic-links

以编程方式生成的动态链接未被正确捕获

FirebaseDynamicLinks.instance.getInitialLink().

如果应用程序已关闭。但是,如果应用程序处于打开状态,侦听器会正确检测到新传入的动态链接。我不清楚这是否是设置问题,我是如何生成动态链接的。

再现

首先按照文档为 Flutter 项目设置 Firebase。然后设置动态链接:

/// See also
/// https://firebase.google.com/docs/dynamic-links/use-cases/rewarded-referral
/// how to implement referral schemes using Firebase.
Future<ShortDynamicLink> buildDynamicLink(String userId) async {
  final PackageInfo packageInfo = await PackageInfo.fromPlatform();
  final String packageName = packageInfo.packageName;

  var androidParams = AndroidParameters(
    packageName: packageInfo.packageName,
    minimumVersion: Constants.androidVersion, // app version and not the Android OS version
  );

  var iosParams = IosParameters(
    bundleId: packageInfo.packageName,
    minimumVersion: Constants.iosVersion, // app version and not the iOS version
    appStoreId: Constants.iosAppStoreId,
  );

  var socialMetaTagParams = SocialMetaTagParameters(
    title: 'Referral Link',
    description: 'Referred app signup',
  );

  var dynamicLinkParams = DynamicLinkParameters(
    uriPrefix: 'https://xxxxxx.page.link',
    link: Uri.parse('https://www.xxxxxxxxx${Constants.referralLinkPath}?${Constants.referralLinkParam}=$userId'),
    androidParameters: androidParams,
    iosParameters: iosParams,
    socialMetaTagParameters: socialMetaTagParams,
  );

  return dynamicLinkParams.buildShortLink();
}
Run Code Online (Sandbox Code Playgroud)

然后可以与其他新用户共享此动态链接。

我在应用程序启动时监听初始链接,然后监听新的传入链接。

1) 如果应用程序没有运行但 getInitialLink 没有得到它,链接会正确打开应用程序。

2)如果应用程序打开,则链接会被侦听器正确捕获并且一切正常。

这是我用来验证的非常简单的 main.dart 1) FirebaseDynamicLinks.instance.getInitialLink() 未找到初始链接。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  PendingDynamicLinkData linkData = await FirebaseDynamicLinks.instance.getInitialLink();
  String link = linkData?.link.toString();
  runApp(MyTestApp(link: link));
}

class MyTestApp extends StatelessWidget {
  final String link;

  MyTestApp({this.link});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        builder: (BuildContext context, Widget child) {
          return Scaffold(
            body: Container(
              child: Center(
                  child: Text('Initial dynamic Firebase link: $link')
              ),
            ),
          );
        }
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

预期行为

该链接应打开应用程序并触发FirebaseDynamicLinks.instance.getInitialLink()..

附加上下文

我希望使用 Firebase 控制台正确配置 Firebase 项目。为了验证这一点,我创建了一个动态链接,用于 Firebase 身份验证“通过电子邮件链接注册”,这些动态链接按预期工作,即使应用程序未打开也是如此。

这里的要点是,我以编程方式生成的推荐动态链接在应用程序关闭时打开它,但随后没有被 捕获FirebaseDynamicLinks.instance.getInitialLink(),并且使事情变得更加混乱,如果应用程序打开,它会按预期工作。在这种情况下,它会被侦听器捕获FirebaseDynamicLinks.instance.onLink

WidgetsBindingObserver当应用程序重新获得焦点时,我还设置了Flutter 以根据需要处理该回调。

任何帮助是极大的赞赏。调试非常棘手,因为您需要在真实设备上而不是在模拟器中进行调试。更糟糕的是,我没有弄清楚如何在动态链接打开应用程序时附加调试器。这意味着我也被困在进一步调查这个问题上。

小智 12

  • FirebaseDynamicLinks中有两种方法1) getInitialLink() 2) onLink()

  • 如果您的应用程序打开并且您单击动态链接,则将调用 FirebaseDynamicLinks.instance.onLink(),如果您的应用程序被终止或从 PlayStore 打开,则您可以从FirebaseDynamicLinks.instance.getInitialLink() 获取;

  • 首先需要初始化FirebaseDynamicLinks.instance的实例。

      static void initDynamicLinks() async {
        final PendingDynamicLinkData data =
            await FirebaseDynamicLinks.instance.getInitialLink();
        final Uri deepLink = data?.link;
    
        if (deepLink != null && deepLink.queryParameters != null) {
          SharedPrefs.setValue("param", deepLink.queryParameters["param"]);
        }
    
        FirebaseDynamicLinks.instance.onLink(
            onSuccess: (PendingDynamicLinkData dynamicLink) async {
          final Uri deepLink = dynamicLink?.link;
    
          if (deepLink != null && deepLink.queryParameters != null) {
            SharedPrefs.setValue("param", deepLink.queryParameters["param]);
          }
        }, onError: (OnLinkErrorException e) async {
          print(e.message);
        });
      }
    
    Run Code Online (Sandbox Code Playgroud)

  • 我看不到这一点,因为我只能在设备上进行测试,所以没有调试控制台输出,因为,如果我连接调试器,应用程序正在运行,然后一切正常。 (2认同)