本文为原创,如需转载请注明出处:http://blog.csdn.net/xiaoguan2008一家之言,难免存在纰漏,欢迎指正,勿吐槽。

UDID是什么?
        UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。

UDID有什么用?
        移动网络可利用UDID来识别移动设备,如iPhone和iPad。UDID对每台设备而言都是唯一的,从而成为了广告公司、市场分析机构和APP测试系统跟踪用户行为的实用工具。

目前使用UDID主要原因分为:
                1)用于统计与分析,例如第三方统计工具Flurry、友盟等,广告商ADMOB等;
                2)将UDID作为用户ID来唯一识别用户,省去用户名,密码等注册过程。

由此可见UDID对于IOS应用开发者说,是个很重要的信息(虽然越狱的设备通过某些工具可以改变设备的UDID)。但是,从IOS5.0开始,苹果宣布将不再支持用以下方法获取设备的UDID。

[cpp] view plain copy
  1. [UIDevice currentDevice] uniqueIdentifier];

最近又爆出苹果App Store禁止访问UDID的应用上架,所以开发者应尽快弃用UDID,去寻找另外的替代方案。

我为此也花了不少时间去寻找比较好的替代方案,下面一一道来:
        一、苹果公司建议的UUID替代方案

[cpp] view plain copy
  1. -(NSString*) uuid {
  2. CFUUIDRef puuid = CFUUIDCreate( nil );
  3. CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
  4. NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);
  5. CFRelease(puuid);
  6. CFRelease(uuidString);
  7. return [result autorelease];
  8. }

苹果公司建议采用上述代码为应用生成唯一标识字符串。开发者可以在应用第一次启动时调用一次,然后将该串存储起来,以便以后替代UDID来使用。显而易见,这种方法问题很多。如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备;如果你从一台旧设备中备份文件到新设备中,两台设备就拥有相同的CFUUID;如果你从临时文件中备份操作系统,就会出现一个设备里存在不同CFUUID的情况。

二、开源方案 OpenUDID
        贡献者在readme文档中说:
        OpenUDID is a drop-in replacement for the deprecated [UIDevice uniqueIdentifier] a.k.a. UDID on iOS, and otherwise is an industry-friendly equivalent for iOS and Android.
        The agenda for this community driven project is to: - Provide a reliable proxy and replacement for a universal unique device identifier. That is, persistent and sufficiently unique, on a per device basis. - NOT use an obvious other sensitive unique identifier (like the MAC address) to avoid further deprecation and to protect device-level privacy concerns - Enable the same OpenUDID to be accessed by any app on the same device - Supply open-source code to generate and access the OpenUDID, for iOS and Android - Incorporate, from the beginning, a system that will enable user opt-out to match Apple’s initial intent.
        愿景很好,也确实没有用到MAC地址,同时能保证同一台设备上的不同应用使用同一个OpenUDID。但是仔细分析,还是能发现问题。

OpenUDID生成唯一识别码的代码是:

[cpp] view plain copy
  1. unsigned char result[16];
  2. const char *cStr = [[[NSProcessInfo processInfo] globallyUniqueString] UTF8String];
  3. CC_MD5( cStr, strlen(cStr), result );
  4. _openUDID = [NSStringstringWithFormat:
  5. @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%08x",
  6. result[0], result[1], result[2], result[3],
  7. result[4], result[5], result[6], result[7],
  8. result[8], result[9], result[10], result[11],
  9. result[12], result[13], result[14], result[15],
  10. arc4random() % 4294967295];

这里使用了NSProcessInfo类。
        当设备上第一个使用OpenUDID解决方案的应用第一次调用时,确实会生成一个唯一的识别码。同时,为了与官方的UDID位数相同,还在MD5值后面追加了8位随机码。然后,该方案使用到了NSUserDefaults类(应用设置)。应用将获取到的唯一识别码保存到应用的UserDefaults中,如果程序以后需要使用唯一识别码,就从UserDefaults中获取,这样就保证可以拿到同一个识别码。但是,如果用户删除了应用,UserDefaults同样会被清空,为了避免重新生成唯一识别码,该方案还使用到了UIPasteboard类(设备剪切板)。应用在将唯一识别码保存到UserDefaults的同时,也会将其保存到以特殊的key标识的UIPasteboard中。代码如:

[cpp] view plain copy
  1. UIPasteboard* slotPB = [UIPasteboardpasteboardWithName:availableSlotPBid create:YES];
  2. [slotPB setData:[NSKeyedArchiver archivedDataWithRootObject:dict] forPasteboardType:kOpenUDIDDomain];

其中availableSlotPBid是一个字符串key,前缀是“org.OpenUDID.slot.”,点后面加上数字。这个数字默认是从0到99(当然你可以修改源代码使它更大或者更小)。
如果设备上安装了第二个使用OpenUDID解决方案的应用,当应用调用生成OpenUDID的方法时,将会从UIPasteboard中获取唯一识别码(遍历key从0到99的UIPasteboard),这里取到的就是之前第一个应用保存到UIPasteboard中的。也就是说,只要用户设备上有一个使用了OpenUDID的应用存在时,其他后续安装的应用如果获取OpenUDID,都将会获得第一个应用生成的那个。
        看起来似乎很好,很复杂。但是仔细想想,还是有问题,如果把使用了OpenUDID方案的应用全部都删除,再重新获取OpenUDID,此时的OpenUDID就跟以前的不一样了(本人测了一下,确实如此)。可见,这种方法还是不保险。

三、开源方案SecureUDID

