因公司需要一個手機多應(yīng)用唯一標識,所以查找了一些資料,然后總結(jié)了一下各種方法。
大概寫了一些常用于手機唯一標識的一些方法,看完后可對比一下,看哪些比較適合需求!
1.UDID
是蘋果IOS設(shè)備的唯一識別碼,它由40個字符的字母和數(shù)字組成。每臺iOS設(shè)備的UDID是唯一且永遠不會改變,ios7中已經(jīng)完全禁用了,現(xiàn)在已經(jīng)獲取不到UDID了。
2. Mac地址
IOS7之后mac地址返回的值已經(jīng)固定,不能作為唯一標識符了。
3.供應(yīng)商標示符(IDFV)
identifierForVendor對供應(yīng)商來說是唯一的一個值,也就是說,由同一個公司發(fā)行的的app在相同的設(shè)備上運行的時候都會有這個相同的標識符。然而,如果用戶刪除了這個供應(yīng)商的app然后再重新安裝的話,這個標識符就會不一致。
4.OpenUDID
原理是利用iOS系統(tǒng)中的UIPasteboard剪貼板類,iOS7.0以前iOS是所有的應(yīng)用都可以共享同一個剪貼板存儲內(nèi)容,但是iOS7之后只有在同一CFBundleIdentifier標識下的App才能共享內(nèi)容。
5.UUID
UUID是Universally Unique Identifier的縮寫,每次獲取的值都不相同,但每個值都是唯一的,可以選擇存入keychain存儲,實現(xiàn)keychain數(shù)據(jù)共享的話,可以作為多應(yīng)用的唯一標識
6. 廣告標示符(IDFA)
主要用于廣告,可能會獲取不到,iOS用戶也可以 設(shè)置|隱私|廣告追蹤 里重置此id的值,不適用作為手機唯一標識
鑰匙串多應(yīng)用數(shù)據(jù)共享
鑰匙串里的值并不隨著客戶刪除應(yīng)用就刪除了,這樣為我們跨APP唯一標識提供了一個很好的方法。
我們只需要創(chuàng)建一個UUID,保存到鑰匙串中,在程序中把鑰匙串數(shù)據(jù)共享打開,加入我們需要分享的APP的bundle identifier,這樣我們只要在每個APP中判斷UUID是否存在,存在的話直接拿來用,不存在的話,創(chuàng)建一個UUID存到鑰匙串,這樣就可以做成一個多應(yīng)用間唯一標識。
1.下面是大概的流程
獲取UUID
+(NSString*)UUID
{
CFUUIDRefpuuid=CFUUIDCreate(nil);
CFStringRefuuidString=CFUUIDCreateString(nil,puuid);
NSString*result=(NSString*)CFBridgingRelease(CFStringCreateCopy(NULL,uuidString));
CFRelease(puuid);
CFRelease(uuidString);
NSLog(@"uuid=%@",result);
returnresult;
}
鑰匙串方法與共享
查看是否有UUID,有就用,沒有的話就添加UUID
NSString*accountKey=@"user_token_sharing";
NSString*accountName=@"Citics";
if([GIKeychaingetKeychainDataForKey:accountKey]) {
NSLog(@"該key內(nèi)容已經(jīng)存在,為:%@",[GIKeychaingetKeychainDataForKey:accountKey]);
}else{
NSLog(@"該key不存在,準備寫入");
[GIKeychainaddKeychainData:accountNameforKey:accountKey];
NSLog(@"已寫入,該key內(nèi)容:%@",[GIKeychaingetKeychainDataForKey:accountKey]);
}
鑰匙串獲取UUID
+(id)getKeychainDataForKey:(NSString*)key{
idret=nil;
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:key];
//Configure the search setting
//Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
[keychainQuerysetObject:(id)kCFBooleanTrueforKey:(__bridgeid)kSecReturnData];
[keychainQuerysetObject:(__bridgeid)kSecMatchLimitOneforKey:(__bridgeid)kSecMatchLimit];
CFDataRefkeyData=NULL;
if(SecItemCopyMatching((__bridgeCFDictionaryRef)keychainQuery, (CFTypeRef*)&keyData)==noErr) {
@try{
ret=[NSKeyedUnarchiverunarchiveObjectWithData:(__bridgeNSData*)keyData];
}@catch(NSException*e) {
NSLog(@"Unarchive of %@ failed: %@",key,e);
}@finally{
? ? ? ? ? ? ? ? }
? ? ? ?}
if(keyData)
CFRelease(keyData);
returnret;
}
?
鑰匙串添加UUID
+(void)addKeychainData:(id)dataforKey:(NSString*)key{
//Get search dictionary
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:key];
//Delete old item before add new item
SecItemDelete((__bridgeCFDictionaryRef)keychainQuery);
//Add new object to search dictionary(Attention:the data format)
[keychainQuerysetObject:[NSKeyedArchiverarchivedDataWithRootObject:data]forKey:(__bridgeid)kSecValueData];
//Add item to keychain with the search dictionary
SecItemAdd((__bridgeCFDictionaryRef)keychainQuery,NULL);
}
鑰匙串共享

到此,我們需要在共享的APP上按以上流程寫一遍,這樣就可以成功定義多個應(yīng)用唯一的標識了!
http://pan.baidu.com/s/1bp887yJ
注意:鑰匙串中共享只支持team間的APP共享,不支持與其他team的APP之間共享!