2019独角兽企业重金招聘Python工程师标准>>>

一、UDID 全名  Unique Device Identifier :设备唯一标识符。UDID是和设备有关的,而且是只和设备有关的,有点类似于电脑的MAC地址。真机调试中我们需要把UDID这个东西添加到Provisoning Profile授权文件中,也就是把设备唯一标识符添加进去,以此来识别某一台设备。

UDID是一个40位十六进制序列,我们可以使用 iTunes 和 Xcode 来获取这个值。

(1)iTunes获取UDID:

设备连上电脑,打开iTunes.

注意:默认这个位置显示的是序列号,只要点击一下序列号(红色箭头处)的位置,就可以切换为UDID了

(2)Xcode获取UDID:

把设备连上电脑,然后打开Xcode,选择Window-->Devices,就会显示出当前你连接上的所有设备,其中显示的Identifier就是该设备的UDID:

上面是通过设备直接查看得到的,如果我们要在代码中访问UDID,怎么做呢?

ios5 sdk中的获取方法:

[UIDevice currentDevice] uniqueIdentifier];

对于已越狱了的设备,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以为每一个应用分配不同的UDID.

所以UDID作为标识唯一设备的用途已经不大了.

二、UUID全名 Universally Unique Identifier的缩写,中文意思是通用唯一识别码。

很遗憾,自从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID,现在是不可能了。对于为什么要禁止访问UDID,我下面会提到。

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

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

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非常简单:一个Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。例如,com.doubleencore.app1 和 com.doubleencore.app2 得到的identifierForVendor是相同的,因为它们的CFBundleIdentifier 前两部分是相同的。)

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

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

重点:上面的IDFV方法中

这个identifierForVendor是应用和设备两者都有关的,A应用安装到张三这台设备上,就会产生一个identifierForVendor(比如是:1234);A应用安装到李四这台设备上,就会产生另一个identifierForVendor(比如是:5678);B应用安装到张三这台设备上,又是一个全新的identifierForVendor(比如是:9999),B应用安装到李四这台设备上,还是一个全新的identifierForVendor(比如是:7777)。  所以我们知道,这个identifierForVendor是一种应用加设备绑定产生的标识符,相当于是:Z(identifierForVendor) = X(某应用) + Y(某设备)。 当然,和真正的UDID的区别是显而易见的:也就是说App的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。且UUID每次生成的值都不一样,需要开发者自行保存UUID.

如果使用UUID为标识保存用户的资料在网络上,当用户卸载软件重装软件后,UUID的值就可能会发生改变(基本上可说是百分百会发生改变),用户则无法重新下载原来的网络资料。

三.一个可行的解决方案 

大多数应用都会用到苹果设备的UDID号,UDID通常有以下两种用途:

1)用于一些统计与分析目的;【第三方统计工具如友盟,广告商如ADMOB等】

2)将UDID作为用户ID来唯一识别用户,省去用户名,密码等注册过程。

但是因为UUID的特性,不能解决这种问题,现在网上有一现成的解决方案,使用设备的Mac地址,因为Mac地址也是唯一的.unix有系统调用可以获取Mac地址.但有些事情需要注意:

1.iPhone可能有多个Mac地址,wifi的地址,以及SIM卡的地址.一般来讲,我们取en0的地址,因为他是iPhone的wifi的地址,是肯定存在的.(例外情况依然有:市面上依然存在一部分联通的阉割版无wifi的iPhone)

2.Mac地址涉及到隐私,不应该胡乱将用户的Mac地址传播!所以我们需要将Mac地址进行hash之后,才能作为DeviceId上传.

关于第一个注意点的问题,经过我测试,没有Wifi功能的iPhone3GS一样可以获得Mac地址,所以这应该是目前标识设备唯一最好的一个解决方案.

解决方案github下载地址github。https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5

该方案提供了两个方法:

uniqueDeviceIdentifier (返回MAC和CFBundleIdentifier的MD5值)

uniqueGlobalDeviceIdentifier(返回MAC的MD5值)

使用方法:

#import "UIDevice+IdentifierAddition.h"

NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);

NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);

测试结果:

WIFI下:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX

新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

3G下:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX

新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

GPRS下

UDID:XXXX21f1f19edff198e2a2356bf4XXXX

新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

飞行模式下:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX

新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

删除应用重装后:

UDID:XXXX21f1f19edff198e2a2356bf4XXXX

新生成的:XXXX7dc3c577446a2bcbd77935bdXXXX

转载于:https://my.oschina.net/u/2472425/blog/833156

