手機多應(yīng)用通用唯一標識

因公司需要一個手機多應(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)用唯一的標識了!

GIKeychain下載地址

http://pan.baidu.com/s/1bp887yJ

注意:鑰匙串中共享只支持team間的APP共享,不支持與其他team的APP之間共享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容