firebase - flutter : Dynamic Link not launching the app

标签 firebase flutter dart firebase-dynamic-links

我正在使用 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 :

enter image description here

然后,我在我的 main.dart 文件中处理链接的接收,使用 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(...)
}

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

enter image description here

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

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

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

最佳答案

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

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');
  }
}

在初始化状态中:

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

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

此外,请务必仔细检查您的包名称,即 com.example.yourAwesomeApp123,这是让整个系统知道在按下动态链接时要打开哪个应用程序的原因。

关于firebase - flutter : Dynamic Link not launching the app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839446/

相关文章:

iOS:在调用 reloadRowsAtIndexPaths 时,didEndDisplayingCell 被调用两次

ios - 错误 : Use of undeclared identifier 'SSL_get_secure_renegotiation_support' ; did you mean 'GRPC_SHADOW_SSL_get_secure_renegotiation_support' ?

flutter - 制作新小部件后清除类(class)列表

选择时 Flutter TextField 更改图标颜色

dart - 如何在 Flutter 中裁剪图像?

firebase - Firestore - 授予对子集合的访问权限也会授予对父集合的访问权限?

android - Flutter - 可以在 Flutter 应用程序中导入 fragment 吗?

如果不创建则 Flutter Firestore 更新(如果存在)

flutter - 如何在 Windows 上以 HTML 格式查看 flutter/dart 的覆盖率报告

android - 上传到数据库时 Firebase 存储出错