有没有办法将 Expo 应用程序与 firebase 动态链接集成而无需分离?

Posted

技术标签:

【中文标题】有没有办法将 Expo 应用程序与 firebase 动态链接集成而无需分离?【英文标题】:Is there a way to integrate an Expo app with firebase dynamic links without detaching? 【发布时间】:2020-06-16 18:17:01 【问题描述】:

有没有办法在不分离的情况下将 Expo 应用与 Firebase 动态链接集成。

【问题讨论】:

任何尝试创建通用链接的人 - germavinsmoke.hashnode.dev/… 【参考方案1】:

如果您需要动态创建新的动态链接,您可以使用REST API 来完成。在更可能的情况下,您只需要您的应用打开 Firebase 的动态链接,除了配置您的 Expo 应用来处理通用链接(即:使用 http/ 的深层链接)之外,您不需要做任何事情https)。

清单是这样的:

1。配置你的 app.json

对于 android,将 intentFilters 属性添加到您的 android 属性中:

"android": 
  "intentFilters": [
    
      "action": "VIEW",
      "data": [
        
          "scheme": "https",
          "host": "<your-domain>",
          "pathPrefix": "/"
        ,
      ],
      "category": [
        "BROWSABLE",
        "DEFAULT"
      ]
    
  
]

对于 ios,将 associatedDomains 属性添加到 ios

"ios": 
  "associatedDomains": ["applinks:<your-domain>"]

2。配置您的域以允许应用处理来自该域的链接

如果您从特定位置提供配置文件,Android 和 iOS 将允许您的应用从您的域打开链接:

安卓:https://&lt;your-domain&gt;/.well-known/assetlinks.json

iOS:https://&lt;your-domain&gt;/.well-known/apple-app-site-association

assetlinks.json 看起来像这样:

[
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": 
    "namespace": "android_app",
    "package_name": "<android-package-name>",
    "sha256_cert_fingerprints":
    ["<your-sha256-certificate-fingerprints>"]
  
]

apple-app-site-association 是这样的:


    "applinks": 
        "apps": [],
        "details": [
            
                "appID": "<your-team-id>.<ios-bundle-identifier>",
                "paths": [ "*" ]
            
        ]
    

您可以阅读有关这些文件的更多信息 here 和 here。

要获取应用签名证书的 SHA256 指纹,您可以使用 keytool:

keytool -list -v -keystore <your-key-file>

在您输入密钥库密码后,它将打印许多密钥库信息,包括 SHA256 指纹。

如果您的网站托管在 Firebase 上,如果您在 Firebase 的项目中创建应用程序,则可以自动生成 assetlinks.jsonapple-app-site-association。否则,只需将这些文件放在域的根目录中即可。

3。创建 Firebase 动态链接

我认为这一步主要是不言自明的,但只是一些注意事项:

    设置您的短 URL 链接:最终您将拥有 / 发送给您的用户 设置您的动态链接:在这里定义您的 deelink(您希望您的应用处理的链接) 为 iOS 定义链接行为:您很可能希望单击“在您的 iOS 应用程序中打开深层链接”并从列表中选择您的应用程序(如果您还没有,请为您项目中的每个平台创建一个应用程序) 为 Android 定义链接行为:与之前相同,但有更多选项可供选择 配置(或不配置)广告系列跟踪就完成了。

请记住,您始终应该通过点击而不是直接在浏览器上输入来测试您的深层链接。例如,您可以在 WhatsApp 上将链接发送给自己或放在一些笔记应用程序上。

其他可能有用的资源:

https://docs.expo.io/versions/latest/workflow/linking/ https://reactnavigation.org/docs/deep-linking/

【讨论】:

我需要有一个 App Store ID 才能使用它吗? 不,只是您的团队 ID 和 App Bundle 标识符。 感谢您的回复!但是,它应该只在你构建一个独立的应用程序时才有效,对吧? 没问题。没错。 很好的答案!我还担心链接打开报告(首先打开并重新打开 Firebase 提供的数据)。你知道报告这些事件的方法吗?我将使用 Google Analytics(分析),但让它正常工作会更好。【参考方案2】:

除了佩德罗·安德拉德的指示:

1.) Firebase 需要在您的应用>项目设置下提供以下详细信息才能使动态链接正常工作。

Android:SHA 256(应用签名密钥证书指纹)- 可以通过play store &gt; your app &gt; App Integrity &gt; SHA 256检索

iOS:应用 ID 前缀(团队 ID):developer.apple.com &gt; Certificates, Identifiers &amp; Profiles &gt; your app id &gt; App ID Prefix

令人惊讶的是,文档中几乎没有提到这些,但在使用谷歌搜索调试预览链接导致的错误时,确实会出现在 *** 结果和其他答案中:

Android app '<bundle id>' lacks SHA256. AppLinks is not enabled for the app. Learn more.
iOS app '<bundle id>' lacks App ID Prefix. UniversalLinks is not enabled for the app. Learn more.

您可以通过将?d=1 添加到动态链接来查看调试预览链接。

https://firebase.google.com/docs/dynamic-links/debug

2.) 即使您使用 firebase 为您的动态链接提供的 page.link 样式域,app.json 中的 associatedDomain/intentFilter 域仍然应该是您的实际域

即,如果您正在生成 my-app.page.link 短链接,它们是指向 my-app.com 的动态链接,您应该在 app.json 中使用 my-app.com

【讨论】:

是我的域mydomain.com 还是将处理链接的子域,即links.mydomain.com?就我而言,我的网站托管在其他地方,我想保持这种状态。为了处理动态链接,我添加了一个子域,即托管在 Firebase 上的 links。所以,我不确定我需要将哪个用于域。目前,我不断收到 401 错误,我正在尝试查看域是否可能是问题的一部分。【参考方案3】:

Pedro Andrade 的解决方案有效!部分...

解释:

    您必须NOT在intentFilters和relatedDomains中添加您的动态链接域,因为它使应用程序直接在应用程序中打开链接,因此,动态链接不被处理并且您不有权访问由动态链接生成的链接。 部分原因在于:动态链接需要先由浏览器(chrome 或 safari)打开,然后才能在应用中打开。

示例:在浏览器中打开"&lt;your-domain&gt;.page.link/XLSj",浏览器将指向生成的链接:"&lt;your-domain&gt;.com/params/54" 指向配置的深层链接。

我不知道在托管工作流中通过 expo“读取”动态链接的任何其他方式。

【讨论】:

以上是关于有没有办法将 Expo 应用程序与 firebase 动态链接集成而无需分离?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在使用 expo 的 react-native 中根据电话语言翻译上下文菜单?

我们如何将 Firebase Analytics 与基于 expo 的 react-native 应用程序一起使用

如何在 expo 应用程序中处理共享意图(发送图像)?

使用 react-native (expo) 切换手电筒

如何将 expo-image-picker 与 android 11 范围存储一起使用?

将 require 与 Typescript 和 Expo 一起使用时出现“无效呼叫”