转自: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

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

  1. 获取iOS设备唯一标识

    [获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...

  2. iOS设备唯一标识的前世今生

    设备唯一标识 估计很多开发都有被要求过获取一下设备的唯一标识,获取设备的唯一标识经常使用在我们做统计或者是在保证一台设备登录亦或者是做IM的时候可能会考虑去使用它,这一次在自己的需求当中就有一个&qu ...

  3. ios设备唯一标识获取策略

    In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02 ...

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

    由于UDID和OpenUDID被禁用,系统自带的的识别唯一标识有两种 广告标示符(IDFA-identifierForIdentifier) 这是iOS 6中另外一个新的方法,advertisingI ...

  5. 获得iOS设备唯一标识

    使用-[UIDevice identifierForVendor]或是-[ASIdentifierManager advertisingIdentifier]来作为你框架和应用的唯一标示符.坦白的来说 ...

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

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

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

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

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

    获取设备唯一标识 WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android. 更让IOS程序猿悲催的是,设备唯一标识的MAC Address在IOS ...

  9. 获取设备唯一标识 uuid(采用第三方库SSKeychain)

    SSKeyChain 下载链接: http://pan.baidu.com/s/1booV3VD 密码: ivdi /** *  获取设备唯一标识 uuid */ +(NSString*) uuid ...

随机推荐

  1. Terminating app due to uncaught exception 'NSUnknownKeyException', reason: xxxx

    出现错误的情景: 使用Swift自定义Cell, 然后将这个Cell在OC中使用, 由于为了能够在OC中使用和使用起来命名比较规范 我在Swift自定义的Cell前加了 @objc(DSProduct ...

  2. 去掉eclipse上编辑时的提示

    用eclipse时,鼠标移到类上时会给出提示,如下图:

  3. 狗狗40题~ (Volume C)

    A - Triangles 记忆化搜索呗.搜索以某三角形为顶的最大面积,注意边界情况. #include <stdio.h> #include <cstring> #inclu ...

  4. JAVA classpath, 纠正我一直以来错误的认知

    如何调在CLI中使用java tool(JDK中的java命令)调用一个打包在jar中的类,我想大多数人都能给出笼统的方案: java -classpath xxxxx com.test.classA ...

  5. 实现DIV拖动

    Ajax的到来让B/S中的客户端中开发有火了一把,网上出现了很多优秀的开源框架和UI,比较著名了有prototype,YUI,GWT等,但很多时候发现这些东西很难用到你的系统之中,有时候你的系统仅仅需 ...

  6. php wampp 访问数据库

    //获取用户信息private function UlikeGetUserInfo($Wechat,$data) { $this->logger("到达UlikeFunction.in ...

  7. web前端开发框架搜集

    Web应用框架(Web application framework)是一种电脑软件框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提 ...

  8. [JavaScript] JavaScript作用域深度解析

    JavaScript作用域 JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. -- JS权威指南 在JS里,一切皆对象,函数也是. 一.有什么用 什么时候会用到它? ...

  9. 如何在AD6(altium designer 6.x)中设置PCB大小

    做一块板子,体积比较的大(长度有20CM),而AD默认的长度只有15cm,满足不了本人要求.在网上找到了解决方法: 先在Mechanical(机械层,如Mechanical1)下绘制一个板框,也就是你 ...

  10. 理解 break, continue, return 和 exit

    你们知道 “break”, “continue”, “return” 和 “exit”的作用吗? 它们是功能强大的语言结构体.下面通过一个测试函数来说明它们之间的不同. 1 2 3 4 5 6 7 8 ...