iOS 获取设备唯一标识符

项目中使用的是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中。保证唯一性。
  • 这里用SFHFKeychainUtilsgithub链接来向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了。

你可能感兴趣的:(iOS 获取设备唯一标识符)