应用场景
本来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 <SAMKeychain/SAMKeychain.h>
+ (void)setPassword:(NSString *)password forAccount:(NSString *)account {
[SAMKeychain setPassword:password forService:kKJTKeyChainServiceName account:account];
}
+ (NSString *)passwordForAccount:(NSString *)account {
return [SAMKeychain passwordForService:kKJTKeyChainServiceName account:account];
}