Flutter:动态链接未启动应用程序

Posted

技术标签:

【中文标题】Flutter:动态链接未启动应用程序【英文标题】:Flutter : Dynamic Link not launching the app 【发布时间】:2021-06-24 14:39:42 【问题描述】:

我正在使用 firebase 动态链接在我的应用中打开电子邮件验证链接,但不幸的是,点击该链接时该链接无法启动应用。

到目前为止我做了什么

创建新用户时,会通过电子邮件发送一个链接以进行验证:

if(firebaseUser != null && !firebaseUser.emailVerified)
        await createUserInDatabaseIfNew(firebaseUser);
        var actionCodeSettings = auth.ActionCodeSettings(
          url: 'https://muslimcoloc.page.link/?email=$firebaseUser.email',
          dynamicLinkDomain: "muslimcoloc.page.link",
          androidInstallApp: true,
          androidMinimumVersion: "12",
          androidPackageName: "com.app.muslim_coloc",
          iosBundleId: "com.muslim_coloc.ios",
          handleCodeInApp: true,
        );
        await firebaseUser.sendEmailVerification(actionCodeSettings);
      

我在 firebase 控制台中获得了 dynamicLinkDomain:

然后,我使用firebase dynamic links package 处理我的main.dart 文件中的链接接收:

void main() async 
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(
    MyApp(),
  );

class MyApp extends StatelessWidget 
 MyApp(Key key, )  :  super(key: key);
 
 @override
 Widget build(BuildContext context) 
  return AppView();
 


class AppView extends StatefulWidget 
  const AppView(
    Key key,
  ) : super(key: key);

  @override
  _AppViewState createState() => _AppViewState();

class _AppViewState extends State<AppView> with WidgetsBindingObserver 
@override
  void initState() 
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) 
    if (state == AppLifecycleState.resumed) 
       this.initDynamicLinks();
    
  
 
 void initDynamicLinks() async 
      FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLink) async 
          final Uri deepLink = dynamicLink?.link;
          FirebaseAuth auth = FirebaseAuth.instance;

          //Get actionCode from the dynamicLink
          var actionCode = deepLink.queryParameters['oobCode'];

          try 
            await auth.checkActionCode(actionCode);
            await auth.applyActionCode(actionCode);

            // If successful, reload the user:
            auth.currentUser.reload();
           on FirebaseAuthException catch (e) 
            if (e.code == 'invalid-action-code') 
              print('The code is invalid.');
            
          

          if (deepLink != null) 
            Navigator.pushNamed(context, deepLink.path);
          
        ,
        onError: (OnLinkErrorException e) async 
          print('onLinkError');
          print(e.message);
        
      );
      
      final PendingDynamicLinkData data = 
        await FirebaseDynamicLinks.instance.getInitialLink();
      final Uri deepLink = data?.link;

      if (deepLink != null) 
        Navigator.pushNamed(context, deepLink.path);
      
    
  @override
  Widget build(BuildContext context) 
   return MaterialApp(...)

当我点击电子邮件的链接时,应用程序无法启动,浏览器也无法启动。这是发生了什么:

它尝试在浏览器上启动某些东西,但随后又回到 gmail。

但是,如果我在桌面浏览器中单击该链接,它可以正常工作,电子邮件已通过验证。

我很难理解这是怎么回事。我做事的方式有问题吗?

【问题讨论】:

除此电子邮件链接外,您是否成功处理了应用中的动态链接?还是所有动态链接都不能在手机上使用? 我不知道,这是我尝试实现的第一个:/ 您使用什么版本的动态链接,以便更好地帮助您? 你的意思是包的版本?最后一个^0.8.0 我发布了一个带有工作代码的答案,请检查一下,如果它解决了您的问题,请告诉我。 【参考方案1】:

您应该根据文档编写一个函数来处理您的动态链接,这在当前正在使用的应用程序中对我有用:

void handleDynamicLinks() async 
    ///To bring INTO FOREGROUND FROM DYNAMIC LINK.
    FirebaseDynamicLinks.instance.onLink(
      onSuccess: (PendingDynamicLinkData dynamicLinkData) async 
        await _handleDeepLink(dynamicLinkData);
      ,
      onError: (OnLinkErrorException e) async 
        print('DynamicLink Failed: $e.message');
        return e.message;
      ,
    );

    final PendingDynamicLinkData data =
        await FirebaseDynamicLinks.instance.getInitialLink();
    _handleDeepLink(data);
  

  // bool _deeplink = true;
  _handleDeepLink(PendingDynamicLinkData data) async 
  
     final Uri? deeplink = data.link;
    if (deeplink != null) 
      print('Handling Deep Link | deepLink: $deeplink');
  

在initState中:

@override
  void initState() 
    handleDynamicLinks();
    super.initState();

在您的主页中编写此逻辑。不在void(main..etc) 但是在那之后的第一个小部件中,它应该可以工作。

另外,一定要仔细检查你的包名,即com.example.yourAwesomeApp123,它让整个系统知道当动态链接被按下时要打开什么应用程序。

【讨论】:

所以,与我所拥有的相比,您所做的是:1)摆脱WidgetsBindingObserver,我在应用程序暂停时使用它来运行代码,但没关系,它是一样的. 2) 在方法中重构onSuccess 的内容,而不是将代码直接放入其中(技术上应该是相同的,不是吗?)我尝试了这些修改,但不幸的是,问题仍然相同。该应用程序未启动:/ 您是如何生成动态链接的?遵循从您的代码生成它的文档,而不是 firebase 控制台。这可能意味着链接有问题,如果不尝试以编程方式进行,我们无法排除。 嗯,我只是跟着官方文档firebase.flutter.dev/docs/auth/usage/#open-link-in-app 这意味着您的应用程序包或包名称未添加到动态链接中。这是设备知道要启动什么应用的唯一方法。 经过进一步调查,您似乎是对的,包名不正确,出于某种原因,我还补充说:github.com/FirebaseExtended/flutterfire/issues/… 您能否更新您对未来人们的回应问题?

以上是关于Flutter:动态链接未启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

冷启动 iOS 14 时未处理 iOS Firebase 动态链接

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

未启动应用程序时 Firebase 动态链接不起作用

Flutter 动态更改应用程序启动图标

如何区分 Firebase 动态链接的启动和安装?

Flutter 实时跟踪