获取iOS设备唯一标示

        在产品的需求中,很多情况下我们需要获取设备的唯一标示,那么获取设备的唯一标示的方式有哪几种呢,在这里做一下总结;我们通常都说UDID、UUID、IDFA、CFUUID、NSUUID等。

获取设备唯一标示总结:

一、UDID    (Unique Device Identifier);

简单介绍:iTunes点击查询序列号

iOS5 sdk中的获取方法:[UIDevice currentDevice] uniqueIdentifier];在iOS5.0之后删除。

二、UUID     (Universally Unique Identifier);

简单介绍:不同应用有不用的UUID,如果用户删除了应用,则UUID会发生改变。

iOS6.0提供的接口,使用方法[[UIDevicecurrentDevice]identifierForVendor];

三、IDFA    广告标示符(IDFA-identifierForIdentifier)

简单介绍:

1、添加框架AdSupport.framework

2、添加头文件 #import

3、使用语句

 iOS6.0提供的接口 NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier]UUIDString];

四、CFUUID    (目前本公司应用使用的是CFUUID,然后存储到Keychain中)

简单介绍:

    从iOS2.0开始,CFUUID就已经出现了,C语言风格。它是CoreFoundatio包的一部分,因此API属于C语言风格。CFUUIDCreate方法用来创建CFUUIDRef,并且可以获得一个相应的NSString,获得的这个CFUUID值系统并没有存储。每次调用CFUUIDCreate,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

注意:如果删除APP重新安装,或者覆盖APP,CFUUID不会改变,但是如果进行刷机、还原、恢复出厂几乎一定会发生改变,后面几种情况没有进行测试。


已经在真机中测试过了代码如下:
    

    //1、从钥匙串中获取
    NSString *cfuuidStr=[KeyChainManager selectUUID];
    NSLog(@"从钥匙串中获取的CFUUID=%@",cfuuidStr);
    
    //2、创建CFUUID
    if (cfuuidStr==nil||[cfuuidStr isEqualToString:@""]) {
        CFUUIDRef uuidRef=CFUUIDCreate(kCFAllocatorDefault);
        cfuuidStr=(NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidRef));
        [KeyChainManager addUUID:cfuuidStr];
        NSLog(@"创建CFUUID=%@",cfuuidStr);

    }

//  KeyChainManager.h

#import 
#import 

@interface KeyChainManager : NSObject

+(NSString *)selectUUID;

+(BOOL)addUUID:(NSString *)uuidStr;

@end

//  KeyChainManager.m

#import "KeyChainManager.h"

@implementation KeyChainManager

+(NSString *)selectUUID
{
    NSMutableDictionary *dictQuery=[[NSMutableDictionary alloc] init];
    [dictQuery setValue:(id)kSecClassGenericPassword forKey:(id)kSecClass];
    [dictQuery setValue:@"com.aa.driver" forKey:(id)kSecAttrAccount];
    [dictQuery setObject:@YES forKey:(__bridge id)kSecReturnData];     //返回Data
    OSStatus queryErr=-1;
    CFTypeRef result = NULL;
    queryErr = SecItemCopyMatching((__bridge CFDictionaryRef)dictQuery, &result);
    if (queryErr!=errSecSuccess) {
        return nil;
    }
    NSString *uuidStr=[[NSString alloc] initWithData:(__bridge_transfer NSData *)result encoding:NSUTF8StringEncoding];
    return uuidStr;
    
}

+(BOOL)addUUID:(NSString *)uuidStr
{
    NSMutableDictionary *dictQuery=[[NSMutableDictionary alloc] init];
    [dictQuery setValue:(id)kSecClassGenericPassword forKey:(id)kSecClass];
    [dictQuery setValue:@"com.aa.driver" forKey:(id)kSecAttrAccount];
    OSStatus queryErr=-1;
    CFTypeRef result = NULL;
    queryErr=SecItemCopyMatching((__bridge CFDictionaryRef)dictQuery,&result);
    if (queryErr==errSecItemNotFound) {
        NSData *uuidData=[uuidStr dataUsingEncoding:NSUTF8StringEncoding];
        [dictQuery setObject:uuidData forKey:(__bridge id)kSecValueData];
        queryErr=SecItemAdd((__bridge CFDictionaryRef)dictQuery, NULL);
    }
    return queryErr==errSecSuccess;
    
}
@end

 

五、NSUUID

简单介绍

NSUUID在iOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:

NSString *uuid = [[NSUUID UUID]UUIDString];

跟CFUUID一样,这个值系统也不会存储,每次调用的时候都会获得一个新的唯一标示符。如果要存储的话,你需要自己存储。在我读取NSUUID时,注意到获取到的这个值跟CFUUID完全一样(不过也可能不一样):



下面的一些介绍是从网上摘抄的知识点,可以了解一些:

一、UDID(Unique Device Identifier)     

        UDID 是由子母和数字组成的40个字符串的序,用来区别每一个唯一的iOS设备,包括iPhones, iPads,以及iPod touches, 这些编码看起来是随机的,实际上是跟硬件设备特点相联系的,另外你可以到iTunes点击查询序列号

        UDID可以关联其它各种数据到相关设备上。例如,连接到开发者账号,可以允许在发布前让设备安装或测试应用; 也可以让开发者获得iOS测试版进行体验。苹果用UDID连接到苹果的ID,这些设备可以自动下载和安装从App Store购买的应用、 保存从iTunes购买的音乐、帮助苹果发送推送通知、即时消息。

        在iOS应用早期,UDID被第三方应用开发者和网络广告商用来收集用户数据,可以用来关联地址、记录应用使用习惯……以便推送精准广告。不少用户也对此表示苹果侵犯消费者隐私,因此在后期苹过反对开发人员使用UDID。

        UDID在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI.uniqueIdentifier在UIDevice.h中的定义如下:@property(nonatomic,readonly,retain) NSString   *uniqueIdentifier  __OSX_AVAILABLE_BUT_DEPRECATED(__MAC意思是iOS2.0以上及iOS5.0以下的系统可用,但不建议使用.Apple有可能在iOS5.0之后删除该函数;

        iOS5 sdk中的获取方法:[UIDevice currentDevice] uniqueIdentifier];

但是我们需要注意的一点是,对于已越狱了的设备,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以为每一个应用分配不同的UDID,所以UDID作为标识唯一设备的用途已经不大了。

二、UUID(Universally Unique Identifier)

        UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码,由网上资料显示,UUID是一个软件建构的标准,也是被开源软件基金会(Open Software Foundation,OSF)的组织在分布式计算环境(Distributed Computing Environment,DCE)领域的一部份.UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定.

根据以上定义可知,同一设备上的不同应用的UUID是互斥的,即能在改设备上标识应用.但是并没有明确指出能标识出装有同一应用的不同设备,但是根据我推测,这个UUID应该是根据设备标识和应用标识生成唯一标识,再经过加密而来的(纯推测).

        UUID(Universally UniqueIDentifier)是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个UUID在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个UUID已经发生了改变。

       通过调用[[UIDevice currentDevice]identifierForVendor],方法可以获取UUID。UUID不好的地方就是用户删除了你开发的程序以后,基本上你就不可能获取之前的数据了。

      [[UIDevicecurrentDevice]identifierForVendor];

你可能感兴趣的:(iOS)