因公司需要一個(gè)手機(jī)多應(yīng)用唯一標(biāo)識(shí),所以查找了一些資料学密,然后總結(jié)了一下各種方法。
大概寫(xiě)了一些常用于手機(jī)唯一標(biāo)識(shí)的一些方法传藏,看完后可對(duì)比一下则果,看哪些比較適合需求幔翰!
1.UDID
是蘋(píng)果IOS設(shè)備的唯一識(shí)別碼,它由40個(gè)字符的字母和數(shù)字組成西壮。每臺(tái)iOS設(shè)備的UDID是唯一且永遠(yuǎn)不會(huì)改變遗增,ios7中已經(jīng)完全禁用了,現(xiàn)在已經(jīng)獲取不到UDID了款青。
2. Mac地址
IOS7之后mac地址返回的值已經(jīng)固定做修,不能作為唯一標(biāo)識(shí)符了。
3.供應(yīng)商標(biāo)示符(IDFV)
identifierForVendor對(duì)供應(yīng)商來(lái)說(shuō)是唯一的一個(gè)值抡草,也就是說(shuō)饰及,由同一個(gè)公司發(fā)行的的app在相同的設(shè)備上運(yùn)行的時(shí)候都會(huì)有這個(gè)相同的標(biāo)識(shí)符。然而康震,如果用戶(hù)刪除了這個(gè)供應(yīng)商的app然后再重新安裝的話(huà)燎含,這個(gè)標(biāo)識(shí)符就會(huì)不一致。
4.OpenUDID
原理是利用iOS系統(tǒng)中的UIPasteboard剪貼板類(lèi)腿短,iOS7.0以前iOS是所有的應(yīng)用都可以共享同一個(gè)剪貼板存儲(chǔ)內(nèi)容屏箍,但是iOS7之后只有在同一CFBundleIdentifier標(biāo)識(shí)下的App才能共享內(nèi)容。
5.UUID
UUID是Universally Unique Identifier的縮寫(xiě)橘忱,每次獲取的值都不相同赴魁,但每個(gè)值都是唯一的,可以選擇存入keychain存儲(chǔ)钝诚,實(shí)現(xiàn)keychain數(shù)據(jù)共享的話(huà)颖御,可以作為多應(yīng)用的唯一標(biāo)識(shí)
6. 廣告標(biāo)示符(IDFA)
主要用于廣告,可能會(huì)獲取不到凝颇,iOS用戶(hù)也可以 設(shè)置|隱私|廣告追蹤 里重置此id的值潘拱,不適用作為手機(jī)唯一標(biāo)識(shí)
鑰匙串多應(yīng)用數(shù)據(jù)共享
鑰匙串里的值并不隨著客戶(hù)刪除應(yīng)用就刪除了,這樣為我們跨APP唯一標(biāo)識(shí)提供了一個(gè)很好的方法拧略。
我們只需要?jiǎng)?chuàng)建一個(gè)UUID芦岂,保存到鑰匙串中,在程序中把鑰匙串?dāng)?shù)據(jù)共享打開(kāi)辑鲤,加入我們需要分享的APP的bundle identifier盔腔,這樣我們只要在每個(gè)APP中判斷UUID是否存在,存在的話(huà)直接拿來(lái)用月褥,不存在的話(huà)弛随,創(chuàng)建一個(gè)UUID存到鑰匙串,這樣就可以做成一個(gè)多應(yīng)用間唯一標(biāo)識(shí)宁赤。
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舀透,有就用,沒(méi)有的話(huà)就添加UUID
NSString*accountKey=@"user_token_sharing";
NSString*accountName=@"Citics";
if([GIKeychaingetKeychainDataForKey:accountKey]) {
NSLog(@"該key內(nèi)容已經(jīng)存在,為:%@",[GIKeychaingetKeychainDataForKey:accountKey]);
}else{
NSLog(@"該key不存在决左,準(zhǔn)備寫(xiě)入");
[GIKeychainaddKeychainData:accountNameforKey:accountKey];
NSLog(@"已寫(xiě)入愕够,該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上按以上流程寫(xiě)一遍,這樣就可以成功定義多個(gè)應(yīng)用唯一的標(biāo)識(shí)了惑芭!
http://pan.baidu.com/s/1bp887yJ
注意:鑰匙串中共享只支持team間的APP共享坠狡,不支持與其他team的APP之間共享!