[转]iOS设备唯一标识探讨

转自:http://www.jianshu.com/p/b83b0240bd0e

iOS设备唯一标识探讨

为了统计和检测应用的使用数据,几乎每家公司都有获取唯一标识的业务需求,在iOS5以前获取唯一标识,可以获取到系统提供的方法UDID(Unique Device Identifier),后来被出于用户隐私的考虑被Apple官方禁止掉了。于是,大家开始在iOS6中使用 MAC 地址(Medium/Media Access Control) ,后来又被Apple官方在iOS7中禁止掉了。苹果及其国外的IT公司都会比较注重用户隐私,所以今后一但有比较靠谱的获取唯一标示的方法放出,苹果肯定会封堵。

在非越狱的手机上获取某个硬件信息生成唯一标识,第一只能找到苹果的漏洞,第二就是调用一些私有接口,显然这两条路都比较艰难,并不可持续发展,所以网上大部分的唯一标识都是从操作系统层面获取的,在重置手机系统的时候都会被清除,在系统升级、卸载重装、备份恢复都可以保留,现在本人尚未发现可以使用严格意义上的唯一标识。接下来我想跟大家探讨的是如何通过“合法”的手段来尽量拿到不会轻易发生变化的“唯一标识”。

移动统计平台都用啥来标识设备呢?
研究了下国内两大移动统计平台友盟和TalkingData 的SDK
友盟用的是 Openudid + IDFA
TalkingData用的是 Keychain + IDFA

Openudid

Openudid是一个github上一个开源的项目: 地址
原理是利用iOS系统中的UIPasteboard剪贴板类,它用 app-special pastboards 来存储一160位的随机字符串,存取的方式类似字典的key-value。 app-special pastboards 可持久存储字符串,即使开关机、卸载应用,并能在app之间共享。Openudid的第一次访问的时候用key去检查剪贴板内是否存在对应的value(随机数),如果不存在就生成一个并存储在Pasteboard中,第二次访问的时候就可以直接取到而不去生成新的随机数。
但是iOS7之后,苹果封堵了剪贴板通信的漏洞,iOS之前是所有的应用都可以共享同一个剪贴板存储内容,现在只有在同一CFBundleIdentifier标识下的App才能共享内容,如com.koudai.a和com.koudai.b,它们的com.mycompany部分是一样的,就能共享(请用真机测试,模拟器会有偏差)。

Keychain

keychain中文翻译为钥匙串,是苹果用来存储密码和证书的一块加密存储区域,目的是为了帮助用户安全存储应用或者浏览器的密码,省去了很多输入密码和记密码的麻烦。keychain不是存储在手机的沙盒内,而是手机的某个公共区域,手机重启和应用卸载,都不会对这片存储区域造成影响,因为是加密存储不存在被其他应用修改的问题,所以就有人拿keychain来存储唯一标识。
再Max OS上访问keychian需要提供用户的登录密码,而在iOS上用户原则上只能访问本应用存储的keychain,除非是同一个provisioning 证书的两个应用,比如美团的猫眼就能读取美团app中的keychian,用户第一次打开猫眼app就会弹出提示,用户可以读取美团的账号和密码免登录进入猫眼。keychain是根据provision 证书来鉴定权限,所以app的版本需要使用同一个,否则版本之间会失效。用户恢复出厂设置,机器上的keychain会被清除,但如果事先对手机进行了备份,keychain存储的内容依然有效。顺便提一句keychain在越狱的机器上是可以被导出的,所以存储敏感信息前请加密。

NSUUID

上节keychain把存储的问题解决了,那存什么来保证每个设备的id都是唯一的呢?大部分应用存的是UUID,它是苹果再iOS6后提供的一个获取大随机数的方法。UUID, 全球独立标识(Globally Unique Identifier),据wiki说UUID随机数算法得到的数重复概率为170亿分之一,170亿分之一什么概念?可以告诉你买一注双色球的中奖概率是1700万分之一。随机算法有几套,包括用时间戳、MD5什么的,苹果是遵循的RFC 4122 version 4,大家可以去google下。

