项目中使用的是IDFA + UUID + keychain的方式。 其实个人觉得IDFV + keychain就够了
IDFA + UUID + keychain
- IDFA( 广告标识符,共32位:格式为 8-4-4-4-12),可被重置,用户也可以限制广告追踪。iOS 10以后用户限制广告追踪的话,则会获取到一串无意义
00000000-0000-0000-0000-000000000000
获取方式:
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
- UUID (Universally Unique Identifiers:通用唯一标识符)
获取方式:
NSUUID.UUID.UUIDString;
- 项目中IDFA如果为0时取 UUID。IDFA可能会变,取到之后保存在keychain中。保证唯一性。
- 这里用
SFHFKeychainUtils
github链接来向keychain中存取数据。
/**
* 返回唯一设备标识
*
* @return 设备标识
*/
#define kDeviceIdentifier @"00000000-0000-0000-0000-000000000000"
#define deviceIDCacheKey @"deviceIdentifier"
+(NSString*)deviceIdentifier{
NSString * deviceIdentifier = [[NSUserDefaults standardUserDefaults] valueForKey:deviceIDCacheKey];
if (!deviceIdentifier) {
//从钥匙串中获取唯一设备标识
deviceIdentifier = [SFHFKeychainUtils getPasswordForUsername:deviceIDCacheKey andServiceName:bundleIdentifier error:nil];
if(!deviceIdentifier){
//IDFV。用IDFV就不用判断是否有无意义的0串了
// deviceIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
//IDFA
deviceIdentifier = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
if ([deviceIdentifier isEqual:kDeviceIdentifier]) {
deviceIdentifier = NSUUID.UUID.UUIDString;
}
[self saveDeviceIdentifier:deviceIdentifier];
}
[[NSUserDefaults standardUserDefaults] setValue:deviceIdentifier forKey:deviceIDCacheKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return deviceIdentifier;
}
IDFV + keychain
用IDFV就不用判断是否有无意义的0串了。也就不用再取一遍UUID了。
网友评论