天天看點

采用SAMKeychain鑰匙串儲存設備唯一标示與何種情況下同一個手機它存儲的值會變化

相信很多應用都會跟蹤并識别裝置,如何識别一台手機呢?

1.uid是唯一辨別别,它是唯一硬體标示,全球不會重複;

2.你的app若開啟了廣告标示符選項也可以使用廣告标示符号。從

idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

來看它好像是UUID,那麼隻要是uuid那麼就有可能在抹除作業系統是變更,不清楚蘋果怎麼生成的UUID那麼也不能完全肯定。在蘋果商店送出app都提示若沒有設定開啟廣告辨別符但是使用了廣告辨別符号查出來後會永久封研發者證書和賬号。 若app開啟了廣告辨別符但是沒有投放廣告講會被拒絕。

3.使用SAMKeychain鑰匙串儲存設備唯一标示(本質是UUID)。

UUID的優勢将更加明顯。根據使用的特定機制,UUID不僅需要保證是彼此不相同的,或者最少也是與公元3400年之前其他任何生成的通用唯一辨別符有非常大的差別。UUID最少在3000+年内不會重複。

大家知道uuid擷取一次就會變化一次。那麼如何把它當作裝置的唯一辨別符呢?

擷取UUID判斷是:首先判斷本地是否存存UUID,若擷取不到就通過SAMKeychain讀區系統中存儲的UUID,若仍舊讀區不到就生成UUID,存到本地和鑰匙串中。因為是存入系統中,是以删除應用再安裝應用讀出的裝置标示不變。

那同一裝置何時擷取的裝置标示會變呢?系統抹除。

蘋果系統抹除是十分罕見的事情,正式版本的系統不允許系統回退,以下是系統抹除的情況:

1:使用者的手機有問題需要蘋果營業部人員返廠維修的,會抹除系統(這個我遇到過);

2:使用者自己更新失敗,通過iTunes和電腦抹除系統重新安裝系統的(就是你手機更新失敗變成闆磚了,你把它抹除了作業系統,重新安裝了系統。這個我遇到過)。

幸虧蘋果沒有克隆手機的作業系統到另一個手機(黑技術,偷使用者系統資料快捷方式)。讓安卓使用者為克隆手機作業系統發愁去吧!

部分代碼如下:

//擷取裝置唯一标示符
+ (NSString *)UUID;
{
    
    NSString *deviceUUId = [[NSUserDefaults standardUserDefaults] objectForKey:@"uuid"];
    //        NSLog(@"str = %@",str);
    if (deviceUUId){
        return deviceUUId;
    }
    else
    {
        NSString *deviceUUId = [UICKeyChainStore stringForKey:@"uuid" service:@"com.test.taxi"];
        
        if (deviceUUId) {
            //            [[NSUserDefaults standardUserDefaults] setObject:deviceUUId forKey:@"uuid"];
            [BITMobilePassword setUserDefaultsValue:deviceUUId key:@"uuid"];
            return deviceUUId;
        }
        else {
            CFUUIDRef puuid = CFUUIDCreate( nil );
            CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
            NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
            CFRelease(puuid);
            CFRelease(uuidString);
            UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"BitInfo.Pods"];
            NSString *deviceUUID = [result md5String];
            
            [store setString:deviceUUID forKey:@"uuid"];
            //            [[NSUserDefaults standardUserDefaults] setObject:deviceUUId forKey:@"uuid"];
            [BITMobilePassword setUserDefaultsValue:deviceUUId key:@"uuid"];
            //        [store synchronizable];
            NSLog(@"store = %@ str = %@",store,deviceUUId);
            return deviceUUID;
            
        }
    }
    
    return nil;
}