关于iOS设备号

应用场景

本来iOS有专门的UUID来代表设备,这个设备号用来统计,分析用户行为,定位线上bug等还是很有作用的。
后来UUID不能用了,使本来很简单的事情变得很复杂。

采用idfv

UUID不能用,MAC地址不能用,IMEI不能用,那用什么呢?
idfa,这是广告标识符,本人很不喜欢,要额外加一个framework,审核的时候还要点上固定的套路,麻烦。并且,用户还可以关闭,让你取不到。
idfv,这个是苹果专门用来标识用户的API,永远都能取到。当然,唯一性比以前的UUID要差很远,不知道苹果是怎么想的,大概是脑袋被驴踢了。基本上只能用这个了,复杂的自定义算法除外。

// 唯一标识符
+ (NSString *)kjtIdfvUuidString {
    return [[UIDevice currentDevice].identifierForVendor UUIDString];
}

关于唯一性

借助钥匙串,取一次就保存起来,以后就从钥匙串取了。好处是就算删了应用,钥匙串的内容还是在的。
钥匙串的本意是用来存用户名和密码,其他内容也可以存啊。比如这里,将idfv当做密码,取一个固定名字当做account,就差不多了。

+ (NSString *)idString {
    NSString *idString = [KJTKeyChain passwordForAccount:kKJTDeviceIdAccount];
    if (![idString kjtIsNotBlank]) {
        idString = [UIDevice kjtIdfvUuidString];
        [KJTKeyChain setPassword:idString forAccount:kKJTDeviceIdAccount];
    }
    return [idString copy];
}

关于钥匙串操作

访问钥匙串还是很麻烦的,那些API还真不是人用的。这里同样怀疑苹果的脑袋被门夹了,这么难用的API是哪个蠢货设计的?
幸好有一个好用的第三方库SAMKeychain
,可以让我们很方便地操作钥匙串了。

#import 

+ (void)setPassword:(NSString *)password forAccount:(NSString *)account {
    [SAMKeychain setPassword:password forService:kKJTKeyChainServiceName account:account];
}

+ (NSString *)passwordForAccount:(NSString *)account {
    return [SAMKeychain passwordForService:kKJTKeyChainServiceName account:account];
}

参考文章

iOS 获取设备唯一标示符的方法

钥匙串(KeyChain)保存和获取用户名和密码

UUID DeviceID 及获取IPhone唯一标识符

iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

你可能感兴趣的:(关于iOS设备号)