iOS开发之设备唯一标识UDID、OpenUDID、UUID、IMEIIMSI、IDFA、IDFV

时间:2024-04-13 15:21:55

UDID

Unique Device Identifier,顾名思义,它就是苹果设备的唯一识别码,它由40个字符的字母和数字组成。
注:iOS5后废弃(使用方法获取上传存在下架风险)

注:为什么苹果要在应用中禁止使用呢? 因为用户隐私问题,比如我开发了5款App,很多用户都下载了这5款App并使用,如果我能轻易的获取这些用户的UDID,其实我能拼凑出用户的很多信息。

OpenUDID

设备的识别码,每台iOS设备的OpenUDID是通过第一个带有OpenUDID SDK包的App生成。

注:如果你完全删除全部带有OpenUDID SDK包的App(比如恢复系统等),那么OpenUDID会重新生成,而且和之前的值会不同,相当于新设备。

UUID

Universally Unique Identifier,通用唯一标识符,是一个32位的十六进制序列,UUID在某一时空下是唯一的。

MAC Address

MAC(Media Access Control或者Medium Access Control)地址,或称为物理地址、硬件地址,用来定义网络设备的位置,采用十六进制数表示,共六个字节(48位)。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。MAC地址是网卡决定的,是固定的。

注:iOS7后废弃(使用方法获取到的mac地址全部都变成了02:00:00:00:00:00)

IMEI,IMSI

IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的。

注:iOS5后废弃,只能通过私有Api能获取(存在下架风险)

IDFA

广告标示符,它是由系统存储着的,iOS6及以后使用。但是如果用户还原位置与隐私的话这个广告标识符就会重新生成。而且用户可以在设置–隐私–广告里面限制广告跟踪来限制IDFA获取,一般用户都不知道有这个,哈哈,不过还是不能用来做唯一标识的。

注:由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户

IDFV

iOS 6.0及以后使用,根据vendor的值,如果vendor相同,则返回同一字符串;如果vendor不同,则返回不同的字符串。
Vender是指应用提供商,根据xcode文档解释,正常情况下,会根据App Store提供的数据进行判断。但是如果app不是通过app store进行安装的(如企业应用或开发调试阶段),那么会根据bundle ID判断。

注:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同。

以上方法看来够呛,怎么办呢???

先说说UUID吧,
获取设备的UUID,比较简单

NSString *deviceUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
NSLog(@"%@",deviceUUID);

打印结果:BDAF6B4D-5DC0-4AEF-BCF8-6C7EFC94DE97

iOS开发之设备唯一标识UDID、OpenUDID、UUID、IMEI\IMSI、IDFA、IDFV
当我们从真机上卸载这个软件重新安装的时候,UUID就变了(模拟器每次都变)。
如果用UUID来作为唯一识别符的话,我们只能把他存在一个地方,让软件卸载的时候他也不会丢失,NSUserDefaults和FMDB等本地存储已经不能再完成他们的使命了。下面登场我们的主角:keychain

keychain

keyChain是一个相对独立的空间,当程序替换,删除时并不会删除keyChain的内容,这个要比Library/Cache好。刷机,恢复出厂应该就没有了。我们把keyChain看做一个Dictionary,所有数据都以Key-Value形式存储,可以对其进行add,update,get,delete四个操作,一个应用的keyChain都有两个访问区,私有区和公有区,私有区是一个个sandbox,本程序储存的对其他程序不可见,想将数据存在公有区,则需要声明公有区的名称,官方名称“keychain access group”

"yourAppID.com.yourCompany.whatever"是就是你要起的公共区名称,除了whatever字段可以随便定之外,其他的都必须如实填写。这个文件的路径要配置在Project->buildsetting- >Code Signing Entitlements里,否则公共区无效,配置好后,须用你正式的证书签名编译才可通过,否则xcode会弹框告诉你code signing有问题。所以,苹果限制了你只能同公司的产品共享KeyChain数据,别的公司访问不了你公司产品的KeyChain。

iOS的keychain服务提供了一种安全的保存私密信息(密码,***,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。

进入设备的时候存入UUID,以后的时候读取他。就算卸载,读取出来的值还是第一次进入软件的时候的UUID,实现了设备的唯一标识符。(注意写的地方,不要每次运行都重新存储,不要用模拟器)。







我的真正身份是改变社会风气,风靡万千少女,提高青年人内涵,刺激软件市场,玉树临风的搬砖工?钢丝球君,英文名字叫Tom Siebel

微信扫码?可以进行技术交流,欢迎提问!!!
iOS开发之设备唯一标识UDID、OpenUDID、UUID、IMEI\IMSI、IDFA、IDFV
可在问题下面输入‘微信号’,拉你进微信技术交流群