设备唯一标识符 UDID,UUID, IDFA,IDFV,
一、UDID:
UDID的全称是Unique Device Identifier,是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。在很多需要限制一台设备一个账号的应用中经常会用到。在iOS5中可以获取到设备的UDID,后来被苹果禁止了。
备注:
代码不让获取
获取UDID的几种方法:
1、Xcode
手机连接电脑后,打开Xcode,然后选择window-->Device and Simulator-->Device
选中自己的手机,就能看到信息,"Identifier"这一栏,便是UDID。
2、蒲公英
https://www.pgyer.com/tools/udid
点击上面链接,扫描二维码,会提示安装一个描述文件,点击安装之后,就会在浏览器中显示出设备信息。长按复制"设备信息UDID"下面的值,就是UDID了。
二、UUID:
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。
开发者可以在应用第一次启动时调用一次,然后将该串存储起来,替代UDID来使用。使用UUID,就要考虑应用被删除后再重新安装时的处理。一个解决的办法是:UUID一般只生成一次,通过 KeyChain 钥匙串保存在iOS系统里面,如果应用删除了,重装应用之后它的UUID还是一样的,除非系统重置。但是不能保证在以后的系统升级后还能用(如果系统保存了该信息就能用)。
/// 获取设备 UUID +(NSString*)createUUID { CFUUIDRef puuid = CFUUIDCreate( nil ); CFStringRef uuidString = CFUUIDCreateString( nil, puuid ); NSString * uuid = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString)); CFRelease(puuid); CFRelease(uuidString); return uuid; }
备注:
不同的应用不同的uuid,
还原设备,uuid变化
卸载重装,uuid不变
如果iPhone系统升级,导致存储路径变化,uuid可能会变化
三、IDFA(identifierForIdentifier)
广告标示符,适用于对外:例如广告推广,换量等跨应用的用户追踪等。是iOS6中另外一个新的方法,提供了一个方法advertisingIdentifier,通过调用该方法会返回一个NSUUID实例,最后可以获得一个UUID,由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序-> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序->通用 -> 关于本机 -> 广告 -> 还原广告标示符),那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户“还原广告标示符”,然后再回到程序中,此时获取广告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。
在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪 里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了。
注意:由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户。
ios14的 idfa 是默认关闭的,当然你可以打开。美国99%的用户选择不会分享 idfa。这对数字媒体平台的广告精准发布是个大障碍,用户画像更将模糊。对用户来说,你的数字设备上收到的个性化广告或相关性广告将变得少得多。
代码:
#import <AdSupport/AdSupport.h>
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
备注:
还原设备,idfa变化 (设置程序 -> 通用 -> 还原 -> 还原位置与隐私)
还原广告标识符,idfa变化 (设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符)
在隐私-Apple广告-个性化广告中,iOS14以上默认是关闭的,所以取不到idfa
idfa可能会取不到值
每个设备只有一个IDFA,不同APP在同一设备上获取IDFA的结果是一样的
设备重启不会产生新的IDFA
四、IDFV(identifierForVendor)
Vindor标示符,适用于对内:例如分析用户在应用内的行为等。
是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的DNS反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于 com.somecompany.appone,com.somecompany.apptwo 这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。
注意:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同。
代码:
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
备注:
idfv的值是一定能取到
同一台设备上,来自同一个供应商的 App,IDFV 相同。
同一台设备上,来自不同厂商的 App,IDFV 不同。
不同设备的 IDFV 不同,与供应商无关。换言之,即使同一个厂商的 App,在不同设备上 IDFV 也不相同。
当 iOS 设备上存在同一厂商的其他应用时,删除 App 重装,IDFV 保持不变。
删除 iOS 设备上同一厂商全部 App,重新安装 App,IDFV 会发生改变。
使用 Xcode 安装测试版本或 ad-hoc 包时,IDFV 会发生改变。
还原设备,idfv变化 (设置程序 -> 通用 -> 还原 -> 还原位置与隐私)
五、IMEI
IMEI:英文名称是:International Mobile Equipment Identity,是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的。每一部手机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录。手机用户可以在手机中查到自己手机的IMEI码。因为隐私问题,苹果用户在iOS5以后不能再获取IMEI的值了。如果开发的App不上架苹果商店,又想获取IMEI值,可参考此链接,获取IMEI值。
备注:
不让获取
六、IMSI
IMSI:英文名称是:International Mobile Subscriber Identification Number,是国际移动用户识别码的缩写,IMSI分为两部分:一部分叫MCC(Mobile Country Code移动国家码),MCC的资源由国际电联(ITU)统一分配,唯一识别移动用户所属的国家,MCC共3位,中国地区的MCC为460;另一部分叫MNC(Mobile Network Code 移动网络号码),MNC用于识别移动客户所属的移动网络运营商。MNC由二到三个十进制数组成,例如中国移动MNC为00、02、07,中国联通的MNC为01、06、09,中国电信的MNC为03、05、11。
七、MAC
MAC地址:Mac地址是唯一的,unix有系统调用可以获取Mac地址。iPhone可能有多个Mac地址,wifi的地址、以及SIM卡的地址。一般来讲,我们取en0的地址,因为它是iPhone的wifi的地址,是肯定存在的(例外情况依然有:市面上依然存在一部分联通的阉割版无wifi的iPhone)。Mac地址涉及到隐私,不应该胡乱将用户的Mac地址传播,所以我们需要将Mac地址进行hash之后再去使用。同样因为隐私问题,在iOS7以后,苹果禁止获取MAC地址,系统现在只会返回02:00:00:00:00:00虚拟的地址。
备注:
不让获取