iOS获取设备的唯一标识的方法

本文详细介绍了在iOS中获取设备唯一标识的各种方法,包括UDID、UUID、OpenUDID、MAC Address、IDFA和IDFV的原理和问题。由于苹果政策限制,UDID和OpenUDID已不再适用,而UUID每次安装会变化,IDFA和IDFV在特定条件下会改变。作者建议使用UUID存储在KeyChain中以实现设备的持久化唯一标识。
摘要由CSDN通过智能技术生成

网上有很多的获取方法,最常用的也是苹果推荐的方法是:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值