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,这就导致了广告标识符发生了变化,而第二个就是可能会有用户在隐私设置里“限制广告追踪”,这就导致了广告标识符被禁掉了,所以需要注意一下。
iOS 获取设备的唯一标识的更多相关文章
- 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
- [转]设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
- 获取设备的唯一标识uuid
摘自:http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html -(NSString*) uuid { CFUUIDRef puuid = CFUUID ...
- iOS开发之 -- 获取设备的唯一标示符
各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...
- Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)
在我们的APP开发中,通常需要获取到设备的唯一标识.在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬 ...
- iOS获取设备唯一标识的8种方法
8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...
- iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?
一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和 ...
- ios获取设备信息总结
1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名 ...
- ios 获取设备相关的信息
.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...
随机推荐
- qt加快编译速度
菜单栏->工具-> 选项->构建与运行->构建套件->点击自动检测内容->在同一页面找到 Environment ->点击change ->在弹出的窗口 ...
- 各种trick和细节错误汇总
这篇博客主要是用来记自己写代码的时候犯的各种小技巧和低级失误,好提醒自己,从而尽量缩短debug时间. 点分治 1.求每一个子树到重心的距离的函数接口应该是dfs2(v, eg, e[i].w)而不是 ...
- ELK教程2:Kibana的安装
kibana作为ElastciSearch的数据查询展示界面,集成了很多的功能,本文主要讲述如下部署kibana. 安装 安装命令如下: # 下载kibana的npm wget https://art ...
- linux 下终端通过证书、私钥快捷登录
ssh -i 你的证书 root@IP地址 -p 端口号 ssh -i {您的 .pem 文件的完整路径} ec2-user@{实例 IP 地址} 设置秘钥权限chmod 600 ~/.ssh/id_ ...
- Navicat premium查看数据库表中文注释的两种方式
有时候我需要查看数据库表中文注释,来确定每个表存的是哪个模块的数据,确保测试时对数据库查询操作无误. 这个操作我忘记了,此处做一个记录 方式一:通过sql语句来,前提是你知道是哪个表,这种方式不容易改 ...
- JetBrains CLion 2019 for Mac(智能C和C++编辑器)中英文如何切换完整教程
右键显示包内容,进入目录,contents/lib,删除resources_zh.jar,重启即可. 参考: https://blog.csdn.net/qq_45179462/article/det ...
- [luogu 5024] 保卫王国
Problem Here Solution 这大概是一篇重复累赘的blog吧. 最小权覆盖集=全集-最大权独立集 强制取或不取,可以通过将权值修改成inf或者-inf 然后就用动态dp的套路就行了 动 ...
- 容易被忽视的python装饰器的特性
今天发现了装饰器的另一种用法,下面就先上代码: data_list = [] def data_item(func): data_list.append(func) return func @data ...
- vim 文本替换讲解
在VIM中进行文本替换: 1. 替换当前行中的内容: :s/from/to/ (s即substitude) :s/from/to/ : 将当前行中的第一个from,替换成to.如果当前行含有多个 fr ...
- PostgreSQL查看版本信息
1.查看客户端版本 psql --version 2.查看服务器端版本 2.1 查看详细信息 select version(); 2.2 查看版本信息 show server_version; 2.2 ...