`

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

    博客分类:
  • ios
 
阅读更多


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

一、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(2011年8月份)开始,苹果宣布将不再支持用以下方法获取设备的UDID。

 

1
[UIDevice currentDevice] uniqueIdentifier];

三、拒绝 iOS 应用获取设备的 UDID的原因

UDID本来是为了方便一个应用来统计用户行为的,但是因为是一个唯一ID,而且直接看不到跟用户隐私的关系,所以是开放出来的。但是,当有大量的App在市场中,而UDID对于每个App都是一样的时候,用户的隐私其实受到了一定程度的侵犯。假设有很多App联合在一起,因为UDID是统一的,那么他们就可以拼凑出用户的隐私出来。所以从这个角度苹果去掉了UDID的支持,而每个应用可以自行生成自己的UUID,所以,单一app的统计仍旧不会发生问题。所以主要的原因是隐私问题。

四、必须使用UDID时建议的UUID替代方案

1、苹果公司建议的UUID替代方案

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

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

2、使用开源方案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生成唯一识别码的代码是:

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

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

1
2
UIPasteboard* slotPB = [UIPasteboardpasteboardWithName:availableSlotPBid create:YES];    
[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就跟以前的不一样了(本人测了一下,确实如此)。可见,这种方法还是不保险。

3、开源方案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的贡献者比较厚道。
4、与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地址。

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

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

分享到:
评论

相关推荐

    iOS 通过 描述文件获取 UDID

    在早期版本的iOS中,开发者可以自由使用UDID来追踪和识别用户设备,但在iOS 5之后,Apple出于隐私考虑,限制了对UDID的直接访问。然而,为了某些特定场景如企业内部设备管理或测试,开发者仍需要获取UDID。本示例...

    iOS7获取UDID、IMEI、SN、ICCID、Mac地址等信息

    这是苹果提供的一套API,用于获取设备的一些特定信息。在iOS 7之前,通过这个库可以方便地获取UDID,但随着iOS系统的更新,苹果去除了UDID的公开访问权限,以防止滥用并保护用户隐私。现在,如果尝试通过`...

    苹果手机UDID的获取

    UDID(Unique Device Identifier)是苹果设备的一个唯一识别码,用于区分不同的iOS设备。这个16进制的字符串由40个字符组成,对于开发者和企业来说,UDID曾经是识别、跟踪和管理用户设备的重要工具。然而,由于隐私...

    苹果手机快速获取UDID

    通过以上介绍的方法,开发者可以轻松地获取苹果设备的UDID,进而为iOS应用的开发和测试提供便利。值得注意的是,在获取UDID的过程中要注意个人隐私保护,选择可信的服务提供商,并确保所使用的方法与当前设备的iOS...

    苹果开发账户中添加Udid,证书和ipa打包

    该过程主要用于将iOS应用程序安装到自己的iOS设备上测试、或者安装到别人的iOS设备上,或者想发布到App Store中。 一、添加证书 添加证书是制作Profile文件的第一步。首先,需要登录到苹果开发者网站,选择...

    iphone手机获取device id即UDID的方法

    iPhone 设备的唯一标识符,通常被称为UDID(Unique Device Identifier),是一个16进制的字符串,用于区分不同的iOS设备。UDID对于开发者、企业内部管理以及应用分发等场景至关重要。以下是一份详细的指南,教你如何...

    ios UDID替换方案--真正可行的。OpenUDID

    在iOS开发中,UDID(Unique Device Identifier)曾是用于唯一标识每一台设备的重要标识符。然而,出于用户隐私保护的考虑,Apple在iOS 5之后逐渐限制了UDID的使用,并在iOS 6中完全移除。这给开发者带来了挑战,因为...

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

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

    获取ios设备号

    1. UDID(Unique Device Identifier):UDID是苹果早期为每个iOS设备分配的一个全球唯一的40位十六进制字符串,它能准确地标识每一台设备。然而,由于隐私保护的原因,苹果在iOS 5之后限制了UDID的使用,并在iOS 6中...

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

    在iOS中,Apple为了保护用户隐私,限制了获取设备唯一标识符(UDID)的行为。UDID曾是每个iOS设备独一无二的16进制字符串,但自iOS 5开始被逐步淘汰。开发者现在可以使用以下几种方式来创建一种相对唯一的标识: 1....

    IOS获取UDIDdemo支持ios7

    在"IOS获取UDIDdemo支持ios7"的示例中,开发者可能采用了如上所述的一种或多种方法来模拟UDID的行为,可能包括创建一个持久性的设备标识,以便在不违反苹果政策的情况下,为特定目的(如统计分析)区分不同设备。...

    Air程序获取ios设备唯一识别码

    虽然UDID本身并不含有任何用户信息,但是由于应用开发者可以将UDID与服务器上用户信息进行绑定,从而带来了诸多隐私泄漏等问题,所以苹果最终还是拒绝开发者访问UDID的官方接口,建议开发者使用CFUUID来代替UDID。...

    ProPLUG OpenUDID - iOS Unique Identifier Replacement UDID.rar

    UDID是一个由苹果分配给每个iOS设备的40位的唯一字符串,它在设备的生命周期内保持不变,允许开发者和广告网络识别特定的设备。然而,由于UDID可能导致用户被过度追踪,苹果决定从其SDK中移除对它的支持。这迫使...

    IOS获取设备名称

    苹果提供了一个名为`UIDevice`的类,它是iOS SDK的一部分,用于获取设备的基本信息,包括设备名称、唯一标识符(UDID)、系统版本等。 1. **UIDevice类**: `UIDevice`是iOS中用于获取设备信息的核心类。通过实例...

    快速查看UDID

    UDID,全称为Unique Device Identifier,是苹果iOS设备的一个唯一标识符,用于区分不同设备。每个iOS设备(如iPhone、iPad)都有一个16进制的40位字符串作为其UDID,确保设备在全球范围内独一无二。UDID在开发、测试...

    ios命令行调试工具libimobiledevice详解

    - `idevicesystemname -u [udid]` 获取设备名称。 - `ideviceinfo -u [udid] -k ProductVersion` 获取设备系统版本。 - `ideviceinfo -u [udid] -k ProductType` 获取设备型号。 - `ideviceinfo -u [udid] -k ...

    UUID+KeyChain实现iOS唯一标示UDID

    在iOS开发中,由于苹果对用户隐私保护的加强,自iOS 6开始,Apple不再允许开发者直接使用UDID(Unique Device Identifier)来标识设备。UDID是一个设备的全球唯一的序列号,但考虑到用户隐私,苹果引入了新的机制,...

    iphone UDID读取方法

    UDIDHelper是一个专为查询UDID设计的免费软件,它要求设备必须支持iOS 4.0以上的系统版本。具体步骤如下: 1. 在设备上访问指定的下载链接,下载并安装UDIDHelper应用。 2. 打开UDIDHelper应用,软件会自动检测并...

    查询iPad/iPhone设备的UDID

    在进行iOS应用开发时,经常需要获取iPad或iPhone设备的唯一设备识别码(Unique Device Identifier,简称UDID),以便进行设备注册、测试等操作。本文将详细介绍如何通过苹果官方提供的iTunes软件来查询iPad/iPhone...

    获取iOS设备唯一标识

    在iOS开发中,获取设备的唯一标识符是一个常见的需求,特别是在需要区分不同用户设备或存储设备特定数据时。本文将详细讲解如何在iOS系统中获取设备的唯一标识,并讨论相关的重要知识点。 首先,我们需要理解“UUID...

Global site tag (gtag.js) - Google Analytics