Universal Link 打开错误的包 ID

Universal Link opens wrong bundle ID

背景:

我遇到了这个疯狂的问题,不仅我的通用 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.htmldetails 数组应该按顺序求值,并在找到匹配项后停止。

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.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 之前,这从来都不是问题。但是,现在很明显某些功能需要这个确切的设置,如下所述:

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

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

其他解决方案,以防您使用多个目标和多个 Firebase 项目。

  1. 分别为 target 和
  2. 创建授权文件
  3. 在 Firbase 控制台中创建不同的 Deep link。
  4. 从 Firebase 控制台使用 App_code 更新授权文件 -> Associated_Domain 名称。

就是这样。使用不同的 app_code 生成 link 表格。它将启动受尊重的应用程序。