首页 > 编程知识 正文

获取设备唯一标识,uniapp获取的的deviceid是设备唯一的吗

时间:2023-05-04 21:49:52 阅读:201395 作者:3298

使用的方法以及封装的工具类, 在应用里使用使用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 dictionaryNSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Delete old item before add new itemSecItemDelete((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 dictionarySecItemAdd((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复制代码

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。