`
啸笑天
  • 浏览: 3462027 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

iOS的标识符

    博客分类:
  • ios
 
阅读更多

 

UDID的全名为 Unique Device Identifier 设备唯一标识符。

从名称上也可以看出,UDID这个东西是和设备有关的,而且是只和设备有关的,有点类似于MAC地址。我在博客《iOS从生成证书到打包上架-02》提到了真机调试,然后需要把UDID这个东西添加到Provisoning Profile授权文件中,也就是把设备唯一标识符添加进去,以此来识别某一台设备。  UDID是一个40位十六进制序列,我们可以使用iTunesXcode来获取这个值。

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

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

示例: bb4d786633053a0b9c0da20d54ea7e38e8776da4

 

 

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或其它地方。

 

 

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非常简单:一个VendorCFBundleIdentifier(反转DNS格式)的前两部分。例如,com.doubleencore.app1 com.doubleencore.app2 得到的identifierForVendor是相同的,因为它们的CFBundleIdentifier 前两部分是相同的。不过这样获得的identifierForVendor则完全不同:com.massivelyoverrated net.doubleencore

 

在这里,还需要注意的一点就是:如果用户卸载了同一个vendor对应的所有程序,然后在重新安装同一个vendor提供的程序,此时identifierForVendor会被重置。

示例: 599F9C00-92DC-4B5C-9464-7971F01F8370

 

此时打印出的字符串UUIDString这个东西不是真正的UDID,而是一个有一点像的替代品。如同我上面所说,UDID是只和iOS设备有关的,而这个identifierForVendor是应用和设备两者都有关的,A应用安装到张三这台设备上,就会产生一个identifierForVendor(比如是:1234);A应用安装到李四这台设备上,就会产生另一个identifierForVendor(比如是:5678);B应用安装到张三这台设备上,又是一个全新的identifierForVendor(比如是:9999),B应用安装到李四这台设备上,还是一个全新的identifierForVendor(比如是:7777)。但是无论A应用安装卸载多少次,产生的是都是1234.  所以我们知道,这个identifierForVendor是一种应用加设备绑定产生的标识符,相当于是:Z(identifierForVendor) = X(某应用) + Y(某设备)。当然,和真正的UDID的区别是显而易见的:也就是说App的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。

 

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

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

 

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


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

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

 

 

 

NSUUID
NSUUID
iOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:

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

 

CFUUID一样,这个值系统也不会存储,每次调用的时候都会获得一个新的唯一标示符。如果要存储的话,你需要自己存储。在我读取NSUUID时,注意到获取到的这个值跟CFUUID完全一样(不过也可能不一样):

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

 

Keychain



 

我们可以获取到identifierForVendor,然后把identifierForVendor保存到KeyChain里面。

这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。使用group还可以可以保证同一个开发商的所有程序针对同一台设备能够获取到相同的不变的identifierForVendor

 

但是刷机或重装系统后identifierForVendor还是会改变。

 

code:https://github.com/easyui/EZToolKit/blob/master/EZToolKit/EZCategory/Foundation/NSString/NSString%2BEZ_Helper.m

thx:

iOS唯一标示符引导

获取iOS设备唯一标示UUID

iOS UDID和UUID详解

iOS运用keychain 把identifierForVendor当成唯一标识。替换advertisingIdentifier

 

  • 大小: 268.5 KB
分享到:
评论

相关推荐

    统计Nginx日志里前一个小时的IP数量以及IOS占比

    可以通过检查User-Agent字段中是否包含特定的iOS标识符,如"iPhone"或"iPad"。 4. **计数**:根据Unix时间戳,判断日志条目是否在前一小时内,并对IP进行计数。可以使用哈希表(如bash的关联数组)来存储IP及其访问...

    swift-iOSApp获取唯一标识符方案

    在iOS应用开发中,获取设备或应用的唯一标识符是一个常见的需求,这有助于跟踪用户行为、存储用户数据或实现个性化功能。在Swift中,我们有多种方法来获取这些标识符,但需要注意的是,由于Apple对用户隐私的保护,...

    Delphi跨平台(Win,Android,IOS)获取设备唯一标识符

    在IT行业中,跨平台开发是一项重要的技术,它允许开发者用一套代码库在多个操作系统上运行应用,例如Windows、Android和iOS。Delphi是一款强大的集成开发环境(IDE),它支持FireMonkey (FMX) 框架,使得开发跨平台...

    ios-获取iOS设备名称及生成设备唯一标识符.zip

    在iOS开发中,获取设备名称和生成设备唯一标识符是两个关键操作,它们对于调试、统计分析、个性化服务以及安全措施都有重要作用。本资源“ios-获取iOS设备名称及生成设备唯一标识符.zip”提供了相关的代码库...

    ios开发获取手机唯一标识符和调用系统打电话拨号功能

    在iOS开发中,获取手机的唯一标识符以及调用系统打电话拨号功能是常见的需求,尤其是在需要用户身份识别或者提供电话服务的应用中。下面将详细讲解这两个知识点。 首先,我们来探讨如何在iOS中获取手机的唯一标识符...

    获取设备唯一标识符UUID

    在iOS开发中,获取设备的唯一标识符UUID是常见的需求,用于区分不同的设备或存储特定设备的信息。UUID是一个全局唯一的、不可变的标识符,它由128位的数字组成,通常用32个16进制数字表示。本文将深入探讨如何在iOS...

    Delphi 12 控件之 ios,android,mswindows获取设备唯一标识符和mac地址.rar

    Delphi 12 ios,android,mswindows获取设备唯一标识符和mac地址.rar Delphi 12 fmx 跨平台(Win,Android,IOS)获取设备唯一标识符 在IT行业中,跨平台开发是一项重要的技术,它允许开发者用一套代码库在多个操作系统...

    HBuilderX申请iOS证书在线打包iOS文档.docx

    App ID是应用程序的唯一标识符,Bundle ID是应用程序的包名。 二、HBuilderX在线打包流程 HBuilderX提供了在线打包功能,支持开发者在Windows系统上直接开发和发布iOS应用程序。下面是HBuilderX在线打包流程: 1....

    Device-Chkr:iOS 项目通过运行时标识符(即 iPhone 6,1)确定当前设备型号并将其转换为有意义的名称

    标题中的"Device-Chkr"是一个iOS项目,其主要功能是通过运行时标识符来识别设备型号,并将这些复杂的数字-字母组合转换为易于理解的设备名称,如"iPhone 6,1"会转换为"iPhone 5s"。这个工具对于调试、性能测试以及...

    iOS14.2真机调试包

    3. **配置文件**:配置文件包含了设备的UDID(唯一设备标识符)和应用的标识信息,使得Xcode能够将应用安装到特定设备上进行调试。 4. **设备支持文件**:这些文件确保Xcode能够识别和通信与iOS 14.2兼容的硬件设备...

    ios12真机包

    它包含了设备的UDID(唯一设备标识符)以及开发者证书的相关信息,使得Xcode能够识别并信任安装在设备上的未签名应用。没有正确的真机包,开发者无法在设备上运行或调试他们的应用。 在本例中,“ios12真机包”特别...

    iOS 12.2真机调试包

    配置文件包含了设备的UDID(唯一设备标识符)和系统版本信息,是真机调试的关键组成部分。 总结来说,“iOS 12.2真机调试包”是针对iOS 12.2系统进行应用程序开发和测试的重要资源。结合Xcode,开发者可以充分利用...

    iOS11.1 真机调试包

    这通常涉及到安装路径、证书配置以及设备的UDID(唯一设备标识符)的匹配。确保正确的设置是进行真机调试的基础。 6. **开发流程**: 使用这个调试包进行开发时,开发者需要遵循标准的iOS开发流程,包括创建项目、...

    ios12真机调试包

    "12.0 (16A5288q)"这个文件名代表了iOS 12.0的特定版本,括号内的部分是该版本的内部标识符,用于区分不同的更新迭代。 当您将"ios12真机调试包"解压并放入上述路径后,Xcode就能识别到iOS 12.0系统,并支持在装有...

    读取设备信息 ios

    首先,UUID是iOS设备的一个唯一标识符,用于区分不同的设备。在iOS 5之前,开发者可以直接通过`UIDevice`类的`uniqueIdentifier`属性来获取UUID。然而,由于隐私和安全原因,从iOS 5开始,苹果不再推荐使用`...

    ios15.0真机调试包

    这些文件可能是开发者为了确保在特定版本的iOS上顺利调试而准备的,比如adhoc或企业级的 provisioning profile,它们定义了设备标识符和证书,使得非App Store分发的应用可以在特定设备上运行。有时,为了调试特定的...

    iOS App获取唯一标识符方案.zip

    方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。...

    IOS设配唯一标示

    在iOS开发中,为了识别和跟踪用户的设备,开发者经常需要获取设备的唯一标识符。"IOS设备唯一ID"是这个话题的核心,它涉及到如何在iOS系统中获取一个能标识特定设备的唯一标示。传统的iOS设备唯一标识符,如UDID...

    免费IOS开发证书Flex

    Bundle ID是每个应用的唯一标识符,通常格式为“com.companyname.appname”。这里改为“com.gamevil.zenonia2”,可能是因为该示例项目或者模板基于游戏“Zenonia 2”。 “证书密码:1234”指的是在使用.p12证书文件...

    iOS 12 真机调试包

    2. **设备注册**:在Apple Developer Portal中添加要调试的设备UDID(唯一设备标识符),确保设备被授权运行未签名的应用。 3. **代码签名**:使用生成的证书和Profile对应用进行签名,这是让iOS设备信任并运行该...

Global site tag (gtag.js) - Google Analytics