背景:
大多數應用都會用到蘋果設備的UDID號,UDID通常有以下兩種用途:
1)用於一些統計與分析目的;【第三方統計工具如友盟,廣告商如ADMOB等】
2)將UDID作為用戶ID來唯一識別用戶,省去用戶名,密碼等注冊過程。
不過,2011年時,蘋果就宣布ios5.0以后的系統中將不再支持以下方法獲取用戶的UDID【蘋果設備的唯一識別碼】:
[UIDevice currentDevice] uniqueIdentifier];
【注:對於已越獄了的設備,UDID並不是唯一的.使用Cydia插件UDIDFaker,可以為每一個應用分配不同的UDID】
同時,蘋果公司建議使用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來使用。
問題是如果用戶刪除該應用再次安裝時,又會生成新的字符串,所以不能保證唯一識別該設備。
而最近(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值)
使用方法:
#import "UIDevice+IdentifierAddition.h"
NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);
測試結果:
WIFI下:
UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX
3G下:
UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX
GPRS下
UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX
飛行模式下:
UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX
刪除應用重裝后:
UDID:XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX
參考整理自以下網頁:
http://stackoverflow.com/questions/6993325/uidevice-uniqueidentifier-deprecated-what-to-do-now
http://www.cocoachina.com/bbs/read.php?tid=92404
補充:還有兩個比較通用的開源解決方案:
OpenUDID:https://github.com/ylechelle/OpenUDID
SecureUDID:https://github.com/crashlytics/secureudid
