Flutter:动态 Link 未启动应用程序

Flutter : Dynamic Link not launching the app

我正在使用 firebase 动态 links 在我的应用程序中打开电子邮件验证 link,但不幸的是 link 在点击时没有启动应用程序。

到目前为止我做了什么

创建新用户时,会通过电子邮件发送 link 以供验证:

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 :

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

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(...)
}

当我点击电子邮件的 link 时,应用程序和浏览器都没有启动。事情是这样的:

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

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

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

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

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,这是让整个系统知道在按下动态 link 时要打开的应用程序的原因。