UDID 和 UUID 的问题相关推荐

  1. 手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)

    文章目录 Android篇 1 IMEI和MEID 2 DeviceId 3 mac地址 4 ANDROID_ID 5 UUID 6 OpenUDID 7 Serial Number 8 IDFA 9 ...

  2. iOS各种设备识别码IDFA、UDID、UUID、MAC、OpenUDID、IDFV

    今天在app服务端接口文档中看到2个接口名称,是和idfa相关的,就搜索了解了一下,顺便梳理了ios各种设备识别码. *IDFA英文全称Identifier+for+Advertising,即广告标示 ...

  3. Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)

    Android Q获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID) 一.简介 1.1 问题背景 1.2 关键技术 二.解决方案 2.1 谷歌官方推荐方案 (4种) 2.2 实现方 ...

  4. iOS开发中的UDID和UUID详解

    今天突然想和大家聊聊UDID和UUID的问题,虽然平时我们对这两个东西很忽视,往往也很难区分这两个东西.今天就来好好谈谈. [UDID] UDID的全名为 Unique Device Identifi ...

  5. 如何查看苹果的UDID或者UUID

    方法一: 使用以下二维码即可扫码或者成功: 方法二: 其实很简单,就是官网下载itunes,数据线手机连接电脑,点击itunes界面的手机图标,再点击序列号,就变udid了. 详情查看下面步骤: 有时 ...

  6. UDID和UUID的理解

    今天突然想和大家聊聊UDID和UUID的问题,虽然平时我们对这两个东西很忽视,往往也很难区分这两个东西.今天就来好好谈谈. [UDID] UDID的全名为 Unique Device Identifi ...

  7. iPhone开发关于UDID和UUID的一些理解

    UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识 ...

  8. 理解 : UDID、UUID、IDFA、IDFV

    iOS获取设备唯一标识的各种方法?IDFA.IDFV.UDID分别是什么含义? iOS获取设备ID总结 IDFA解释 关于UUID的理解 : 英文名称是:Universally Unique Iden ...

  9. python获取机器唯一标识_开发中常用工具 - 获取设备的唯一标识、UDID、UUID、keychain保存UUID、判断网络...

    UDID 全名:Unique Device Identifie(设备唯一标识符) 说明:UDID,即设备唯一标识符,这是除序列号之外每台iOS设备的独一无二的号码.UDID只是和设备相关的,是用来区分 ...

  10. 移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID的名词解释

    一.最兼容的设备识码 二.名词释义     2.1 Device ID     2.2 IMEI     2.3 IDFA     2.4 UDID     2.5 UUID 三.设备标识码详解   ...

最新文章

  1. iOS开发-UITableView顶部图片下拉放大
  2. 基于 FPGA 的并行全比较排序算法,topK
  3. go语言中利用匿名函数和闭包实现文件名修改
  4. Android 缓存目录 Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
  5. Dubbo 新编程模型之外部化配置
  6. python 复制文件_10 行 Python 代码写 1 个 USB 病毒
  7. I2C总线协议原理介绍
  8. 《孤勇者》matlab版,用matlab弹奏《孤勇者》
  9. wind river -diab
  10. python扩展包怎么安装_Python中扩展包的安装方法详解
  11. 跳槽进阿里了,面试阿里P6也没那么难。
  12. c语言中取小数函数,C / C++ 保留小数函数(setprecision(n)的一些用法总结)
  13. 陈艾盐:《春燕》百集访谈节目第三十九集
  14. 分享一个很好用的滚动截图软件,可以word转成图片
  15. iOS横屏电子签名上篇【核心原理: 旋转特定的屏幕 Quartz2D】应用场景:采集电子签名,支持签名界面为横屏其余页面都是竖屏、清除重写、灵活控制提示语信息、以及查看商户协议等
  16. 最简单斐波那契数列输出C语言
  17. QT 文本html显示格式的问题,如在QTextBrowser.setText用tr(),其中为html格式
  18. redis 生产环境 谨慎执行的命令
  19. 使用Mars3d创建一个地球
  20. java使用adb连接模拟器截图并把截图文件直接保存到电脑上

热门文章

  1. 基于5g的交通运输_一种基于5G的智慧交通基础服务平台
  2. my.cnf配置详解
  3. 新旧音标对照表与英式音标表
  4. ELEMENT UI中关于上传图片el-upload控件删除(同时删除后台图片信息)
  5. SQL文件切割工具、大文件操作工具
  6. Cortex-A7中断系统
  7. LC.1056. Confusing Number, LC.246. Strobogrammatic Number
  8. driver: linux下如何模拟按键输入和模拟鼠标
  9. 负载均衡(四层) LVS(看完就能去上班)
  10. 实验一 网络侦查与网络扫描