现在做什么?

它刚刚发现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中的此解决方案不再有用

链接地址: http://www.djcxy.com/p/76129.html

上一篇: What To Do Now?

下一篇: Why are you not able to declare a class as static in Java?