iOS 设备唯一UDID获取

使用的方法以及封装的工具类, 在应用里使用使用keyChain,我们需要导入Security.framework。创建一个获取唯一标识的工具类:

XMGKeychain.h 文件中就这一个方法

  @interface XMGKeychain : NSObject

  +(NSString *)getDeviceIDInKeychain;

  @end

XMGKeychain.m 文件中如下

NSString * const KEY_UDID_INSTEAD = @"com.myapp.udid.test";

@implementation XMGKeychain


+(NSString *)getDeviceIDInKeychain
{
NSString *getUDIDInKeychain = (NSString *)[self 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);
    [self save:KEY_UDID_INSTEAD data:result];
    getUDIDInKeychain = (NSString *)[self load:KEY_UDID_INSTEAD];
}
NSLog(@"最终 ———— UDID_INSTEAD %@",getUDIDInKeychain);
return getUDIDInKeychain;
}

#pragma mark - private

  + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
return [NSMutableDictionary dictionaryWithObjectsAndKeys:
        (id)kSecClassGenericPassword,(id)kSecClass,
        service, (id)kSecAttrService,
        service, (id)kSecAttrAccount,
        (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
        nil];
}

  + (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 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);
}

  + (id)load:(NSString *)service {
id ret = nil;
NSMutableDictionary *keychainQuery = [self getKeychainQuery: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:(__bridge NSData *)keyData];
    } @catch (NSException *e) {
        NSLog(@"Unarchive of %@ failed: %@", service, e);
    } @finally {
    }
}
if (keyData)
    CFRelease(keyData);
return ret;
}

+ (void)delete:(NSString *)service {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
SecItemDelete((CFDictionaryRef)keychainQuery);
}

@end

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