获取唯一设备ID

Posted xbios

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取唯一设备ID相关的知识,希望对你有一定的参考价值。

[[[UIDevice currentDevice] identifierForVendor] UUIDString];
根据APP供应商分配,APP卸载重装后,会重新生成。
需要通过keychain存储配合使用。

@interface YLKeyChainStore : NSObject
/**保存数据至钥匙串中*/

  • (void)save:(NSString*)service data:(id)data;
    /**从钥匙串中加载数据*/
  • (id)load:(NSString*)service;
    /**删除数据*/
  • (void)deleteKeyData:(NSString*)service;
    /** 获取UUID*/
  • (NSString *)getUUIDByKeyChain;
    @end

/**通过 key 获取数据*/

  • (NSMutableDictionary)getKeychainQuery:(NSString)service {
    service = [self handleServiceKeyWith:service];
    return[NSMutableDictionary dictionaryWithObjectsAndKeys:
    (id)kSecClassGenericPassword,(id)kSecClass,
    service,(id)kSecAttrService,
    service,(id)kSecAttrAccount,
    (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
    nil];
    }

  • (NSString)handleServiceKeyWith:(NSString)service {
    return [NSString stringWithFormat:@"%@%@",AppBundleID(),service];
    }

  • (void)save:(NSString)service data:(id)data{
    //Get search dictionary
    NSMutableDictionary
    keychainQuery = [self getKeychainQuery:service];
    //Delete old item before add new item
    SecItemDelete((CFDictionaryRef)keychainQuery);
    //Add new object to searchdictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data]forKey:(id)kSecValueData];
    //Add item to keychain with the searchdictionary
    SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
    }

  • (id)load:(NSString)service {
    id ret =nil;
    NSMutableDictionary
    keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    //Since in our simple case we areexpecting only a single attribute to be returned (the password) wecan set the attribute kSecReturnData to kCFBooleanTrue
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    CFDataRef keyData =NULL;
    if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef)&keyData) ==noErr){
    @try{
    ret =[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData*)keyData];
    }@catch(NSException
    e) {
    NSLog(@"Unarchiveof %@ failed: %@",[self handleServiceKeyWith:service], e);
    }@finally{
    }
    }
    if(keyData)
    CFRelease(keyData);
    return ret;
    }

  • (void)deleteKeyData:(NSString)service {
    NSMutableDictionary
    keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((CFDictionaryRef)keychainQuery);
    }

/** 获取UUID*/

  • (NSString )getUUIDByKeyChain {
    NSString
    key = @"uuid";
    // 这个key的前缀最好是你的BundleID
    NSStringstrUUID = (NSString)[YLKeyChainStore load:key];
    //首次执行该方法时,uuid为空
    if([strUUID isEqualToString:@""] || !strUUID)
    {
    strUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    //将该uuid保存到keychain
    [YLKeyChainStore save:key data:strUUID];
    }
    return strUUID;
    }

以上是关于获取唯一设备ID的主要内容,如果未能解决你的问题,请参考以下文章

Android设备唯一ID实现方案

Android中获取唯一的id

UWP开发-获取设备唯一ID

如何在 android 10 中获取唯一的设备 ID?

Android能够获取到唯一的设备ID吗

如何获取 Windows Phone 8.1 的设备唯一 ID?