NSString *uuid = [[NSUUID UUID] UUIDString];

每次调用此方法得到的UUID肯定是不一样的,所以必须借助于持久化存储。

IDFA

IDFA这是iOS 6中另外一个新的方法,是AdSupport.framework框架中ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个的NSUUID实例。广告标示符也是由系统存储着的,还原系统和在(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符)设置中重置都会被还原。苹果对IDFA的使用做了限制,使用IDFA但未集成任何广告服务的应用审核都会被拒,应用中使用了IDFA的话,必须在iTunes Connect中的上传页面进行相应的设置,否则上传应用审核的时候会出现错误。

当然还有许多其他的ID可以用来标识设备,我文中提到了只是自己认为相对靠谱的方法,如果让我选择的话,我会用keychain存储NSUUID的方法,毕竟一个用户重置系统是小概率事件,即使有人真的想伪造用户量做一次系统重置的成本非常高。如果大家有更好的获取iOS设备唯一标示的方法,不妨留言讨论。

参考链接:http://www.cocoachina.com/industry/20130422/6040.html

时间: 2024-10-25 06:28:05

[转]iOS设备唯一标识探讨的相关文章

获取iOS设备唯一标识

[获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在iOS5的时候已经被遗弃了,但是iOS7中已经完全的禁用了它.Xcode5甚至不会允许你编译包含了指引到-[UIDevice uniqueIdentifier]的app.此外,iOS7之前的使用了-[UIDevice uniqueIdentifier] 的app如果在iOS7上运行,它不会返回设备的

ios设备唯一标识获取策略

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier for

iOS设备唯一标识(可以用版)

由于UDID和OpenUDID被禁用,系统自带的的识别唯一标识有两种 广告标示符(IDFA-identifierForIdentifier) 这是iOS 6中另外一个新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分.ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个上面提到的NSUUID实例. NSString *adId = [[[ASIdentifierMana

获得iOS设备唯一标识

使用-[UIDevice identifierForVendor]或是-[ASIdentifierManager advertisingIdentifier]来作为你框架和应用的唯一标示符.坦白的来说,应对这些变化也不是那么的难,见以下代码片段:NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString]; NSString *identifierForAdvertising =

ios开发——实用技术篇OC篇&获取设备唯一标识

获取设备唯一标识 WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android. 更让IOS程序猿悲催的是,设备唯一标识的MAC Address在IOS7中也失效了. IOS系统中,获取设备唯一标识的方法有很多: 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成. 二.UUID(Univers

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

8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可以改变设备的 UDID),移动网络可以利用 UDID 来识别移动设备. 许多开发者把 UDID 跟用户的真实姓名.密码.住址.其它数据关联起来,网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据,同时大部分应用确实在频繁传输 UDID 和私人信息. 为了避免集体诉讼,苹果最终决

IOS获取设备唯一标识的八种方法

免责声明:本文章来源于其他博客整理 参考:http://www.2cto.com/kf/201308/237648.html 参考:http://www.2cto.com/kf/201311/255684.html 在iOS系统中,获取设备唯一标识的方法有很多: 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成(越狱的设备通过某些工具可以改变设备的U

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

iOS获取设备唯一标识的各种方法?IDFA.IDFV.UDID分别是什么含义? [摘要:1.UDID (Unique Device Identifier) UDID的齐称是Unique Device Identifier,望文生义,它便是苹果IOS装备的独一辨认码,它由40个字符的字母战数字构成.正在良多须要限定] 一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由

iOS开发日记20-7.0之后获取设备唯一标识

今天博主有一个获取设备唯一标识的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 在iOS7.0之前,获取设备唯一标识的方法主要是获取UDID或MAC地址,但是在iOS7.0之后,为了保护用户隐私,苹果把他们都禁止了,使得设备的数据追踪变得越来越难. iOS7.0之后,获取设备唯一标识的方法主要有两种: 1.广告标识符 IDFA 苹果为了完善自己的生态圈,在2010年前后推出了iAd广告网络.那么这个IDFA和这个iAd的关系就不言自喻了.如果不了解广告也没关系,简单来讲,现在的互联网