UDID和UUID的区别
IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的。每一部手机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录。手机用户可以在手机中查到自己手机的IMEI码。 iOS5以后不能再获取了。
UDID是Unique Device Identifier的缩写,是一串由40位16进制数组成的字符串,用以标识唯一的设备,苹果从iOS5开始就移除了通过代码访问UDID的权限,应用试图获取UDID被禁止且不允许上架。现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来查看。对于已越狱了的设备,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以为每一个应用分配不同的UDID.
那么有没有另外的办法来获取用户设备的唯一标识符呢?答案是有的,当然这样的标识符不是苹果隐藏的UDID了,使用OpenUDID开源代码,这个代码通过一些特殊的算法,创建了每一个设备的唯一标识符,你可以拿过来用来识别设备了。
UUID是Universally Unique Identifier的缩写,通过调用[[UIDevice currentDevice]identifierForVendor];方法可以获取UUID。只要用户没有完全删除应用程序,则这个UUID在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个UUID已经发生了改变。
deviceToken的原理跟UUID差不多,如果用户删除了这个应用程序,然后再重新安装,那么这个deviceToken已经发生了改变。
我们现在的程序中后台如果需要传入用户设备标识,一般我们取UUID来传入。最理想的就是保存在keychain里面,以此作为标识用户设备的唯一标识符。
获取UUID的方法为:
CFUUIDRef uuid = CFUUIDCreate(NULL);
assert(uuid != NULL);
CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);
DLog(@"uuidStr------》%@",uuidStr);
之前使用了Git上的一个第三方库,SSKeychain,将UUID保存在keychain里面,每次调用先检查钥匙串里面有没有,有则使用,没有则写进去,保证其唯一性,具体使用如下:
CFUUIDRef uuid = CFUUIDCreate(NULL);
assert(uuid != NULL);
CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);
NSString *identifierNumber = [SSKeychain passwordForService:@"com.test.app1"account:@"user"];
if (!identifierNumber){
[SSKeychain setPassword: [NSString stringWithFormat:@"%@", uuidStr] forService:@"com.test.app1"account:@"user"];
identifierNumber = [SSKeychain passwordForService:@"com.test.app1"account:@"user"];
}