美文网首页
UDID和UUID区别

UDID和UUID区别

作者: 神采飞扬_2015 | 来源:发表于2017-05-17 21:06 被阅读100次

    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 @"";
    }
    

    相关文章

      网友评论

          本文标题:UDID和UUID区别

          本文链接:https://www.haomeiwen.com/subject/klkjxxtx.html