iOS 获取设备的唯一标识
有时候,我们需要记录一下设备的唯一标识,比如标识这个设备是不是已经发过促销券了或者是否下载试用过app等等。最简单 的方法就是获取设备的UDID#[UIDevice currentDevice] uniqueIdentifier]#,但是iOS6之后苹果担心泄露用户信息就封掉了这个方法,后来也可以通过mac地址来标记唯一标识#[self macAddress]#,但是没过多久也同样被封掉了。那么现在该通过什么方式来获取唯一标识呢?
DeviceCheck
iOS11之后可以通过DeviceChek(设备检查)来记录设备的标识,这个是Apple官方在iOS11新提供的一个API,可以用来获取当前设备在某个服务器中的状态。
DeviceCheck 允许开发者通过开发者自己的服务器与 Apple 服务器通讯,并为单个设备设置两个 bit 的数据。
简单说,你在设备上用 DeviceCheck API 生成一个 token,然后将这个 token 发给自己的服务器,再由自己的服务器与 Apple 的 API 进行通讯,来更新或者查询该设备的值。这两个 bit 的数据用来追踪用户比如是否已经领取奖励这类信息。
DeviceCheck可以帮助软件开发者们准确记录 iPhone 的 4 种运行状态。比如,某 iPhone 手机在某一个月里免费试使用了一应用软件,这一期间内,“设备检查(DeviceCheck)”将手机状态记录为“状态 A ”。试用期之后,用户停止该免费软件的使用,“设备检查(DeviceCheck)”会将此时的设备情况记录为“状态 B ”。在此之前,如果只是将这个标识卸载app的沙盒内,只要用户对 iPhone 进行软件删除或初始化操作后,该状态下的手机数据会被系统尽数删除,当再次使用该软件时,手机将显示为初次使用的试用期状态。所以开发是没有办法去真正记录这个状态的。而DeviceCheck是将这个标识放到了apple服务器,即使对手机进行删除软件,或初始化操作,设备检查DeviceCheck程序都可以通过连接 Apple 服务器来检查手机的各种状态数据。所以可以很好的解决这个问题,从而避免手机陷入再次试用软件的麻烦中。
但是,在二手的 iPhone 手机中却再次产生问题。无论初次使用的是何种软件,免费试用阶段结束后、仅限新用户享用的优惠条款将无法供手机的新主人再次使用。即使对 iPhone 进行初始化操作,手机也会默认保存各项数据,转让与出售并不会改变 iPhone 的使用状态。
FCUUID
我们通过DeviceCheck可以很好的记录下设备唯一标识符,但是这只能局限于iOS11之后,这明显是不够的。那么还有什么办法标记吗?可以通过FCUUID。
FCUUID是通过将特定的标识符保存在keychain(钥匙串)来实现的,所以当用户抹掉整个手机的内容时,这个唯一标识也会发生变动,但这也可以满足大部分app的使用场景了。同时FCUUID可在同个开发者账号下,同个App group间进行共享,即同一个appGroup下的不同app可以获取到同一个标识符。另外FCUUID也能使用iCloud机制进行辅助,提供甄别的精度。
使用方法详见github,下面是它提供的一些方法:
// 每次运行应用都会变 +(NSString *)uuid; //changes each time (no persistent), but allows to keep in memory more temporary uuids +(NSString *)uuidForKey:(id<NSCopying>)key; // 每次运行应用都会变 +(NSString *)uuidForSession; // 重新安装的时候会变 +(NSString *)uuidForInstallation; // 卸载后重装会变 +(NSString *)uuidForVendor; // 抹掉iPhone的时候才会变,适合做唯一标识 +(NSString *)uuidForDevice;
广告标识符【慎用】
除了上面两个方法外,也可以通过广告标识符来实现标记设备。但是如果使用广告标识符,则需要在上架审核的时候在相关广告标识符的问题中如实回答,否则可能会导致app审核被拒。
作用域:所有App共享同一个标识符,即设备上所有的app获取的广告标识符为同一个。
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
而且在使用中,也有两个问题需要注意,一个是用户可以在 通用设置->隐私->广告->重置广告id,这就导致了广告标识符发生了变化,而第二个就是可能会有用户在隐私设置里“限制广告追踪”,这就导致了广告标识符被禁掉了,所以需要注意一下。