iOS设备的唯一标识符

3

我曾使用Mac地址作为iOS设备的唯一标识符,但从iOS7开始,系统总是返回02:00:00:00:00:00的值。我搜索了三个解决方案:

  1. 供应商识别
  2. 广告识别
  3. 使用IOUnit框架获取序列号

由于IOUnitFramework未经过App Store批准,因此无法在我的应用程序中使用它。而供应商识别和广告识别返回非常长的值。

是否还有其他可能的方法来唯一标识iOS设备?

提取唯一标识符到钥匙串中是另一个选项。但是我们不能直接从iOS设备访问钥匙串。那么还有其他替代方法可以唯一标识设备吗?


是的 - 在这里检查我的答案:https://dev59.com/UGMl5IYBdhLWcg3wAC6h - Grzegorz Krukowski
5个回答

3
不,苹果不再允许您唯一标识设备。这与用户隐私有关。因为您只是标识设备而非用户
同时,不要使用ASIdentifierManager来标识设备,苹果现在拒绝使用此功能的应用程序以标识设备。ASIdentifierManager仅用于广告目的。
唯一剩下的选择是使用[[UIDevice currentDevice] identifierForVendor]或将自己创建的自定义ID保存到钥匙串中。 将自己创建的ID保存到钥匙串中将确保如果用户删除应用程序并稍后重新安装它,您仍然可以访问此值。

仅仅识别设备而不是用户显然是一个愚蠢的想法,如果你考虑一下当我出售一部二手手机时会发生什么。现在完全不同的人拥有了这个设备。而我的新手机因为是不同的,所以无法被识别。 - gnasher729
@gnasher729 当开发人员使用UDID时,这种情况经常发生。Mac地址也是如此。 - rckoenes
我很好奇,因为在钥匙串中创建唯一标识符相当于旧的“uniqueIdentifier”方法,而苹果已经将其设为私有。如果他们注意到您正在重新发明用于唯一标识设备的策略,那么他们会拒绝该应用程序吗? - patrick
并不是这样,因为你能够识别设备并不意味着其他开发者可以获取到相同的标识符。苹果公司移除了 [UIDevice uniqueIdentifier] 方法,您可以从多个来源识别设备。因此,某些人可能会滥用此功能,例如广告商可以查看您正在运行哪些其他应用程序以及您在设备上使用每个应用程序的时间长度。当然,使用 ASIdentifierManager 仍然部分可能实现此目的,但用户可以选择不共享信息。 - rckoenes

1
您可以使用设备的UDID来唯一标识iPhone设备。
从该方法创建UIID。
- (NSString *)createUUID
{
  CFUUIDRef theUUID = CFUUIDCreate(NULL);
  CFStringRef string = CFUUIDCreateString(NULL, theUUID);
  CFRelease(theUUID);
  [[NSUserDefaults standardUserDefaults] setObject:(__bridge NSString *)string forKey:@"UUID"];
  [[NSUSerDefaults standardUserDefaults] synchronize];
  return (__bridge NSString *)string;
}

在需要设备UDID的地方使用此代码

- (NSString*)UUID
{
    return [[NSUserDefaults standardUserDefaults] ObjectForKey:@"UUID"];
}

2
请注意,如果您以这种方式操作,ID 将与应用程序一起被删除。 - rckoenes
@rckoenes,是的,在那种情况下,他应该按照您的建议使用唯一标识符。如果应用从iOS设备中删除或重新安装,则唯一标识符将不会从钥匙串访问中删除。 - Gajendra Rawat

1
你可以查看这个链接这个链接,它们展示了多种识别iOS设备的方法。虽然有些过时,但identifierForVendoradvertisingIdentifier仍然有效。
广告标识符主要用于广告目的,但Apple鼓励将此标识符用于任何需要。

广告标识符是新的AdSupport.framework的一部分。ASIdentifierManager单例公开了advertisingIdentifier方法,调用该方法返回NSUUID类的实例。

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

供应商标识符也返回UUID字符串:

NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - Rick Hoving
你说得对,我会更加注意的,感谢你的建议! - Jissay

1

苹果停止了跟踪应用程序的方式,但我们可以使用以下 ID 来跟踪应用程序:

  1. 供应商标识符
  2. NSUUID
  3. CFUUID

但是,如果您恢复出厂设置您的手机,这些设备 ID 将被重置。

您可以在此处获取详细描述 iOS 中唯一设备标识


1

有很多方法可以获得唯一标识符。你可以像一些人建议的那样获取identifierForVendor,或者像mokujin建议的那样创建UUID。甚至还有像SecureUDID、OpenUDID这样的外部源库...但所有这些都有同样的问题,如果您删除应用并重新安装,您将获得不同的标识符。

我曾在一家大公司工作,他们使用了MDM(Mobile Iron),可以让你获得真正的UDID。我想你在你的项目中没有使用MDM,所以我建议你使用我和其他用户推荐的其中一个选择,并将其保存在你的keychain中。之后,你应该检查是否在你的keychain中保留了这个值,以便使用它,如果没有,你应该获取它并保存它。

不要将它保存在NSUserDefaults中,因为如果您删除应用程序,您在那里保存的信息将被删除。

为了使用您的keychain,我建议您使用Apple的这个类KeychainItemWrapper


好的。如果我在钥匙串中存储了与设备标识符相关的特定值,并且该应用程序安装在另一个iOS设备上,那么该应用程序是否能够检索先前存储的钥匙串数据? - Sonal0706
实际上,我不理解“在相同teamID的应用程序之间共享钥匙链”的说法。我还有一个问题,如果我将应用程序提交到应用商店,那么在开发应用程序时检索keychain数据几乎是不可能的。所以想知道是否有其他替代方案? - Sonal0706
当您第一次运行应用程序时,应获取设备的值。因此,如果您在不同的设备上安装应用程序,则每个设备将具有不同的标识符。我想,您希望使用此标识符与服务器通信,因此您将在服务器上注册此标识符。您应该检查应用程序中创建的标识符是否已存在。如果存在,则应回调一个消息,如“重复值”,并且您的应用程序应该再次创建其他标识符并重新发送。但是,毫无疑问,您需要创建一个使用外部库创建标识符的方法。 - Fran Martin
或者创建您自己的方法,例如生成介于1000000000和99999999999之间的随机数,并附加当前毫秒级日期。这将创建一个标识符,用于识别。您只需要在服务器上检查此标识符是否存在,如果不存在,则保留它。如果存在,则创建其他新标识符。 - Fran Martin
您可以使用钥匙串和组访问在应用程序之间共享信息。您可以在此处找到如何执行此操作的详细信息:http://shaune.com.au/ios-keychain-sharing-data-between-apps/ - Fran Martin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接