有时候,我们需要记录一下设备的唯一标识,比如标识这个设备是不是已经发过促销券了或者是否下载试用过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,这就导致了广告标识符发生了变化,而第二个就是可能会有用户在隐私设置里“限制广告追踪”,这就导致了广告标识符被禁掉了,所以需要注意一下。

iOS 获取设备的唯一标识的更多相关文章

  1. 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

  2. [转]设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

  3. 获取设备的唯一标识uuid

    摘自:http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html -(NSString*) uuid { CFUUIDRef puuid = CFUUID ...

  4. iOS开发之 -- 获取设备的唯一标示符

    各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...

  5. Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)

    在我们的APP开发中,通常需要获取到设备的唯一标识.在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬 ...

  6. iOS获取设备唯一标识的8种方法

    8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...

  7. iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

    一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和 ...

  8. ios获取设备信息总结

    1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name;       //获取设备所有者的名 ...

  9. ios 获取设备相关的信息

    .获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...

随机推荐

  1. Linux中三种SCSI target的介绍之SCST

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...

  2. 【转】SignalR与ActiveMQ结合构建实时通信

    一.概述 本教程主要阐释了如何利用SignalR与消息队列的结合,实现不同客户端的交互 SignalR如何和消息队列交互(暂使用ActiveMQ消息队列) SignalR寄宿在web中和其他Signa ...

  3. C利用可变参数列表统计一组数的平均值,利用函数形式参数栈原理实现指针运算

    //描述:利用可变参数列表统计一组数的平均值 #include <stdarg.h> #include <stdio.h> float average(int num, ... ...

  4. codevs:1792分解质因数:编写一个把整数N分解为质因数乘积的程序。

    #include<iostream>#include<cstdio>using namespace std;int main(){ int i=2,n; scanf(" ...

  5. shell脚本编程之变量简介及脚本执行过程

    脚本变量简介 变量类型:字符型.数值型.真.假:事先确定数据的存放格式和长度: 变量存放在内存空间: 编译型语言,没有额外的处理逻辑,属于强类型语言: 脚本型语言,可以有解释器控制:所以,可以是弱类型 ...

  6. org.apache.ibatis.cache.CacheException: Error serializing object

    异常: 十二月 26, 2017 3:38:05 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: At least one JAR was s ...

  7. if后的判断条件

    转自https://blog.csdn.net/lxn18392641463/article/details/78321080 先说明原因.这里不只是有代码规范的问题,还有汇编语言的问题,要知道为什么 ...

  8. for循环实战性能优化之使用Map集合优化

           笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...

  9. HDU 6086 Rikka with String ——(AC自动机 + DP)

    这是一个AC自动机+dp的问题,在中间的串的处理可以枚举中断点来插入自动机内来实现,具体参见代码. 在这题上不止为何一直MLE,一直找不到结果(lyf相同写法的代码消耗内存较少),还好考虑到这题节点应 ...

  10. LeetCode之打家劫舍

    1. 问题 在一条直线上,有n个房屋,每个房屋中有数量不等的财宝,有一个盗 贼希望从房屋中盗取财宝,由于房屋中有报警器,如果同时从相邻的两个房屋中盗取财宝就会触发报警器.问在不触发报警器的前提下,最多 ...