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

如何解决Flutter:动态链接未启动应用程序

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

然后,我使用 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(...)
}

当我点击电子邮件的链接时,应用程序和浏览器都不会启动。这是发生的事情:

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

并在 initState 中:

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

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

另外,请务必仔细检查您的软件包名称,即 com.example.yourAwesomeApp123,它可以让整个系统知道在按下动态链接时要打开哪个应用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?