在产品的需求中,很多情况下我们需要获取设备的唯一标示,那么获取设备的唯一标示的方式有哪几种呢,在这里做一下总结;我们通常都说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<AdSupport/ASIdentifierManager.h>
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、创建CFUUIDif (cfuuidStr==nil||[cfuuidStr isEqualToString:@""]) {CFUUIDRef uuidRef=CFUUIDCreate(kCFAllocatorDefault);cfuuidStr=(NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidRef));[KeyChainManager addUUID:cfuuidStr];NSLog(@"创建CFUUID=%@",cfuuidStr);}
// KeyChainManager.h#import <Foundation/Foundation.h>#import <Security/Security.h>@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];//返回DataOSStatus 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];