稍微看了下SecureUDID源码,发现其与OpenUDID其实差不多,只是初始获取的唯一识别码稍有不同。同时,从作者的Readme文档中可见,这个方案同样存在很多问题。如原文:
        Is this a true UDID replacement?
        SecureUDID has two properties that you should know about before you use it. First, as indicated above, the identifier is not derived from hardware attributes. Second, the persistence of an identifier cannot be guaranteed in all situations. This means that, while unlikely, it is technically possible for two distinct devices to report the same identifier, and for the same device to report different identifiers. Consider this carefully in your application. Here is a list of situations where this identifier will not exhibit the uniqueness/persistence of a traditional UDID.
        * The user has opted-out of the SecureUDID system, in which case you will receive a well-formed string of zeroes.
        * Device A is backed up and then restored to Device B, which is an identical model. This is common when someone breaks their phone, for example, and is likely desirable: you will receive Device A's SecureUDID.
        * The SecureUDID data is removed, via user intervention, UIPasteboard data purge, or by a malicious application.
        * The SecureUDID backing store becomes corrupt.
        * All SecureUDID applications are uninstalled from a device, followed by a UIPasteboard data purge.
        我发现,其实前面的OpenUDID也基本存在以上问题,只是作者没写出来。看来还是SecureUDID的贡献者比较厚道。

四、与WIFI MAC地址相关
        网上同样有一些与WIFI MAC地址相关的替代方案,主要分三种:第一种直接使用“MAC Address”;第二种,使用“MD5(MAC Address)”;第三种,“MD5(MAC Address+CFBundleIdentifier)”。github上有个开源项目(UIDevice-with-UniqueIdentifier-for-iOS-5)实现了这几种方法。
        使用这种方法也存在问题:1、市面上有部分机器(虽然数量极少,但是本人在使用过程中确实发现过这种情况)无法获得MAC地址,有人说这部分机器是联通阉割无WIFI版的,具体不得而知了。2、MAC地址跟UDID一样,存在隐私问题。苹果现在禁用UDID,不能保证以后不会禁用MAC地址。

五、部分大公司私有的解决方案,但是他们怎么会告诉你呢?

所以,如果你想以一种万无一失的方法追踪某台设备,现在还没有比UDID更合适的选择。但是,苹果现在不让用了,苦逼的开发者们,该怎么办呢?

参考:

http://www.cnblogs.com/zhulin/archive/2012/03/26/2417860.html

http://www.iteye.com/news/24661

对IOS设备中UDID的一些思考相关推荐

  1. 转 如何在IOS设备中去掉屏幕上的status bar

    引入 如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络.时间.电池??]条? 操作 方法一: 在-info.list项目文件中,加上"Status bar is ...

  2. 防止在iOS设备中的Safari将数字识别为电话号码

    转:防止在iOS设备中的Safari将数字识别为电话号码 在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名 ...

  3. 在iOS设备中跑Python脚本

    在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗. 这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上p ...

  4. 如何获取iOS 设备的 UDID

    如何获取iOS 设备的 UDID UDID,是 iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,这个编码,我们称之为识别码,也叫做UDID( Unique Device Ide ...

  5. 同步推软件:查看ios设备中persistentDataPath下文件,安装ipa

    1.使用Unity开发的app,有可能会用到PersistentDataPath,在ios设备中可以借助同步推软件来查看(mac上也有,不过更新不是太频繁,经常下载后和mac os系统不兼容,不可用) ...

  6. 从ios设备中获取ipa并且获取其中的资源

    1.从ios设备中获取ipa的方法很简单. 使用itools工具就,点击应用栏目. 然后再选择你需要的获取的ipa的程序,选中之后,点击右键备份,选择目录存放就可以获取ipa了 2.修改.ipa为.z ...

  7. iOS杂谈14—iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?

    转载于:dApps开发者 本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架 ...

  8. 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?...

    本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...

  9. iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?

    本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...

最新文章

  1. OKR案例分析,哪种类型的企业适合OKR?
  2. if __name__ == __main__:什么意思_好冷的Python if __name__==__main__是啥东东
  3. C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。
  4. leetcode13
  5. Html中value和name属性的作用
  6. 信息学奥赛一本通(1082:求小数的某一位)
  7. Ngrok让你的本地Web应用暴露在公网上
  8. 工厂设计模式(Factory Pattern)
  9. python 代码命令大全-Linux命令大全
  10. 我是怎么找电子书的?
  11. 苹果手机的测距仪怎么用
  12. QT实现经纬度转换为图片像素坐标
  13. 学校计算机机房维护年度总结,学校计算机机房的管理和维护建议原稿(全文完整版)...
  14. 文本编辑器(vim)
  15. java计算税后工资switch语句_计算个人所得税!switch语句
  16. 轻量级日志系统 PLG(**Promtail + Loki + Grafana**)架构技术调研
  17. 《哪吒》票房破25亿,我用AI分析了它20W+评论数据
  18. 入职华为od一个月的感受
  19. Ucloud直播技术细节
  20. 【PHP】PHP入门基础

热门文章

  1. 【云原生】Kubernetes(K8S)与数据库
  2. access IIf 函数
  3. 【数论】质数筛选法(埃拉托色尼筛法及线性筛法)
  4. 被起诉了,应如何进行有效答辩?
  5. X-Security X的安全控制
  6. 系统常用参数的推荐设置(操作同样适合于其他AD版本,操作方法一致)
  7. 利用uni-app 开发的iOS app 发布到App Store全流程
  8. idea中查找的快捷键
  9. C++Builder Tchart与TDBchart
  10. c#快速入门~在java基础上,知道C#和JAVA 的不同即可