UDID和UUID

UDID

UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI.

UDID两种用途:

1)用于一些统计与分析目的;【第三方统计工具如友盟,广告商如ADMOB等】

2)将UDID作为用户ID来唯一识别用户,省去用户名,密码等注册过程。

UDID被弃用,可以使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。

解决方案

使用SecureUDID,SecureUDID 是一个开源的基于沙箱机制的 UDID 解决方案,旨在解决苹果因为废弃了 UDID 后导致的隐私问题。

示例:

#import "SecureUDID.h"

NSString *domain     = @"com.example.myapp";
NSString *key        = @"difficult-to-guess-key";
NSString *identifier = [SecureUDID UDIDForDomain:domain  usingKey:key];

UUID

UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。UUID是一个软件建构的标准,也是被开源软件基金会(Open Software Foundation,OSF)的组织在分布式计算环境(Distributed Computing Environment,DCE)领域的一部份.UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定. 根据以上定义可知,同一设备上的不同应用的UUID是互斥的,即能在改设备上标识应用.但是并没有明确指出能标识出装有同一应用的不同设备,据推测,这个UUID应该是根据设备标识和应用标识生成唯一标识,再经过加密而来的.

UUID实现

-(NSString*) uuid { 
CFUUIDRef puuid = CFUUIDCreate( nil ); 
CFStringRef uuidString = CFUUIDCreateString( nil, puuid ); 
NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);
CFRelease(puuid); 
CFRelease(uuidString);
return [result autorelease]; 
}

该方法每次都会获取一个唯一的标识字符串,开发者可以在应用第一次启动时候调用一次,然后将该串存储起来,以便以后替代UDID来使用。问题是如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备。