在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”。
unique Identifier即将退出,苹果给了我们Vendor和Advertising identifier两个选择,但应该用哪一个?文档并没有给出确切答案,具体使用哪个完全由你根据自己app的目的来决定。下面我将列出iOS中目前支持的,以及被废弃的唯一标示符方法,并对其做出相应的解释,希望可以帮你做出正确的确定。
CFUUID
从iOS2.0开始,CFUUID就已经出现了。它是CoreFoundatio包的一部分,因此API属于C语言风格。CFUUIDCreate 方法用来创建CFUUIDRef,并且可以获得一个相应的NSString,如下代码:
CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
获得的这个CFUUID值系统并没有存储。每次调用CFUUIDCreate,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。
NSUUID
NSUUID在iOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:
NSString *uuid = [[NSUUID UUID] UUIDString];
跟CFUUID一样,这个值系统也不会存储,每次调用的时候都会获得一个新的唯一标示符。如果要存储的话,你需要自己存储。在我读取NSUUID时,注意到获取到的这个值跟CFUUID完全一样(不过也可能不一样):
示例: 68753A44-4D6F-1226-9C60-0050E4C00067
广告标示符(IDFA-identifierForIdentifier)
这是iOS 6中另外一个新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分。ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个上面提到的NSUUID实例。
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
跟CFUUID和NSUUID不一样,广告标示符是由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户“还原广告标示符”,然后再回到程序中,此时获取广告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。之所以会这样,我猜测是由于ASIdentifierManager是一个单例。
针对广告标示符用户有一个可控的开关“限制广告跟踪”。Nick Arnott的文章中已经指出了。将这个开关打开,实际上什么也没有做,不过这是希望限制你访问广告标示符。这个开关是一个简单的boolean标志,当将广告标示符发到任意的服务器端时,你最好判断一下这个值,然后再做决定。
示例: 1E2DFA89-496A-47FD-9941-DF1FC4E6484A
Vindor标示符 (IDFV-identifierForVendor)
这种叫法也是在iOS 6中新增的,不过获取这个IDFV的新方法被添加在已有的UIDevice类中。跟advertisingIdentifier一样,该方法返回的是一个NSUUID对象。
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
苹果官方的文档中对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.
如果满足这样的条件,那么获取到的这个属性值就不会变:相同的一个程序里面-相同的vindor-相同的设备。如果是这样的情况,那么这个值是不会相同的:相同的程序-相同的设备-不同的vindor,或者是相同的程序-不同的设备-无论是否相同的vindor。
看完上面的内容,我有这样的一个疑问“vendor是什么”。我首先想到的是苹果开发者账号。但事实证明这是错误的。接着我想可能是有一个AppIdentifierPrefix东西,跟钥匙串访问一样,可以在多个程序间共享。同样,这个想法也是的。最后证明,vendor非常简单:一个Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。例如,com.doubleencore.app1 和 com.doubleencore.app2 得到的identifierForVendor是相同的,因为它们的CFBundleIdentifier 前两部分是相同的。不过这样获得的identifierForVendor则完全不同:com.massivelyoverrated 或 net.doubleencore。
在这里,还需要注意的一点就是:如果用户卸载了同一个vendor对应的所有程序,然后在重新安装同一个vendor提供的程序,此时identifierForVendor会被重置。
示例: 599F9C00-92DC-4B5C-9464-7971F01F8370
UDID
在之前的版本中是可用的,但是在iOS5以及之后的版本中,以及被弃用了。虽然,这个UDID用得很广泛,但是,不得不说的是,它在慢慢的远离开发者,不能在考虑使用UDID了。至于这个标示符是转为私有方法,或者完全从以后的iOS版本中移除,还有待观察。不过,这个UDID在部署企业级签名程序时,非常方便。获取UDID的方法如下:
NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];
示例: bb4d786633053a0b9c0da20d54ea7e38e8776da4
OpenUDID
在iOS 5发布时,uniqueIdentifier被弃用了,这引起了广大开发者需要寻找一个可以替代UDID,并且不受苹果控制的方案。由此OpenUDID成为了当时使用最广泛的开源UDID替代方案。OpenUDID在工程中实现起来非常简单,并且还支持一系列的广告提供商。
NSString *openUDID = [OpenUDID value];
OpenUDID利用了一个非常巧妙的方法在不同程序间存储标示符 — 在粘贴板中用了一个特殊的名称来存储标示符。通过这种方法,别的程序(同样使用了OpenUDID)知道去什么地方获取已经生成的标示符(而不用再生成一个新的)。
之前已经提到过,在将来,苹果将开始强制使用advertisingIdentifier 或identifierForVendor。如果这一天到来的话,即使OpenUDID看起来是非常不错的选择,但是你可能不得不过渡到苹果推出的方法。
示例: 0d943976b24c85900c764dd9f75ce054dc5986ff
总结
希望上面的信息能够帮助你在程序使用选择正确的唯一标示符。在这里,我创建了一个小的唯一标示符测试程序,你可以运行该程序,并查看一下显示的内容(包括上面提到的所有标示符)。另外,下面有两个表,表中描述了两个内容:在iOS中的可用性,以及什么时候可以获得重置的标示符。
* 程序必须重启才能看到改变的效果。
** 删除了所有相同vendor提供的程序,才能看到改变的值。
相关推荐
通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、...
4. **通知请求**: 在设置通知时,开发者需要创建一个`UNNotificationRequest`对象,其中包含一个唯一标识符、一个触发器(如时间、地理位置等)以及内容属性(如标题、副标题、声音等)。 5. **通知类别**: 可以...
URL格式通常是`itms-apps://itunes.apple.com/app/id<APP_ID>`,其中`<APP_ID>`是你的应用在AppStore的唯一标识符。例如: ```swift if let url = URL(string: "itms-apps://itunes.apple.com/app/id1234567890") {...
2. **创建企业发布描述文件**:选择“iOS 企业发布描述文件”,然后选择之前创建的app ID(App Identifier),它关联你的应用唯一标识符。接着,选择你刚刚创建的企业发布证书,并输入描述文件的名称,再次点击“OK...
在iOS中,每个应用程序都有一个唯一标识符,即Bundle Identifier,以及至少一个URL Scheme。当用户点击一个特定的URL时,系统会检查是否已安装了能处理该URL的应用,如果找到,就会启动该应用并传递URL。 1. **启动...
在开发者账户中,需要将参与测试的设备的UDID(唯一设备标识符)添加进去,这样才可以将应用安装到该设备上进行测试。 然后是创建Provisioning Profile(配置文件)。配置文件是iOS开发和测试过程中的一个重要环节...
在打包iOS应用时,Appid(应用程序标识符)必须在整个项目中保持一致,这是为了确保应用的唯一性和识别性。Appid通常由公司或个人的Apple Developer Account创建,并在Xcode中配置。它涉及到应用的内购、推送通知等...
至于文件名“ppt5022”,这可能是模板的内部编号或者是下载或存储时使用的唯一标识符。通常,这个名称不会直接反映模板的具体内容,而是为了管理和区分不同文件而设定的。 总的来说,这些半透明iOS风格的过渡页PPT...
当用户点击这个按钮时,程序会构建一个特定格式的URL,形如`itms-apps://itunes.apple.com/app/id<APP_ID>`,其中`<APP_ID>`是你在App Store上的应用的唯一标识符。你可以从App Store Connect(苹果开发者中心)获取...
IOS应用层的各个协议端口号 在计算机网络中,端口号(Port Number)是用于标识不同的应用层...IOS应用层的各个协议端口号都是由不同的应用层协议和传输层协议使用的唯一标识符,用于标识和区分不同的服务和应用程序。
其中 `<APP_ID>` 是你的应用在App Store上的唯一标识符,可以在App Store Connect的“我的应用”部分找到。 接下来,我们需要检查用户是否已经对应用进行过评论。这通常需要通过苹果的App Store Review框架(`...
UDID:UDID是设备唯一标识符,每个移动设备都有一个独一无二的UDID,用于应用开发者识别设备。 MAC:媒体访问控制地址,是分配给网络接口的唯一标识符,通常用于网络通信中识别设备。 LBS:位置服务,是通过获取...
当苹果发布新的iOS版本时,它会对每个设备生成一个独特的SHSH blob,这个blob与设备的唯一标识符(UDID)绑定。SHSH blob的作用在于验证设备是否可以安装特定的iOS版本,防止用户安装未授权或未签名的固件。然而,...
在iOS设备中,SHSH(System Host Status Hash)是一串独特的数字签名,由Apple生成并关联到每个设备的唯一标识符。这些签名允许设备验证其固件是否经过Apple官方认可,防止非法修改。保存SHSH blobs的意义在于能够...
5. "_00000090FA19558C"这部分是设备的唯一标识符,确保SHSH blob与特定的设备匹配。 6. ".i4"和"_ap.plist"后缀分别表示不同的文件类型。".i4"文件可能是SHSH blob的二进制格式,而"_ap.plist"文件则是Apple的配置...
这里的`APP_ID`是你的App的唯一标识符,`ADDITIONAL_PARAMETERS`和`CAMPAIGN_TAG`可以根据需要添加。然后调用`openURL:`方法: ```objc - (IBAction)justJumpToOtherPage:(id)sender { NSString *appStr = @...
这里的`app-id`应替换为你的应用在App Store中的唯一标识符。当用户使用Safari浏览器访问包含此meta标签的页面时,如果他们已经安装了对应的App,系统会自动显示一个横幅,用户可以直接点击进入App。如果未安装,...
1. **发射端(Beacon)**: IBeacon设备不断发送包含UUID(Universally Unique Identifier)、Major和Minor三个标识符的广播包,以及传输功率值。UUID可以理解为全局唯一的“区域”标识,Major和Minor则是更具体的...
每个iOS设备都有一个唯一的设备标识符(ECID),当设备连接到iTunes进行升级或降级时,Apple会检查SHSH以确认操作的合法性。保存SHSH可以让用户在未来降级到已签名的固件版本。 2. 签名窗口:Apple通常只对最新版本...
在.xib或Storyboard中为新的Cell指定这个类,并为其设置一个唯一标识符。 2. **设计Cell**: 在新添加的Cell中,我们可以使用UILabel来展示文本内容,使用UIImageView来绘制气泡形状和箭头。对于气泡,你可以选择...