Universal Link 打开错误的包 ID
Universal Link opens wrong bundle ID
背景:
- 我们的应用程序使用不同的包 ID 进行开发构建、测试版构建和生产(App Store)构建
- 我目前正在我们的开发版本中实施通用 Links
- 我们目前在 App Store 中的生产版本不支持通用 Links
我遇到了这个疯狂的问题,不仅我的通用 Links 没有打开应用程序的开发版本,他们正在启动生产版本,尽管生产版本没有拥有适当的权利.
我的 apple-app-site-association
文件已使用 https://branch.io/resources/universal-links/ and https://search.developer.apple.com/appsearch-validation-tool/ 进行了验证,看起来像这样:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "DY74R9XXXX.com.myapp.consumer.debug",
"paths": [ "/profiles/*", "/messages/*"]
},
{
"appID": "DY74R9XXXX.com.myapp.consumer",
"paths": [ "/profiles/*", "/messages/*"]
}
]
}
}
根据 https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html,details
数组应该按顺序求值,并在找到匹配项后停止。
The order of the dictionaries in the array determines the order the
system follows when looking for a match, so you can specify an app to
handle a particular part of your website.
目的是相同的 Universal Link 将为我团队中的任何人加载开发版本,并为没有 .debug
软件包的最终用户加载生产版本在他们的 phone.
这不仅不起作用,而且如前所述,通用 Links 总是加载生产版本,即使生产版本缺少指向我的 applinks:dev.myserver.com
权利 [=12] =] 文件。这看起来很疯狂,但这意味着我可以启动我没有发布的任意包,并且不强制执行权利文件。
此外,如果我从 details
数组中删除第二个条目并只保留调试版本的字典,通用 Links 将无法工作,而是打开 Safari。切换数组的顺序也没有效果。我在 9.3 和 9.3.1 的 iPhone 6s 上都遇到过这种行为。非常感谢关于这两个问题的任何建议(启动错误的包,并且在它是唯一条目时不启动调试包)!
这不是缓存问题 - 更新后的解决方案如下
原答案:
根据 Alex Bauer 的建议,在第三层将我的包 ID 更改为不同的内容后,我能够使链接正常工作。然后我将我的包 ID 改回 com.myapp.consumer.debug
,它们继续工作。所以这可能是 swcd
服务的一个奇怪的缓存相关错误。但是,如果我将 DY74R9XXXX.com.myapp.consumer
条目移动到数组中的第一个位置,它将继续启动消费者版本,即使它缺少权利。这似乎是与四级捆绑包 ID 和不正确匹配相关的潜在独立或附加错误。
Updated/Correct 解决方案
更改包 ID 然后再将其改回实际上解决了问题,因为它修改了我的 Info.plist
和 project.pbxproj
文件。当我查看差异时,真正的问题变得显而易见。我们之前通过 Info.plist
:
中的这个值设置我们的包 ID
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)${BUNDLE_ID_SUFFIX}</string>
在我们的 project.pbxproj
中有一个静态的 PRODUCT_BUNDLE_IDENTIFIER
。这是基于先前发布的多个 env 构建的常见做法。但是,在 XCode 7 中,Apple 强烈建议升级设置,以便 Info.plist
始终包含:
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
在使用正确的包名称构建和提交到 iTunes 之前,这从来都不是问题。但是,现在很明显某些功能需要这个确切的设置,如下所述:
我通过 XCode 为每个构建类型设置产品包 ID,如 所示
现在一切正常。
TL;DR - 通用链接针对您的 PRODUCT_BUNDLE_IDENTIFIER,不是你的 CFBundleIdentifier。如果您的 PRODUCT_BUNDLE_IDENTIFIER 与包裹的最终捆绑包 ID 不匹配,通用链接将无法正常工作。
其他解决方案,以防您使用多个目标和多个 Firebase 项目。
- 分别为 target 和
创建授权文件
- 在 Firbase 控制台中创建不同的 Deep link。
- 从 Firebase 控制台使用 App_code 更新授权文件 -> Associated_Domain 名称。
就是这样。使用不同的 app_code 生成 link 表格。它将启动受尊重的应用程序。
背景:
- 我们的应用程序使用不同的包 ID 进行开发构建、测试版构建和生产(App Store)构建
- 我目前正在我们的开发版本中实施通用 Links
- 我们目前在 App Store 中的生产版本不支持通用 Links
我遇到了这个疯狂的问题,不仅我的通用 Links 没有打开应用程序的开发版本,他们正在启动生产版本,尽管生产版本没有拥有适当的权利.
我的 apple-app-site-association
文件已使用 https://branch.io/resources/universal-links/ and https://search.developer.apple.com/appsearch-validation-tool/ 进行了验证,看起来像这样:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "DY74R9XXXX.com.myapp.consumer.debug",
"paths": [ "/profiles/*", "/messages/*"]
},
{
"appID": "DY74R9XXXX.com.myapp.consumer",
"paths": [ "/profiles/*", "/messages/*"]
}
]
}
}
根据 https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html,details
数组应该按顺序求值,并在找到匹配项后停止。
The order of the dictionaries in the array determines the order the system follows when looking for a match, so you can specify an app to handle a particular part of your website.
目的是相同的 Universal Link 将为我团队中的任何人加载开发版本,并为没有 .debug
软件包的最终用户加载生产版本在他们的 phone.
这不仅不起作用,而且如前所述,通用 Links 总是加载生产版本,即使生产版本缺少指向我的 applinks:dev.myserver.com
权利 [=12] =] 文件。这看起来很疯狂,但这意味着我可以启动我没有发布的任意包,并且不强制执行权利文件。
此外,如果我从 details
数组中删除第二个条目并只保留调试版本的字典,通用 Links 将无法工作,而是打开 Safari。切换数组的顺序也没有效果。我在 9.3 和 9.3.1 的 iPhone 6s 上都遇到过这种行为。非常感谢关于这两个问题的任何建议(启动错误的包,并且在它是唯一条目时不启动调试包)!
这不是缓存问题 - 更新后的解决方案如下
原答案:
根据 Alex Bauer 的建议,在第三层将我的包 ID 更改为不同的内容后,我能够使链接正常工作。然后我将我的包 ID 改回 com.myapp.consumer.debug
,它们继续工作。所以这可能是 swcd
服务的一个奇怪的缓存相关错误。但是,如果我将 DY74R9XXXX.com.myapp.consumer
条目移动到数组中的第一个位置,它将继续启动消费者版本,即使它缺少权利。这似乎是与四级捆绑包 ID 和不正确匹配相关的潜在独立或附加错误。
Updated/Correct 解决方案
更改包 ID 然后再将其改回实际上解决了问题,因为它修改了我的 Info.plist
和 project.pbxproj
文件。当我查看差异时,真正的问题变得显而易见。我们之前通过 Info.plist
:
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)${BUNDLE_ID_SUFFIX}</string>
在我们的 project.pbxproj
中有一个静态的 PRODUCT_BUNDLE_IDENTIFIER
。这是基于先前发布的多个 env 构建的常见做法。但是,在 XCode 7 中,Apple 强烈建议升级设置,以便 Info.plist
始终包含:
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
在使用正确的包名称构建和提交到 iTunes 之前,这从来都不是问题。但是,现在很明显某些功能需要这个确切的设置,如下所述:
我通过 XCode 为每个构建类型设置产品包 ID,如
TL;DR - 通用链接针对您的 PRODUCT_BUNDLE_IDENTIFIER,不是你的 CFBundleIdentifier。如果您的 PRODUCT_BUNDLE_IDENTIFIER 与包裹的最终捆绑包 ID 不匹配,通用链接将无法正常工作。
其他解决方案,以防您使用多个目标和多个 Firebase 项目。
- 分别为 target 和 创建授权文件
- 在 Firbase 控制台中创建不同的 Deep link。
- 从 Firebase 控制台使用 App_code 更新授权文件 -> Associated_Domain 名称。
就是这样。使用不同的 app_code 生成 link 表格。它将启动受尊重的应用程序。