[英]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 动态链接,我是否必须为同一个应用程序创建一个单独的项目?
Firebase 动态链接不支持对包含在同一 Firebase 项目中的多个 iOS 应用/目标使用相同的网址前缀。 不过有多种解决方法:
如果每个 iOS 应用程序都使用自己的(子)域进行动态链接,则它会起作用。 例如,不要将pets.page.link
用于所有目标, cats.page.link
将cats.page.link
用于您的第一个应用程序目标,并将dogs.page.link
用于您的第二个应用程序目标。 对此的关键要求是您的目标的每个Associated Domains Entitlement
仅包含它应该侦听的(子)域。
就我个人而言,我正在使用这个解决方案,它工作得很好。
如果您坚持对所有目标使用相同的域,您应该能够通过使用自定义域以及一些额外的工作来解决这个问题。
按照 官方文档设置像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
将其配置为您的需要,即仅将特定路径重定向到每个目标,而不是将所有路径匹配到所有目标。
免责声明:我还没有测试过这种方法,因为在我的情况下它不值得额外的工作。
当然,您可以简单地为每个目标创建一个新的 Firebase 项目。 您不能在多个项目中使用相同的(子)域,因此您被迫隐式实施解决方案 1。
在 Android 上,所需的assetlinks.json
文件映射完整域,包括指向 Android 应用程序(或风格)列表的所有路径。 特定应用程序是否支持特定链接由您通过在 Android 清单文件中本地路由所需路径来确定。
在 iOS 上,情况正好相反:所需的apple-app-site-association
文件确定哪些路径与哪些应用程序匹配。 不幸的是,当使用 Firebase 动态链接时,您不负责此文件,Firebase 只是将 URL 的所有路径与 Firebase 项目中包含的所有应用程序进行匹配。 在本地,您只能配置 iOS 应用程序的Associated Domains Entitlement
。 然而,后者只处理包括所有路径的完整域。
不幸的是,官方文档中没有提到这个限制。 然而,它已经被证实,例如这里或这里。 如第一个链接中所述,他们曾经计划添加此功能,但看起来他们仍然没有。 我会联系支持人员要求更新并要求他们至少向文档添加适当的提示。
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.