如何长期使用一种方法唯一地识别iOS设备?

19
什么是在不受未来的苹果限制的情况下唯一注册iOS设备的最佳方法?
我的当前方法是使用iOS设备的UDID来识别它并注册它,然后在识别它后执行必要的操作来标识iOS设备。但问题在于UIDevice uniqueIdentifier属性已被弃用。虽然我知道有一些解决方法(如在这个问题中讨论的),但它们也存在局限性。
其中一种可能的解决方法是使用iOS设备的MAC地址。但我觉得在未来某个时候苹果可能会限制对这些信息的访问。
除了访问MAC地址之外,是否有其他方法可以识别iOS设备,并且我们可以依靠这种方法进行未来的操作?

UIDevice的uniqueIdentifier已经被弃用了,现在该怎么办? - Kyle Jones
2
@KyleJones - 不完全是你提到的问题的重复,我已经提供了参考。在那个问题中,建议使用iOS设备的Mac地址,而我已经提到了。我知道这一点,但我不想依赖它。因为过段时间后,苹果可能会限制对其的访问。 - rishi
2
这不是一个很好的答案,但你可以请求推送的权限来获取设备令牌吗? 这必须是设备唯一的,并且只要APN存在,就会有一些变体存在。 - danh
5个回答

7

使用苹果首选的生成CFUUIDRef的方法可能是更好的解决方案,因为我认为MAC地址也可能在将来被删除。如果您使用此方法并将其保存到NSUserdefaults中,除非用户删除应用程序,否则它将持久存在。如果您想要一个可以在应用程序之间共享或在安装之间保持持久的生成唯一ID,您应该考虑使用UIPasteboard,并使用一个在应用程序之间共享的密钥保存您生成的UID。

//Create a unique id as a string
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);

//create a new pasteboard with a unique identifier
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"youruniquestring" create:YES];

[pasteboard setPersistent:YES];

//save the unique identifier string that we created earlier
[pasteboard setString:((__bridge NSString*)string)];


 //accessing it
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"youruniquestring" create:NO];
NSLog([pasteboard string]);

我已经写了一份简短的教程,但基本上和上面的代码行差不多:http://www.roostersoftstudios.com/2012/03/26/a-way-to-share-data-between-apps-on-a-given-ios-device/


使用iOS钥匙串作为凭证存储可能是更好的选择,例如您可以使用SSKeychain与之交互。这似乎比使用UIPasteboard更合适,因为UIPasteboard通常用于UI操作(如复制和粘贴)。 - Diego

4

除非您的应用程序是用于管理我的苹果设备,否则这是错误的方法。作为用户,我不想让您知道我正在使用哪个设备。我希望您识别我,无论我使用什么设备。我希望能够更换有问题的设备。苹果将会限制越来越多的访问此信息。

[编辑] 我不明白如何使用MAC地址。我的iOS设备可以有多个。


2
另一种选择是动态生成您自己的UUID。
CFUUIDRef uuid = CFUUIDCreate(NULL); 
CFStringRef generatedUuidStr = CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
NSString* uuidStr = [(NSString*)generatedUuidStr autorelease];

您可以将此UUID持久化到NSUserDefaults中,以实现安装基于的唯一性。如果设备基于的唯一性确实是最重要的事情(这样在卸载和重新安装后ID仍然存在),您需要一种机制来在设备上持久化ID。我认为您可以尝试使用Keychain来持久化该ID,这应该会在应用程序卸载后继续存在。您甚至可以在向Keychain添加UUID时使用访问组,以便您拥有一套使用相同UUID的应用程序套件。
请参阅苹果的安全框架参考,了解更多关于保存Keychain项目和检索它们的信息。

http://developer.apple.com/library/ios/#DOCUMENTATION/Security/Reference/SecurityFrameworkReference/_index.html


2
请确保保存由这些函数创建的UUID,因为每次调用此函数时它们都会不同。这不是uniqueIdentifier的替代品,但对于您的目的可能已经足够了。 - Sam
是的,我暗示了这一点,但Sam明确地说了出来。+1给Sam的清晰度。 - NSProgrammer
@nob1984 - 这里也存在一些坑,如果用户删除了应用程序并重新安装,那么我们也会失去他。 - rishi
@rishi 只有当 UUID 被存储在本地某个位置(NSUserDefaults)且在卸载时会丢失时,才会出现这个问题。否则,在下一次安装时,当用户成功登录时,可以检索到 UUID。 - Sam
@rishi - 是的,我已经提到过这个缺点了,Sam 也重申了一遍。钥匙串存储方法将是处理卸载和重新安装后的持久性的方式(我也提到过)。 - NSProgrammer
在编程中,使用钥匙串来持久化生成的ID,在卸载和重新安装期间仍然有效,这是一个很好的做法。NSUserDefaults在卸载和重新安装期间会被删除。 - Andreas Paulsson

1
我见过的最好方法是使用钥匙串。您可以使用CFUUIDCreateString函数生成UUID并将其存储在钥匙串中。这些数据在设备之间的安装和从备份中恢复期间保留。

-2

1
抱歉,我有点过于急躁了。但是MAC地址不太可能很快消失,因为它是用于所有TCP/IP套接字通信的核心框架的一部分,所以这将是您最安全的选择。您需要独特的设备还是独特的应用程序安装?如果您想要独特的安装,您可以在服务器上生成唯一的ID。但是一旦应用程序被卸载或设备被恢复出厂设置,该ID将会消失。 - shein
可能还可以在某些时间限制访问MAC地址。正如您所说,服务器上的设备令牌的第二个选项也不是一个非常好的选择。 - rishi
这些是你唯一的选择。任何独特设备ID的方法都可能在某个时候受到限制... MAC地址至少有更多的用途,而且不太可能被限制。 - shein
1
不要使用MAC地址。当它被拿走时,你会感到后悔的。 - james woodyatt
是的,但按照这个逻辑,任何东西都可以被拿走...那么替代方案是什么? - shein
好吧,我将成为第一个在这里吃帽子的人。一年后,MAC地址访问被取消了... 但是苹果现在提供了identifierForVendor方法。 - shein

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