获取唯一标识符即使app 删除重新装后一样

@interfaceAppDelegate ()

+(NSString *)getDeviceIDInKeychain;

@end

NSString *constKEY_UDID_INSTEAD =@"com.myapp.udid.test";

@implementation AppDelegate

+ (id)load:(NSString *)service {

    idret =nil;

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:service];

    //Configure the search setting

    //Since in our simple case we are expecting only a single attribute to be returned (the password) we can 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:(__bridgeNSData *)keyData];

        }@catch(NSException *e) {

            NSLog(@"Unarchive of %@ failed: %@", service, e);

        }@finally{

        }

    }

    if(keyData)

        CFRelease(keyData);

    returnret;

}

+ (void)delete:(NSString *)service {

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:service];

    SecItemDelete((CFDictionaryRef)keychainQuery);

}

+ (void)save:(NSString *)service data:(id)data {

    //Get search dictionary

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:service];

    //Delete old item before add new item

    SecItemDelete((CFDictionaryRef)keychainQuery);

    //Add new object to search dictionary(Attention:the data format)

    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];

    //Add item to keychain with the search dictionary

    SecItemAdd((CFDictionaryRef)keychainQuery,NULL);

}

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {

    return[NSMutableDictionary dictionaryWithObjectsAndKeys:

            (id)kSecClassGenericPassword,(id)kSecClass,

            service, (id)kSecAttrService,

            service, (id)kSecAttrAccount,

            (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,

            nil];

}

+(NSString *)getDeviceIDInKeychain {

    NSString *getUDIDInKeychain = (NSString *)[AppDelegate load:KEY_UDID_INSTEAD];

    NSLog(@"从keychain中获取到的 UDID_INSTEAD %@",getUDIDInKeychain);

    if(!getUDIDInKeychain ||[getUDIDInKeychain isEqualToString:@""]||[getUDIDInKeychain isKindOfClass:[NSNull class]]) {

        CFUUIDRef puuid = CFUUIDCreate(nil);

        CFStringRef uuidString = CFUUIDCreateString(nil, puuid );

        NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy(NULL, uuidString));

        CFRelease(puuid);

        CFRelease(uuidString);

        NSLog(@"\n \n \n _____重新存储 UUID _____\n \n \n  %@",result);

        [AppDelegate save:KEY_UDID_INSTEAD data:result];

        getUDIDInKeychain = (NSString *)[AppDelegate load:KEY_UDID_INSTEAD];

    }

    NSLog(@"最终 ———— UDID_INSTEAD %@",getUDIDInKeychain);

    returngetUDIDInKeychain;

}

你可能感兴趣的:(获取唯一标识符即使app 删除重新装后一样)