【问题标题】:Universal Link opens wrong bundle ID通用链接打开错误的捆绑 ID
【发布时间】:2016-08-11 00:44:34
【问题描述】:

背景:

  • 我们的应用在开发版本、测试版本和生产(App Store)版本中使用不同的捆绑包 ID
  • 我目前正在我们的开发版本中实现通用链接
  • 我们目前在 App Store 中的生产版本不支持通用链接

我遇到了这个疯狂的问题,我的通用链接不仅没有打开应用程序的开发版本,而是在启动生产版本,尽管生产版本没有适当的权利

我的apple-app-site-association 文件已使用https://branch.io/resources/universal-links/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.htmldetails 数组应按顺序求值,并在找到匹配项后停止。

数组中字典的顺序决定了字典的顺序 系统在寻找匹配时跟随,因此您可以指定一个应用程序 处理您网站的特定部分。

我们的目的是在开发版本中为我团队中的任何人加载相同的通用链接,在生产版本中为手机上没有.debug 包的最终用户加载。

这不仅不起作用,而且如上所述,通用链接始终加载生产版本,即使生产版本缺少指向我 apple-app-site-association 文件的 applinks:dev.myserver.com 权利。这看起来很疯狂,但这意味着我可以启动我没有发布的任意包并且权利文件没有被强制执行。

此外,如果我从 details 数组中删除第二个条目,只保留调试版本的字典,通用链接将无法工作,而是打开 Safari。切换数组的顺序也没有效果。我在 9.3 和 9.3.1 的 iPhone 6s 上都经历过这种行为。非常感谢关于这两个问题的任何建议(启动错误的包,并且在它是唯一条目时不启动调试包)!

【问题讨论】:

  • 这看起来很奇怪,听起来 iOS 在某种程度上将DY74R9XXXX.com.myapp.consumer.debugDY74R9XXXX.com.myapp.consumer 之间的权利混为一谈,也许是因为它们非常相似。这绝对没有记录在任何地方。您能否尝试将调试版本的捆绑 ID 更改为明确不同的内容?
  • @AlexBauer 您似乎对权利由于相似性而感到困惑,但这并不能解释为什么它不适用于仅一个详细信息条目。但是,根据您的建议,我将捆绑 ID 更改为 com.myapp.dev 并且它起作用了。然后我将其更改为com.myapp.dev.dev,这同样有效(我担心一个具有 4 个级别标识符的错误与典型的 3 个级别标识符相比)。对后续步骤有何建议?
  • apple-app-site-association 文件仅在安装应用程序时被拉取。假设这实际上是一个缓存问题,我认为您每次都必须删除 both 应用程序构建以获得干净的测试。如果您只是删除并重新安装其中一个,我可以看到这将如何导致这些挥之不去的问题。
  • @AlexBauer 我找到了确切的原因,它不是缓存。请参阅下面的更新答案。感谢您的所有帮助!
  • 太棒了。感谢您的更新!

标签: ios ios9 deep-linking ios-universal-links


【解决方案1】:

这不是缓存问题 - 下面更新了解决方案

原答案:

根据 Alex Bauer 的建议,在第三级将我的捆绑 ID 更改为不同的 ID 后,我能够使链接正常工作。然后我将我的捆绑 ID 改回com.myapp.consumer.debug,他们继续工作。所以这可能是swcd 服务的一个奇怪的缓存相关错误。但是,如果我将 DY74R9XXXX.com.myapp.consumer 条目移动到数组中的第一个位置,它将继续启动消费者版本,即使它缺少权利。这似乎是与四级捆绑包 ID 和不正确匹配相关的潜在单独或附加错误。

更新/正确的解决方案

更改捆绑 ID 然后将其改回实际上解决了问题,因为它修改了我的 Info.plistproject.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 之前,这从来都不是问题。但是,现在很明显,某些功能需要这种精确设置,如下所述:Use Bundle Identifier instead of Product Bundle Identifier with Xcode 7

我通过 XCode 为每个构建类型设置产品捆绑 ID,如 here 所示 现在一切正常。

TL;DR - 通用链接针对您的 PRODUCT_BUNDLE_IDENTIFIER不是您的 CFBundleIdentifier。如果您的 PRODUCT_BUNDLE_IDENTIFIER 与您的包的最终捆绑 ID 不匹配,通用链接将无法正常工作。

【讨论】:

  • 感谢突出问题。我尝试通过更改 PRODUCT_BUNDLE_IDENTIFIER 来修复,但它给出了错误:为参数“appIdName”提供了无效值“XC $CB_APP_ID”。配置文件“iOS 团队配置文件:*”不支持关联域功能。配置文件“iOS 团队配置文件:*”不包括 com.apple.developer.associated-domains 权利。 SDK“iOS 10.0”中的产品类型“应用程序”需要代码签名您能检查一下吗?
【解决方案2】:

如果您正在处理多个目标和多个 Firebase 项目的其他解决方案。

  1. 分别为目标和
  2. 创建授权文件
  3. 在 Firbase 控制台中创建不同的深层链接。
  4. 使用 Firebase 控制台中的 App_code 更新权利文件 -> Associated_Domain 名称。

就是这样。使用不同的 app_code 生成链接表单。它将启动受人尊敬的应用程序。

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多