天天看点

采用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;
}