6
NSString *identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

上面的代码在我的两个应用程序中在同一部手机上提供了两个不同的标识符 - 不同的捆绑 ID,但在我的 Apple 帐户上创建了两个 App ID 和两个开发配置文件。

我的理解是,如果团队 ID 相同,那么这两个应用程序中的供应商标识符应该相同。错误在哪里?我不明白什么? 第一个应用

第二个应用

4

3 回答 3

6

我现在正在解决同样的问题。“答案”是 identifierForVendor 根据 Apple 文档中的预期设计被破坏:

捆绑 ID 假定为反向 DNS 格式,前两个组件用于生成供应商 ID。例如,com.example.app1 和 com.example.app2 似乎具有相同的供应商 ID。

实际情况是 identifierForVendor 仅对于使用相同配置文件和签名证书的应用程序是相同的。例如,我的企业环境中有多个应用程序,所有这些应用程序都是 com.mycompany..

identifierForVendor 对于使用 bundleID com.mycompany.app1.* 及其配置文件的应用程序是相同的,但是 com.mycompany.app2 使用相同的签名证书但不同的配置文件会产生不同的 identifierForVendor 值。

编辑:这仅在 iOS7 中发生,但在 iOS6 中运行良好。我昨天测试了一段时间,可以在 7 天内重复该问题,但在 6 天内我得到了预期的结果。

EDIT2: Apple 已将目标帖子移至 identifierForVendor 上。他们显然发现了他们的算法问题,而不是解决问题,而是通过更改文档更改了 iOS 版本之间的标识符功能。更新的文档链接如下。SMH。

供应商标识符

于 2014-01-14T20:45:26.730 回答
4

供应商不是由团队 ID 决定的,而是由以下任一决定:

  • App Store 提供的数据(如果是从 App Store 下载的)
  • 捆绑包 ID 的一部分(如果使用任何其他方式部署)

这取决于设备运行的是 iOS 6 还是 7+。

根据-[UIDevice identifierForVendor]文档:

通常,供应商由 App Store 提供的数据确定。如果应用程序不是从应用程序商店安装的(例如企业应用程序和仍在开发中的应用程序),则会根据应用程序的捆绑 ID 计算供应商标识符。捆绑 ID 假定为反向 DNS 格式。

在 iOS 6 上,bundle ID 的前两个组件用于生成供应商 ID。如果捆绑包 ID 只有一个组件,则使用整个捆绑包 ID。

在 IOS 7 上,捆绑包的所有组件(最后一个组件除外)都用于生成供应商 ID。如果捆绑包 ID 只有一个组件,则使用整个捆绑包 ID。

于 2014-11-14T13:38:22.200 回答
2

这是因为您有 2 个不同的捆绑包 ID。

供应商由前两个点分隔字段标识。所以 com.a.app1 和 com.a.app2 有相同的供应商 (com.a) 但 com.b.app3 有不同的供应商 (com.b)

于 2013-06-26T06:07:07.320 回答