一.UDID(Unique Device Identifier) 

安卓同苹果二维码合并和统计工具,好推二维码已经更名为芝麻二维码了  

UDID是Unique Device Identifier的缩写,中文意是设备唯一标识. 

www.hotapp.cn

当广大急需限制一华装备一个账号的采用中不时会面因此到,在Symbian时代,我们是使用IMEI作为装备的唯一标识的,可惜的是Apple官方不允开发者获得装备的IMEI. 

ios5 sdk中之博方式: 

  1. [UIDevice currentDevice] uniqueIdentifier] 

uniqueIdentifier在UIDevice.h中的定义如下: 

  1. @property(nonatomic,readonly,retain) NSString    *uniqueIdentifier  __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_5_0); // a string unique to each device based on various hardware info.  

意思是iOS2.0以上以及iOS5.0之下的系可用,但切莫建议使用.Apple有或当ios5.0后头去该函数. 

经过测试,未越狱的iPhone,系统版本也5.0.1,依然可以赢得UDID. 

但是我们要留意的一点凡是,对于早已越狱了之配备,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应该是基于设备标识和用标识生成唯一标识,再经加密而来的(纯推测). 

iOS中获得UUID的代码如下: 

  1. 1 -(NSString*) uuid { 2 CFUUIDRef puuid = CFUUIDCreate( nil ); 3 CFStringRef uuidString = CFUUIDCreateString( nil, puuid ); 4 NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString); 5 CFRelease(puuid); 6 CFRelease(uuidString); 7 return [result autorelease]; 8 } 

虽然UUID是官提出的同样种替代UDID的提议方案,但网上发材料说UUID不能够保证在以后的系统升级后(IOS6,7)还能为此. 

透过我测试时,UUID在IOS4和IOS5下都好行使,而且UUID每次转的价值都无一样,需要开发者自行保存UUID. 

只要使用UUID为标识保存用户之材料在网及,当用户重装软件后,UUID的值就是可能会见出变动(基本上可视为百分百会发转移),用户则无法再次下载原来的纱资料. 

三.一个有效之化解方案 

透过上述的探究,我们不难发现,无论是以UDID或是UUID,我们的目的一般还是以为用户可自动注册,而无欲账号密码.而以UDID和UUID作为用户之ID也并无是绝不缺陷. 

现今网上发平等成的解决方案,使用设备的Mac地址,因为Mac地址为是唯一的.unix有网调用可以获取Mac地址.但有些工作需要小心: 

1.iPhone或者来差不多只Mac地址,wifi的地址,以及SIM卡的地址.一般来讲,我们取en0的地方,因为他是iPhone的wifi的地点,是大势所趋在的.(例外情况依然时有发生:市面上仍然是有联通的阉割版无wifi的iPhone) 

2.Mac地址涉及到隐私,不应该胡乱将用户之Mac地址传播!所以我们需要以Mac地址进行hash之后,才会当DeviceId上传. 

至于率先单注意点的题材,经过自己测试,没有Wifi功能的iPhone3GS一样好博Mac地址,所以这应该是现阶段标识设备唯一最好之一个化解方案. 

釜底抽薪方案github下充斥地址github。com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5 

背景:

多数使都见面就此到苹果设备的UDID号,UDID通常发生以下简单种植用途:

1)用于一些统计以及析目的;【第三正值统计工具如友盟,广告商如ADMOB等】

2)将UDID作为用户ID来唯一识别用户,省去用户称,密码等登记过程。

然,2011年每每,苹果就是宣布ios5.0事后的网中将不再支持以下方法取得用户的UDID【苹果设备的绝无仅有识别码】:

  1. [UIDevice currentDevice] uniqueIdentifier]; 

【注:对于已越狱了的配备,UDID并无是绝无仅有的.使用Cydia插件UDIDFaker,可以为各级一个用到分配不同之UDID】

以,苹果店建议以UUID【一栽开放之软件构建规范】来代替:

  1. -(NSString*) uuid {   
  2.     CFUUIDRef puuid = CFUUIDCreate( nil );   
  3.     CFStringRef uuidString = CFUUIDCreateString( nil, puuid );   
  4.     NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);   
  5.     CFRelease(puuid);   
  6.     CFRelease(uuidString); return [result autorelease];   

拖欠方法每次都见面落一个唯一的标识字符串,开发者可以当运第一次开行时调用一软,然后以欠失误存储起来,以便以后代表UDID来利用。

题材是使用户删除该应用还安装时,又见面转移新的字符串,所以未可知担保唯一识别该设施。

倘若新近(2012年3月),有信息称苹果采用企业开始拒绝用UDID的使用上架。

取而代之方案:

今天网上有同等现的缓解方案,使用设备的Mac地址,因为Mac地址为是唯一的.unix有网调用可以得Mac地址.但有些工作需要小心: 
1.iPhone或有差不多只Mac地址,wifi的地点,以及SIM卡的地址.一般来讲,我们取en0的地址,因为他是iPhone的wifi的地点,是必存在的.
2.Mac地址涉及到隐私,不应该胡乱将用户之Mac地址传播!所以我们要用Mac地址进行hash之后,才能够当做DeviceId上传.

欠解决方案源码地址:https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5

拖欠方案提供了简单单措施:

uniqueDeviceIdentifier (返回MAC和CFBundleIdentifier的MD5值)
uniqueGlobalDeviceIdentifier(返回MAC的MD5值)

以方法:

  1. #import “UIDevice+IdentifierAddition.h” NSLog(@”%@”,[[UIDevice currentDevice] uniqueDeviceIdentifier]); 
  2. NSLog(@”%@”,[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]); 

测试结果:

WIFI下:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX 
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX 

3G下:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

GPRS下

UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

飞行模式下:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

剔除应用重装后:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX

新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX