UDID
-
Unique Device Identifier:设备唯一标识符。从名称上也可以看出,UDID这个东西是和设备有关的,而且是只和设备有关的,有点类似于MAC地址。需要把UDID这个东西添加到Provisoning Profile授权文件中,也就是把设备唯一标识符添加进去,以此来识别某一台设备。UDID是一个40位十六进制序列,我们可以使用iTunes和Xcode来获取这个值。
-
Xcode获取UDID:把手机连上电脑,然后打开Xcode,选择Window-->Devices,就会显示出当前你连接上的所有设备,其中显示的Identifier就是该设备的UDID。
-
代码中获取UDID:自从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID。苹果提供了一个参数identifierForVendor来替代原来UDID的作用。通过代码实现如下:
NSUUID *uuid = [UIDevice currentDevice].identifierForVendor;
- UDID是只和iOS设备有关的,而这个identifierForVendor是应用和设备两者都有关的。和真正的UDID的区别是显而易见的:也就是说App的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。
UUID
- Universally Unique Identifier,翻译过来就是通用唯一标识符。是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12 。UUID在某一时空下是唯一的。比如在当前这一秒,全世界产生的UUID都是不一样的;当然同一台设备产生的UUID也是不一样的。最简单获取UUID的代码如下:
// 循环10次,每一次打印的值都是不一样的,当然循环的再多,这个值永远不会出现两个一样的值。
NSString *uuid = [NSUUID UUID].UUIDString;
- 苹果公司建议使用UUID为应用生成唯一标识字符串。虽然UUID是官方提出的一种替代UDID的建议方案,但网上有资料说UUID不能保证在以后的系统升级后还能用。UUID在iOS10下均可以使用,而且UUID每次生成的值都不一样,需要开发者自行保存UUID。
APP中需要一个能够标识设备唯一性的ID怎么办
- Mac地址+bundle_id
1. 获取本地mac地址和应用bundle_id。 2. 将mac+bundle_id进行散列运算获得机器+应用的唯一标。 3. 只将mac进行散列运算获得机器的唯一标识。
- 推送token+bundle_id
1. 应用中增加推送用来获取token。 2. 获取应用bundle_id。 3. 根据token+bundle_id进行散列运算。
评价:apple push token保证设备唯一,但必须有网络情况下才能工作,该方法不依赖于设备本身,但依赖于apple push。加上一定的业务逻辑可以解决大部分情景。
- OpenUDID (推荐)
使用OpenUDID开源代码,这个代码通过一些特殊的算法,创建了每一个设备的唯一标识符。
Device Token
image-
对APNs来说,设备的标识符与app无关。所以同一台设备上,不同的app获得的device token是一样的; 一个设备可能会产生多个device token, 一个device token也可能对应多个UDID。
-
同一个设备在development和distribution情况下,收到的device token是不同的,而token是与app无关的。
通过苹果私有方法获取AADeviceInfo
- (NSString *)getDeviceIdentifier {
NSBundle *privatePath = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/AppleAccount.framework"];
if([privatePath load]){
Class AADeviceInfo = NSClassFromString(@"AADeviceInfo");
NSLog(@"productVersion- %@", [AADeviceInfo valueForKey:@"productVersion"]);
NSLog(@"userAgentHeader- %@", [AADeviceInfo valueForKey:@"userAgentHeader"]);
NSLog(@"appleIDClientIdentifier- %@", [AADeviceInfo valueForKey:@"appleIDClientIdentifier"]);
NSLog(@"appleIDClientIdentifier- %@", [AADeviceInfo valueForKey:@"apnsToken"]);
NSLog(@"appleIDClientIdentifier- %@", [AADeviceInfo valueForKey:@"serialNumber"]);
NSLog(@"productVersion- %@", [AADeviceInfo valueForKey:@"osVersion"]);
NSLog(@"userAgentHeader- %@", [AADeviceInfo valueForKey:@"udid"]);
NSLog(@"appleIDClientIdentifier- %@", [AADeviceInfo valueForKey:@"infoDictionary"]);
if([[AADeviceInfo valueForKey:@"appleIDClientIdentifier"] integerValue]){
return [AADeviceInfo valueForKey:@"appleIDClientIdentifier"];
} else{
NSLog(@"没有");
}
}
return @"";
}
网友评论