码迷,mamicode.com
首页 > 移动开发 > 详细

获取iOS设备唯一标识

时间:2017-07-06 14:22:25      阅读:544      评论:0      收藏:0      [点我收藏+]

标签:last   abs   服务器端   osi   idfv   namespace   lang   text   aaa   

获取iOS设备唯一标识

获取iOS设备唯一标识
大纲
  • 思维导图

  • 详情

思维导图
详情

UDID

在之前的版本是可以被使用的,iOS5及以后,被苹果禁止使用了(弃用了)。虽然,这个UDID用得很广泛,但是,不得不说的是,它在慢慢的远离开发者,不能在考虑使用UDID了。至于这个标示符是转为私有方法,或者完全从以后的iOS版本中移除,还有待观察。不过,这个UDID在部署企业级签名程序时,非常方便。

获取UDID的方法如下: NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

示例:bb4d786633053a0b9c0da20d54ea7e38e8776da4

OpenUDID(github上一个开源的项目)

在iOS 5发布时,UDID被弃用了,这引起了广大开发者需要寻找一个可以替代UDID,并且不受苹果控制的方案。由此OpenUDID成为了当时使用最广泛的开源UDID替代方案。OpenUDID在工程中实现起来非常简单,并且还支持一系列的广告提供商。

获取UDID的方法如下: NSString *openUDID = [OpenUDID value];

OpenUDID原理是利用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部分是一样的,就能共享(请用真机测试,模拟器会有偏差)。

UUID

目前大部分应用存的是UUID,它是苹果再iOS6后提供的一个获取大随机数的方法。UUID, 全球独立标识(Globally Unique Identifier),据wiki说UUID随机数算法得到的数重复概率为170亿分之一,170亿分之一什么概念?可以告诉你买一注双色球的中奖概率是1700万分之一。

以下是几种取到UUID的方法,它们各有区别:

CFUUID

从iOS2.0开始,CFUUID就已经出现了。它是CoreFoundatio包的一部分,因此API属于C语言风格。CFUUIDCreate 方法用来创建CFUUIDRef,并且可以获得一个相应的NSString。获得的这个CFUUID值系统并没有存储。每次调用CFUUIDCreate,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

获取CFUUID方法如下: CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));

示例:68753A44-4D6F-1226-9C60-0050E4C00067

NSUUID

NSUUID在iOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。跟CFUUID一样,这个值系统也不会存储,每次调用的时候都会获得一个新的唯一标示符。如果要存储的话,你需要自己存储。

获取NSUUID方法如下:NSString *uuid = [[NSUUID UUID] UUIDString];

示例:68753A44-4D6F-1226-9C60-0050E4C00067

IDFA-identifierForIdentifier

这是iOS 6中另外一个新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分。ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个上面提到的NSUUID实例。

跟CFUUID和NSUUID不一样,广告标示符是由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户“还原广告标示符”,然后再回到程序中,此时获取广告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。之所以会这样,我猜测是由于ASIdentifierManager是一个单例。

针对广告标示符用户有一个可控的开关“限制广告跟踪”。Nick Arnott的文章中已经指出了。将这个开关打开,实际上什么也没有做,不过这是希望限制你访问广告标示符。这个开关是一个简单的boolean标志,当将广告标示符发到任意的服务器端时,你最好判断一下这个值,然后再做决定。

注意:Appstore禁止不使用广告而采集IDFA的app上架。请参考

获取IDFA方法如下:NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

示例:E2DFA89-496A-47FD-9941-DF1FC4E6484A

IDFV-identifierForVendor

这种叫法也是在iOS 6中新增的,不过获取这个IDFV的新方法被添加在已有的UIDevice类中。跟advertisingIdentifier一样,该方法返回的是一个NSUUID对象。

苹果官方的文档中对identifierForVendor有如下这样的一段描述 : The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.意思是根据vendor的值,如果vendor相同,则返回同一字符串;如果vendor不同,则返回不同的字符串。

vendor解释:英文解释为卖家,小贩。根据xcode文档解释,正常情况下,会根据App Store提供的数据进行判断。但是如果app不是通过app store进行安装的(如企业应用或开发调试阶段),那么会根据bundle ID判断。

获取IDFA方法如下:NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

示例:E2DFA89-496A-47FD-9941-DF1FC4E6484A

注:天生的普通人

获取iOS设备唯一标识

标签:last   abs   服务器端   osi   idfv   namespace   lang   text   aaa   

原文地址:http://www.cnblogs.com/fdyjm/p/7125710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!