网上有很多的获取方法,最常用的也是苹果推荐的方法是:
NSString *uuid0 = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
NSLog(@"--1唯一识别码uuid-->%@", uuid0);
也有文章说:
CFUUIDRef puuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
NSString * uuid = (NSString *)CFStringCreateCopy( NULL, uuidString);
CFRelease(puuid);
CFRelease(uuidString);
NSLog(@"----2唯一识别码uuid-->%@", uuid);
return [uuid autorelease];
但是上面的方法,在app重新安装之后,会重新生成新的uuid,这个uuid就不是唯一的了。
要想解决上面的问题,就只能是把uuid保存到手机文件里面,只要不刷机,下一次获取的时候,先判断文件里面是否存在,没有则写入,有则直接读取;只有这样才可以保证uuid的唯一,卸载重装app也不会受到影响,下面是实现代码:
//AppController.h
#import <Foundation/Foundation.h>
#import <Security/Security.h>
- (NSString *)getDeviceIDInKeychain;
//AppController.mm
NSString * const KEY_UDID_INSTEAD = @"com.myapp.udid.test";
-(NSString *)getDeviceIDInKeychain
{
NSString *getUDIDInKeychain = (NSString *)[AppController 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);
[AppController save:KEY_UDID_INSTEAD data:result];
getUDIDInKeychain = (NSString *)[AppController load:KEY_UDID_INSTEAD];
}
NSLog(@"最终 ———— UDID_INSTEAD %@",getUDIDInKeychain);
return getUDIDInKeychain;
}
//调用测试
[self getDeviceIDInKeychain];
//输出结果信息(前面两次是重启app,第三次是覆盖安装,最后一次是卸载安装)
2019-09-10 17:25:16.234553+0800 llh_cocos04-mobile[621:123195] [DYMTLInitPlatform] platform initialization successful
2019-09-10 17:25:16.302116+0800 llh_cocos04-mobile[621:123075] [NetworkInfo] Signal strength query returned error: Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied", descriptor: <CTServiceDescriptor 0x282ca7800, domain=1, instance=1>
2019-09-10 17:25:16.475819+0800 llh_cocos04-mobile[621:123075] 设备型号-->iPhone 6s
2019-09-10 17:25:16.476890+0800 llh_cocos04-mobile[621:123075] 当前时间-->17:25
2019-09-10 17:25:16.534251+0800 llh_cocos04-mobile[621:123075] iPhone名称-->“tony”的 iPhone
2019-09-10 17:25:16.534323+0800 llh_cocos04-mobile[621:123075] 电池电量-->-1.000000
2019-09-10 17:25:16.536294+0800 llh_cocos04-mobile[621:123075] --1唯一识别码uuid-->4E0A38DB-65D5-4C26-8FE3-0A35373D8B9E
2019-09-10 17:25:16.536363+0800 llh_cocos04-mobile[621:123075] ----2唯一识别码uuid-->AFD1D2DA-4476-4F9E-881A-D86AFE1C7D55
2019-09-10 17:25:16.536397+0800 llh_cocos04-mobile[621:123075] screenX-->1136.000000
2019-09-10 17:25:16.536446+0800 llh_cocos04-mobile[621:123075] screenY-->640.000000
2019-09-10 17:25:16.536472+0800 llh_cocos04-mobile[621:123075] 设备wifi----
2019-09-10 17:25:16.537042+0800 llh_cocos04-mobile[621:123075] 设备wifi-->3
2019-09-10 17:25:16.540024+0800 llh_cocos04-mobile[621:123075] 从keychain中获取到的 UDID_INSTEAD (null)
2019-09-10 17:25:16.540094+0800 llh_cocos04-mobile[621:123075]
_____重新存储 UUID _____
F6E5B3AC-776C-429D-AF0E-EA397420FBE0
2019-09-10 17:25:16.549913+0800 llh_cocos04-mobile[621:123075] 最终 ———— UDID_INSTEAD F6E5B3AC-776C-429D-AF0E-EA397420FBE0
2019-09-10 17:25:16.589835+0800 llh_cocos04-mobile[621:123075] Metal GPU Frame Capture Enabled
2019-09-10 17:26:53.210949+0800 llh_cocos04-mobile[628:123606] [DYMTLInitPlatform] platform initialization successful
2019-09-10 17:26:53.264851+0800 llh_cocos04-mobile[628:123562] [NetworkInfo] Signal strength query returned error: Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied", descriptor: <CTServiceDescriptor 0x2807d64e0, domain=1, instance=1>
2019-09-10 17:26:53.309921+0800 llh_cocos04-mobile[628:123562] 设备型号-->iPhone 6s
2019-09-10 1