Firebase 动态链接仅适用于模拟器 |扑

Posted

技术标签:

【中文标题】Firebase 动态链接仅适用于模拟器 |扑【英文标题】:Firebase Dynamic links only works on emulator | FLUTTER 【发布时间】:2021-06-02 04:30:30 【问题描述】:

我正在创建一个动态链接以将我导航到指定页面,在模拟器上尝试时它工作正常,但在实际设备上尝试时,该链接仅打开应用程序

创建动态链接

Future<void> createDynamicLink(bool short, int lecID, String lecName) async
    setState(() 
      _isCreatingLink = true;
    );
    final DynamicLinkParameters parameters = DynamicLinkParameters(
        uriPrefix: 'https://geneapp.page.link',
        link: Uri.parse('https://www.geneapp.com/lecture?lecID=$lecID&lecName=$lecName'),
        androidParameters: AndroidParameters(packageName: 'com.example.teams',minimumVersion: 0),
        dynamicLinkParametersOptions: DynamicLinkParametersOptions(
            shortDynamicLinkPathLength: ShortDynamicLinkPathLength.short
        ),
        socialMetaTagParameters: SocialMetaTagParameters(
            title: "$lecName",
            description: "new"
        )
    );
    print("https://geneapp.page.link/lecture?lecID=$lecID&lecName=$lecName");
    Uri url;
    if (short) 
      final ShortDynamicLink shortLink = await parameters.buildShortLink();
      url = shortLink.shortUrl;
     else 
      url = await parameters.buildUrl();
    

    setState(() 
      _linkMessage = url.toString();
      _isCreatingLink = false;
    );
    print(url);
    Clipboard.setData(new ClipboardData(text: '$url'));
    FocusScope.of(context).requestFocus(new FocusNode());
    scaffoldKey.currentState?.removeCurrentSnackBar();
    scaffoldKey.currentState.showSnackBar(new SnackBar(
      content: new Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          Text("copied",style: TextStyle(fontSize: 16)),
          Padding(
            padding: EdgeInsets.fromLTRB(10.0,0.0,0.0,0.0),
            child: Icon(Icons.check_circle,color: Colors.grey,),
          )
        ],
      ),
      backgroundColor: Colors.green,
      duration: Duration(seconds: 3),
    ));
  

处理深层链接:

void initDynamicLinks() async
    FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLink) async 
          final Uri deepLink = dynamicLink?.link;
          if (deepLink != null) 
            var isLec = deepLink.pathSegments.contains('lecture');
            if(isLec)
              var lecName = deepLink.queryParameters['lecName'];
              var lecID = int.parse(deepLink.queryParameters['lecID']);
              print("initDynamicLinks | lecName : $lecName lecID : $lecID");
              await _openPDF(lecName, lecID);
            
          
          else
            print('its null');
        , onError: (OnLinkErrorException e) async 
      print('onLinkError');
      print(e.message);
    );
    final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
    final Uri deeplink = data?.link;
    if(deeplink != null)
      var lecName = deeplink.queryParameters['lecName'];
      var lecID = int.parse(deeplink.queryParameters['lecID']);
      print("initDynamicLinks | lecName : $lecName lecID : $lecID");
      await _openPDF(lecName, lecID);
    
  

_openPDF(String lecName, int lecID) async
    final filename = lecName;
    String dir = (await getApplicationDocumentsDirectory()).path;
    if (await File('$dir/$filename').exists())
      navigatorKey.currentState.pushNamed('/pdf', arguments: '$dir/$filename');
    
    else
 
    //..
//
      navigatorKey.currentState.pushNamed('/pdf', arguments: '$dir/$filename');
    
  

在我的主要构建功能中,我将 initialRoute 设置为启动画面, 然后在我的初始屏幕 initstate 我调用 initDynamicLinks():

【问题讨论】:

【参考方案1】:

应用无法启动可能有多种原因,您使用的 android 设备,用于启动链接的浏览器(如果将链接复制粘贴到 chrome 中它们不起作用),DynamicLinks 设置。

你可以尝试一些事情

    在长 URL 中编码您的 lecName 变量。 通过消息发送动态短链接并尝试点击并启动应用程序。

【讨论】:

感谢您的回复。我最终弄清楚了,这是因为我的国家没有firebase。所以这是因为我在笔记本电脑和模拟器上使用 ***,而不是在移动设备上使用它。

以上是关于Firebase 动态链接仅适用于模拟器 |扑的主要内容,如果未能解决你的问题,请参考以下文章

适用于 iOS 的 Firebase 动态链接 - 查询参数未从 iTunes Store 传递

Firebase 动态链接不适用于发布版本

Android Firebase 动态链接字符长度

测试未发布应用的 Firebase 动态链接

仅使用动态链接时如何防止firebase数据库停用

Cloud Firestore 不仅适用于 iOS |扑