【问题标题】:Alternative way to create lifetime unique id创建终身唯一ID的替代方法
【发布时间】:2013-04-05 17:54:25
【问题描述】:

我想为 iphone/ipad 设备创建 UDID,该设备将保持不变,请告诉我是否有人对此有想法?

我在 google 和 stack-overflow 上进行了搜索,但没有找到解决方案。

也有人建议使用 OpenUDID 和 CFUUID,但当用户删除并重新安装您的应用时,CFUUID 会有所不同。但我想为每个应用程序使用相同的 UDID,该 UDID 将在第一次生成,并且在每个应用程序的每个设备的生命周期内应保持不变。

【问题讨论】:

  • 认为您可以将应用程序的 ID 添加到设备 ID 并获取其哈希码。我不知道如何在 iThings 上获得固定的设备 ID。

标签: ios udid


【解决方案1】:

编辑 2

由于 iOS 升级以及根据新文档identifierForVendor 不会保留应用重新安装的价值。我在this link 看到了答案。这可能以一种或其他方式有所帮助。请注意,即使系统重置,也只有 UDID 会保留,所以这个答案可能会成为即使在系统重置时寻求终身 UDID 的开发人员的限制。除此之外,提到的答案似乎很有用。

也看summary here


identifierForVendor 可从UIDevice Class Reference. 获得

对于来自 同一供应商在同一设备上运行。

[[UIDevice currentDevice] identifierForVendor].UUIDString

注意: 适用于 iOS 6.0 及更高版本。

EDIT 1根据UIDevice Class Reference的新版本

此属性中的值在应用程序(或其他 来自同一供应商的应用程序)安装在 iOS 设备上。价值 当用户从 设备并随后重新安装其中的一个或多个。因此,如果 您的应用程序将此属性的值存储在任何地方,您应该 优雅地处理标识符发生变化的情况。


编辑

我想让你看到this popular link

1) MAC+CFBundleIdentifier的MD5

[[UIDevice currentDevice] uniqueDeviceIdentifier]

这对于每个应用程序将保持不变,但对于每个应用程序是不同的。如果您删除并重新安装您的应用程序,每个应用程序都将是相同的。

2) MAC的MD5

[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]

对于来自同一设备的所有应用,这将保持不变。如果您删除并重新安装您的应用程序,则每台设备都是相同的。

编辑 3

注意:iOS 7 中的此解决方案不再有用,因为 iOS7 中不再提供 uniqueIdentifier。

【讨论】:

  • :- identifierForVendor 的值不会为该设备的该应用程序更改,对吧?
  • 对于特定的 Vender + App + Device,identifierForVendor 的值永远不会改变。
  • @Bhargavi 我尝试了相同但 ID 保持不变。
  • @sunilz "如果用户更新 ios 和/或安装新的 ios,那么 identifierForVendor 的值会改变还是保持不变?" - 我不确定,但我认为它应该不会因为升级 IOS 版本而受到影响。
  • @Bhargavi 现在苹果已经更改了文档:“在 iOS 设备上安装应用程序(或来自同一供应商的另一个应用程序)时,此属性中的值保持不变。当用户从设备中删除该供应商的所有应用,然后重新安装其中的一个或多个。因此,如果您的应用将此属性的值存储在任何地方,您应该优雅地处理标识符更改的情况。"
【解决方案2】:

第一次生成一个 UUID(也许是使用CFUUIDRef API),并将其存储在钥匙串中。

【讨论】:

  • 如果用户更新 ios 和/或安装新的 ios,那么钥匙串数据是否会被删除?
  • 我想将创建的唯一 id 存储一辈子,可以吗?
  • @sunilz 我知道,我读了你的问题。我的答案就在这里。我不知道你的问题是什么。
  • 是的,但我想确保钥匙串数据是否会重置。
  • @sunilz 您无法绝对确定任何事情。但是钥匙串会以相当高的机会持续存在。
【解决方案3】:

注意 UDID 和 UUID 之间的区别很重要。

UDID“唯一设备 ID”是特定于硬件的。对于特定设备,它永远不会改变。出于这个原因,它已成为一个隐私问题,Apple 正在阻止尝试使用它的应用程序。因此,Apple 生成了一个可选择退出的“设备 ID”哈希,特别是用于广告使用。这个新的 ID 哈希称为 IFA,在 iOS 6.0+ 中可用。

UUID“通用唯一 ID”不是硬件特定的。它是用于标识设备的哈希值;但不是一个绝对值。例如PhoneGap根据设备属性生成UUID;这就是您执行 device.uuid 时得到的结果。如果您删除应用程序并重新安装,您将获得一个新的 id 哈希。 UUID 未被 Apple 阻止。

我认为最好的解决方案是使用 IFA,并将 OpenUDID 作为 iOS

这是我们使用的代码。如果 IFA 不可用,请获取 OpenUDID。 [[您必须安装 OpenUDID,在此处阅读更多相关信息,https://github.com/ylechelle/OpenUDID。]]

NSString* uuid = nil;
if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
    // IOS 6 new Unique Identifier implementation, IFA
    uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
} else {
    // Before iOS6 (or if IFA disabled) you shoud use a custom implementation for uuid
    // Here I use OpenUDID (you have to import it into your project)
    // https://github.com/ylechelle/OpenUDID
    NSString* openUDID = [OpenUDID value];
    uuid = [OpenUDID value];
}

【讨论】:

  • 感谢您的回复。但我有一个问题,如果你删除应用程序并重新安装、关闭设备、更新或安装新的 ios,那么 OpenUDID 将保持与以前相同吗?
  • 您可以在项目网站上阅读有关 OpenUDID 的更多信息。但它几乎是设备上多个应用程序共享的通用唯一字符串。例如,Gmail、Chrome 和 Dropbox 使用 OpenUDID(我不知道,只是为应用程序使用名称)。您下载的第一个应用程序说 Gmail 将设置 OpenUDID 强。第二个和第三个应用程序将读取相同的 OpenUDID 字符串。但是假设您随后删除了 Gmail——OpenUDID 字符串不会丢失,而是由使用它的其他应用程序维护。 (要摆脱它,必须删除所有应用程序)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多