繁体   English   中英

Firebase 动态链接不适用于 iOS 中同一项目中的不同目标

[英]Firebase Dynamic-Links is not working for different target in same project in iOS

Android 和 iOS 的 Firebase 动态链接的行为是否不同? 如何为 iOS 中的不同目标实现同一项目的 Firebase 动态链接?

在 Android 中,Firebase 动态链接适用于不同的风格,但在 iOS 中,Firebase 动态链接不适用于不同的目标。

对于 iOS,对于具有不同目标的同一项目,我必须为 Firebase Dynamic-Links with Firebase 实施什么?

Android 和 iOS 的 Firebase 动态链接行为不同的实际原因是什么? 要为不同的目标实施 Firebase 动态链接,我是否必须为同一个应用程序创建一个单独的项目?

TLDR

Firebase 动态链接不支持对包含在同一 Firebase 项目中的多个 iOS 应用/目标使用相同的网址前缀。 不过有多种解决方法:


解决方案 1:使用多个(子)域

如果每个 iOS 应用程序都使用自己的(子)域进行动态链接,则它会起作用。 例如,不要将pets.page.link用于所有目标, cats.page.linkcats.page.link用于您的第一个应用程序目标,并将dogs.page.link用于您的第二个应用程序目标。 对此的关键要求是您的目标的每个Associated Domains Entitlement仅包含它应该侦听的(子)域。

就我个人而言,我正在使用这个解决方案,它工作得很好。

解决方案 2:使用自定义域

如果您坚持对所有目标使用相同的域,您应该能够通过使用自定义域以及一些额外的工作来解决这个问题。

按照 官方文档设置像my-own-fancy-pet-app.com这样的自定义域,而不是使用 Firebase 本机提供的任何 URL 前缀(如pets.page.link )。

创建firebase.json文件时,不要使用建议的"appAssociation": "AUTO",选项,而是将其设置为NONE 这将阻止 Firebase 自动创建有问题的apple-app-site-association文件(以及assetlinks.json )。 改用 Firebase 托管来提供手动创建的版本。 然后,您可以使用apple-app-site-association将其配置为您的需要,即仅将特定路径重定向到每个目标,而不是将所有路径匹配到所有目标。

免责声明:我还没有测试过这种方法,因为在我的情况下它不值得额外的工作。

解决方案 3:使用多个 Firebase 项目

当然,您可以简单地为每个目标创建一个新的 Firebase 项目。 您不能在多个项目中使用相同的(子)域,因此您被迫隐式实施解决方案 1。


背景

为什么它适用于 Android 而不适用于 iOS?

在 Android 上,所需的assetlinks.json文件映射完整域,包括指向 Android 应用程序(或风格)列表的所有路径。 特定应用程序是否支持特定链接由通过在 Android 清单文件中本地路由所需路径来确定。

在 iOS 上,情况正好相反:所需的apple-app-site-association文件确定哪些路径与哪些应用程序匹配。 不幸的是,当使用 Firebase 动态链接时,您不负责此文件,Firebase 只是将 URL 的所有路径与 Firebase 项目中包含的所有应用程序进行匹配。 在本地,您只能配置 iOS 应用程序的Associated Domains Entitlement 然而,后者只处理包括所有路径的完整域。

Firebase 动态链接限制

不幸的是,官方文档中没有提到这个限制。 然而,它已经被证实,例如这里这里 如第一个链接中所述,他们曾经计划添加此功能,但看起来他们仍然没有。 我会联系支持人员要求更新并要求他们至少向文档添加适当的提示。


PS:我知道这是一个很老的问题,在问的时候情况可能有点不同。 尽管如此,今天仍然是一个问题。

@VishalPatoliyaツ 我向 Firebase 开发人员询问了这件事,他们说这个功能不在他们的待办事项列表中)并提议提出请求以支持为什么需要这种可能性。 也许它有时会实施......

...虽然通用链接有多个应用程序支持。 在这里您可以了解它是如何工作的: 在支持通用链接的两个不同应用程序上支持同一个域..?

对于深层链接,您将使用应用程序的包标识符。 您的其他目标将具有不同的标识符。 在 Info.plist 中使用 UIApplicationShortcutItems 并在相应的 plist 文件中为您的深层链接衬衫剪裁添加条目。

如果您希望它们获得不同的应用程序域,则需要在 Firebase 中为每个目标创建一个不同的项目。 如果不这样做,则无法通过 iOS 的通用链接系统区分它们。

这意味着您不能创建包含多个应用程序的单个项目。

通过覆盖默认的apple-app-site-association可以使用相同的 自定义域

firebase.json中设置 http 标头。

{
  "hosting": {
    "appAssociation": "AUTO",
    "public": "public",
    "ignore": ["firebase.json"],
    "rewrites": [{ "source": "/**", "dynamicLinks": true }],
    "headers": [
      {
        "source": "/.well-known/apple-app-site-association",
        "headers": [{ "key": "Content-Type", "value": "application/json" }]
      },
      {
        "source": "/apple-app-site-association",
        "headers": [{ "key": "Content-Type", "value": "application/json" }]
      }
    ]
  }
}

创建public/apple-app-site-association (上面的配置假定文件将在public文件夹中;根据需要进行修改)。 isi是 Apple Store 数字应用程序 ID。

{
  "applinks": {
    "details": [
      {
        "appIDs": ["ABCDEF1234.com.example.foo"],
        "components": [{ "?": { "isi": "112233" } }]
      },
      {
        "appIDs": ["ABCDEF1234.com.example.bar"],
        "components": [{ "?": { "isi": "445566" } }]
      }
    ]
  }
}

创建指向public/apple-app-site-association符号链接public/.well-known/apple-app-site-association -site-association (或只是复制文件)。

使用 firebase cli firebase deploy --only hosting进行部署。 可能会立即在开发中工作,但 Apple 警告缓存可能会导致这需要一周的生产时间。


上面的配置假设 手动构建动态链接 使用干净的链接需要不同的模式匹配器。 例如,如果https://apps.example.com/foo/clean-link应该启动com.example.foo并且https://apps.example.com/bar/clean-link应该启动com.example.bar ,分别添加到"components"数组{ "/": "/foo/*" }{ "/": "/bar/*" } 这些技术可以结合起来支持这两个用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM