iOS获取设备唯一标识:UDID、IDFA、IDFV、OpenIDFA、SimulateIDFA等.
2020/7/3 23:27:29
本文主要是介绍iOS获取设备唯一标识:UDID、IDFA、IDFV、OpenIDFA、SimulateIDFA等.,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. UDID
UDID全称是Unique Device Identifier,顾名思义,它就是苹果iOS设备的唯一标识码,它由40个字符的字母和数字组成。在很多需要限制一台设备一个张红的应用中经常会用到。哎iOS5中可以获取到设备的UDID,iOS7中已经完全禁用了它。iOS7之前的使用app如果在iOS7以上的设备运行,它不会反悔设备的UDID,而是会返回一串字符串,以FFFFF开头,跟着一串十六进制值。
获取:[[UIDevice currenDevice] uniqueIdentifier]
废弃:iOS6
2.IDFV
IDFV是通过BundleID的DNS反串的前两部分进行匹配,如果相同,返回的值就相同。
例如:com.company.hello和com.company.word这两个bundleID就是同一个Vender生成的IDFV就是相同的,如果用户把所有此Vender的app都卸载,再次获取IDFV就会和之前的不同,会被重置。
获取方式:[[[UIDevice currentDevice] identifierForVendor] UUIDString]
试用:iOS6+
注意:无法保证唯一标识
3.IDFA
该标识是用来进行广告标记,进行推送广告。
用户可以在设置->隐私->广告,进行重置此ID的值,获取直接关闭,关闭之后获取的值是000000000xxxxx
获取:[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
试用:iOS6+
注意:该值在用户没有对系统设置进行修改的时候是惟一的,但是用户可以进行手动操作关闭或者重置
4.MAC
在iOS7之后,无法获取到值(是一个固定值) 废弃:iOS7+
5.KeyChain
简介:iOS整个系统中有一个KeyChain,每个程序都可以往KeyChain中记录数据,而且只能读取到自己程序记录在KeyChain中的数据。而且就算我们程序删除掉,系统经过在升级,重新安装应用,获取到的值还是不改变,(系统还原、刷机除外)。因此我们可以将UUID的字符串存储在KeyChain中,然后下次直接从KeyChain获取唯一标识例如:
+ (NSString *)UUID { KeychainItemWrapper *keyChainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MYAppID" accessGroup:@"com.test.app"]; NSString *UUID = [keyChainWrapper objectForKey:(__bridge id)kSecValueData]; if (UUID == nil || UUID.length == 0) { UUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; [keyChainWrapper setObject:UUID forKey:(__bridge id)kSecValueData]; } return UUID; } 复制代码
6.AppleAccount
简介:虽然Apple在iOS6之后禁用了UUID的获取,但是可以通过私有API的方式获取UUID,但是这种方式有存在风险,比如私有API会有变更的风险,导致无法获取,获取私有API会影响AppStore审核,只有在越狱设备上可以使用
可以通过dump的方式获取私有头文件
@class NSObject<OS_dispatch_semaphore>, APSConnection, NSData; @interface AADeviceInfo : NSObject { APSConnection *_apsConnection; BOOL _tokenDone; NSData *_token; NSObject<OS_dispatch_semaphore> *_tokenSema; } + (id)userAgentHeader; + (id)signatureWithDictionary:(id)arg1; + (id)apnsToken; + (id)serialNumber; + (id)clientInfoHeader; + (id)appleIDClientIdentifier; + (id)productVersion; + (id)osVersion; + (id)udid; + (id)infoDictionary; - (id)wifiMacAddress; - (id)regionCode; - (id)deviceClass; - (id)osName; - (id)productType; - (id)apnsToken; - (id)serialNumber; - (id)deviceInfoDictionary; - (id)appleIDClientIdentifier; - (id)productVersion; - (id)osVersion; - (id)udid; - (id)init; - (void).cxx_destruct; - (id)buildVersion; @end 复制代码
获取:[AADeviceInfo udid]
使用方法:在项目中将真机上的AppleAccount.framework
框架导出,引入Xcode工程中,利用runtime或者直接使用该类就行。
(细节补充:导出AppleAccount.framework
后,进入AppleAccount.framework
的根目录,新建Headers文件夹,然后将dump出的头文件放在Headers目录,就可以像引用第三方framework一样在项目中使用,导出framework需要通过越狱设备)
二、通过算法计算得出唯一标识
1.SimulateIDFA
简介:SimulatorIDFA是通过设备的各种信息计算整合成的一串MD5值,用于标记不同设备
使用:
CoreTelephony.framework https://github.com/youmi/SimulateIDFA (下载代码) 复制代码
注意:SimulatorIDFA设备信息包括了系统版本,如果升级了就会出现唯一标识出现改变。
2.OpenIDFA
简介:OpenIDFA 是 Yann Lechelle的一个开源库。同是IDFA的替换方案
也是通过算法计算设备的一些信息,整合的一个字符串.
时效性对比:
- OpenIDFA
每天获取的值都不一样 - SimulateIDFA
SimulateIDFA分两部分,前16位是在系统升级的时候才会变化,后16位用户的某些行为可能会导致值变化(例如:重启手机、修改设备名称、修改手机本地语言)
总结:
OpenIDFA 有一些限制,生成的IDFA会每天变化,在一些极端条件下重复率比较高。 SimulateIDFA在这方面有更好的表现
检查是否有应用IDFA
检查我们项目中是否使用广告标示符,其实就是查看我们-
- framework中是否有个叫做AdSupport.framework的框架;
- 如果检查framework没有,可能是我们接入的第三方里面有,用以下方法检查第三方中是否包含有IDFA版本;
(1)打开终端cd到要检查的文件的目录; (2)执行命令:grep -r advertisingIdentifier .(注意别少了点); 复制代码
参考地址:iOS获取设备UUID和IDFA
这篇关于iOS获取设备唯一标识:UDID、IDFA、IDFV、OpenIDFA、SimulateIDFA等.的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-10-05Swift语法学习--基于协议进行网络请求
- 2022-08-17Apple开发_Swift语言地标注释
- 2022-07-24Swift 初见
- 2022-05-22SwiftUI App 支持多语种 All In One
- 2022-05-10SwiftUI 组件参数简写 All In One
- 2022-04-14SwiftUI 学习笔记
- 2022-02-23Swift 文件夹和文件操作
- 2022-02-17Swift中使用KVO
- 2022-02-08Swift 汇编 String array
- 2022-01-30SwiftUI3.0页面反向传值