现在做什么?
它刚刚发现UIDevice uniqueIdentifier属性在iOS5
及更高版本中已弃用。 似乎没有其他方法或财产可用或即将出现。
我们现有的许多应用程序都严格依赖此属性来唯一标识特定设备。 任何人都可以提出任何想法,我们将如何处理这个问题?
文档中的建议是......
特殊考虑
不要使用uniqueIdentifier属性。 要创建特定于您的应用程序的唯一标识符,您可以调用CFUUIDCreate
函数来创建UUID
,并使用NSUserDefaults
类将其写入默认数据库。
但是,如果用户卸载并重新安装应用程序,则此值不会相同。
如果用户卸载并重新安装应用程序,则由CFUUIDCreate
创建的UUID是唯一的:每次都会得到一个新的应用程序。
但是您可能希望它不是唯一的,例如,当用户卸载并重新安装应用程序时,它应该保持不变。 这需要一点努力,因为最可靠的每个设备标识符似乎是MAC地址。 您可以查询MAC并将其用作UUID。
编辑:当然,需要总是查询同一接口的MAC。 我想最好的选择是en0
。 MAC始终存在,即使接口没有IP /关闭。
编辑2:正如其他人指出的,自iOS 6以来的首选解决方案是 - [UIDevice identifierForVendor]。 在大多数情况下,您应该可以使用它作为老式的替代品-[UIDevice uniqueIdentifier]
(但第一次启动应用程序时创建的UUID是Apple似乎希望您使用的UUID)。
编辑3:所以这个重点不会在评论噪音中丢失:不要使用MAC作为UUID,使用MAC创建一个哈希。 即使在重新安装和应用程序(如果哈希以相同的方式完成),每次散列总是会创建相同的结果。 无论如何,如今(2013年),除了您需要iOS 6.0以上的“稳定”设备标识符,这是不必要的。
编辑4:在iOS 7中,Apple在查询MAC时总是返回一个固定值,以专门阻止MAC作为ID方案的基础。 所以你现在真的应该使用 - [UIDevice identifierForVendor]或创建一个每安装UUID。
您可以将您的替代品用于Apple UDID
。 kind guy gekitz在UIDevice
上写了一个类,它将根据设备的MAC地址和包标识符生成某种UDID
。
你可以在github上找到代码
基于@moonlight提出的链接,我做了几次测试,似乎是最好的解决方案。 正如@DarkDust所说的,该方法会检查始终可用的en0
。
有2个选项:
uniqueDeviceIdentifier
(MAC + CFBundleIdentifier的MD5)
和uniqueGlobalDeviceIdentifier
(MAC的MD5),这些总是返回相同的值。
在我做的测试下面(用真实的设备):
#import "UIDevice+IdentifierAddition.h"
NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);
XXXX21f1f19edff198e2a2356bf4XXXX - (WIFI)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (WIFI)GlobalAppUDID
XXXX21f1f19edff198e2a2356bf4XXXX - (3G)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (3G)GlobalAppUDID
XXXX21f1f19edff198e2a2356bf4XXXX - (GPRS)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (GPRS)GlobalAppUDID
XXXX21f1f19edff198e2a2356bf4XXXX - (AirPlane模式)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (AirPlane模式)GlobalAppUDID
XXXX21f1f19edff198e2a2356bf4XXXX - 删除并安装应用后删除并重新安装应用XXXX7dc3c577446a2bcbd77935bdXXXX(Wi-Fi)后的(Wi-Fi)
希望它是有用的。
编辑:
正如其他人指出的,由于uniqueIdentifier
不再可用,查询MAC地址现在返回始终为02:00:00:00:00:00,因此iOS 7中的此解决方案不再有用
上一篇: What To Do Now?
下一篇: Why are you not able to declare a class as static in Java?