【问题标题】:UniqueIdentifier in ios 7iOS 7 中的唯一标识符
【发布时间】:2013-11-28 12:41:08
【问题描述】:

在弃用 uniqueIdentifier 之前,最好使用相同的标识符,甚至删除应用程序甚至擦除 iPhone。之后,我使用 MAC 地址,这在 iOS 7 之前也可以使用,但在 iOS 7 中,它给出了 2c:00:00:00:00:00。所以我没有办法获得唯一标识符。 If is use IdentifierForVender: 如果我删除同一供应商的所有应用程序,它会给出不同的标识符。

MAC 地址:它可以正常工作,但在 iOS 7 上不行。

唯一标识符:已弃用。

请告诉我如何获得独特价值甚至删除应用程序甚至擦除iPhone(如恢复出厂)

【问题讨论】:

  • 尝试 iAdIdentifier...
  • 你几乎已经列出了所有的可能性,并且不可能有一个自动生成的标识符在所有这些情况下都持续存在。然而,真正吸引我的是擦除设备——也许你应该重新考虑是否绝对有必要在用户明显不希望它时保留这个标识符!
  • @prabu 你确定它会给出唯一标识符吗?
  • @user2906829 广告标识符不会那样持久化,用户也可以从“设置”应用手动重置。
  • @ev0lution 是的,这样做是必要的。Mac 地址解决了我的问题,但 ios 7 再次对其进行了分发,它给出的结果与我写的相同。请告知任何技巧。

标签: ios iphone objective-c


【解决方案1】:

编辑 3

在钥匙串中存储 UUID 似乎是下一个通用解决方案。 This 可能会解决 iOS7 的问题。


编辑 2

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


此处解释了所有可能性和不同的 ID 维护。

更多详情请访问this link


编辑 1

这是较旧的方法,但如果即使系统重置,您也需要保留 ID。那你应该看看这个。这可能会对您有所帮助。

我想让你看到this popular link

1) MAC+CFBundleIdentifier的MD5

[[UIDevice currentDevice] uniqueDeviceIdentifier]

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

2) MAC的MD5

[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]

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

【讨论】:

  • 这很好,但他问的是不在此图表中的 iOS7
  • 无论如何,我相信这是有价值的信息。图表显示在所有这些情况下只有 UDID 保持不变,并且 OP 已经知道这在 iOS 7 上不可用。
  • 但是如果是,ios 7 UDID 在 ios 7 上是唯一的,请告诉我如何获取它?
  • @user2906829 是的,当您重置您的 iPhone 意味着所有内容也将被删除。如果您看到上面的图表,您可能会注意到即使系统重置也只会保留 UDID。但不幸的是,现在无法访问和允许。
【解决方案2】:

实现这一点的唯一方法是自己生成一个随机 ID(例如 UUID)并将其存储在 iOS 钥匙串中。

卸载应用时不会清除钥匙串,因此您应该在重新安装后仍然可以读取该值。

其他更直接的持久 ID 机制已被 Apple 阻止或禁止。

【讨论】:

  • 但是在擦除 iphone 钥匙串时丢失了那个钥匙。所以请提出一些建议。并感谢您的回复
  • @user2906829 没有什么可以允许的。 Apple 故意阻止了所有在擦除手机时仍然存在的机制。
  • 当您使用不同的配置文件更新应用程序时,此解决方案会失败。例如从通配符到其他一些。
【解决方案3】:

删除 iOS 会删除所有唯一 ID 的事实完全是故意的。 Apple 故意使获取持续此类事件的唯一 ID 变得困难。这是为了用户隐私

Apple 并不关心您的应用程序是否可以跟踪其用户。苹果关心它的用户是否满意。 Apple 的用户表达了对隐私设置、应用可以查看和跟踪的内容等更多控制权的愿望。因此,Apple 使得所有形式的唯一 ID 都难以获取和保留。

Apple 提供了可以为广告/统计/分析跟踪生成 UUID 的 API(在此问题的其他答案中进行了描述)。使用这些 ID,因为这就是它们的用途。 MAC 地址从未用于唯一标识用户。

您想要跟踪用户。 UDID 和 MAC 地址跟踪设备,而不是用户。设备可能被出售、赠送、丢失或被盗。如果您继续使用同一个 ID,那么您并不总是跟踪同一个用户。如果用户买了一部新手机怎么办?你不想要一个 ID 跟随他们到新设备吗?还是您不在乎 ID 没有持久化的情况?

此外,有些用户不想被跟踪。这是你考虑过的吗?您是否为用户提供选择退出的方式?如果您开始跟踪用户,并且您使用的 ID 会持续重新安装应用程序、持续重新安装操作系统并且用户无法选择退出,那么他们如何让您停止跟踪他们?

最重要的是,您真的不应该担心尝试获取即使在重新安装操作系统后仍然存在的 ID。

要正确跟踪用户,您应该让他们创建一个用户帐户

【讨论】:

    【解决方案4】:

    我找到了答案。我想要一个唯一的 ID,无论删除或擦除 iPhone,它都是相同的。 我使用设备的序列号,所以我可以一直获得唯一的价值。

    有一个UIDevice 类别。

    【讨论】:

    • 但是使用序列号会导致应用商店拒绝?
    • 我很确定使用序列号将意味着在 Apple 的 iOS 商店中被拒绝。我不希望手机上的应用程序可以获取序列号。
    • 首先获取序列号是使用越狱设备可用的私有API来实现的。苹果会拒绝使用私有 API 获取序列号的应用。
    • 所以你现在给我的建议请帮助我。
    • 我还没有将我的应用上传到应用商店,但它正处于开发阶段。怎么办
    【解决方案5】:

    您可以为此使用 identifierForVendor,因为 identifierForVendor 在应用程序从设备中删除之前是唯一的。当应用程序再次安装到设备中时,identifierForVendor 将发生变化。

    为了唯一性,您可以将 identifierForVendor 保存到设备钥匙串中,下次应用程序安装到设备时检查 identifierForVendor 是否已保存到设备钥匙串中。

    如果“是”,则使用保存的 identifierForVendor,否则将新的 identifierForVendor 保存到设备钥匙串中以供进一步使用。

    -(void)checkAndSetDefaultKeychainsOfAppAndSetSecurityStatus
    {
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] init];
    if (![wrapper searchKeychainCopyMatching:@"DeviceId"]) {
    [包装器 createKeychainValue:[UIDevice currentDevice].identifierForVendor.UUIDString forIdentifier:@"DeviceId"];
    }
    self.strDeviceid = [wrapper getDataFromKeychainMatching:@"DeviceId"];
    NSLog(@"%@",self.strDeviceid);
    [包装器发布];
    }

    -(NSString *)stringforDeviceId
    {
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] init];
    if (![wrapper searchKeychainCopyMatching:@"DeviceId"]) {
    [包装器 createKeychainValue:[UIDevice currentDevice].identifierForVendor.UUIDString forIdentifier:@"DeviceId"];
    }
    return [wrapper getDataFromKeychainMatching:@"DeviceId"];
    }

    如果您有任何疑问,请告诉我。我会更乐意清除。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2019-04-25
      相关资源
      最近更新 更多