当前位置: 首页 > news >正文

iOS 开发之 -- UDID和UUID的详解

老实说,搞了几年的ios开发了,对基础的概念,还是不牢固,整天都是为了赶进度而码代码,这里记录一下这两者的区别:

UDID的全名为 Unique Device Identifier :设备唯一标识符。从名称上也可以看出,UDID这个东西是和设备有关的,而且是只和设备有关的,有点类似于MAC地址。真机调试,然后需要把UDID这个东西添加到Provisoning Profile授权文件中,也就是把设备唯一标识符添加进去,以此来识别某一台设备。  UDID是一个40位十六进制序列,我们可以使用iTunes和Xcode来获取这个值。

1,可以通过iTunes获取UDID,如下图:

 

2,可以在代码里面获取UDID,手机连上电脑,打开x-code,选择Window --> Devices,即可获得,如下图:

 

从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID,现在是不可能了。对于为什么要禁止访问UDID,我下面会提到。而在目前的SDK中,苹果提供了一个参数identifierForVendor来替代原来UDID的作用。通过代码实现如下: 
NSUUID *uuid = [UIDevice currentDevice].identifierForVendor;
NSLog(@"uuid 1 = %@",uuid.UUIDString);
 
此时打印出的字符串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的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。

 

UUID

英文名称是:Universally Unique Identifier,翻译过来就是通用唯一标识符。是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12 。UUID在某一时空下是唯一的。比如在当前这一秒,全世界产生的UUID都是不一样的;当然同一台设备产生的UUID也是不一样的,现在最简单获取UUID的代码如下:
    for (int i = 0; i < 10; i++)
    {
        NSString *uuid = [NSUUID UUID].UUIDString;
        NSLog(@"uuid 2 = %@",uuid);
    }
通过运行程序可以发现,循环10次,每一次打印的值都是不一样的,当然循环的再多,这个值永远不会出现两个一样的值。所以从某种程序上来说,UUID跟你的设备没有什么关系了。
 
       在很早之前,苹果宣称如果第三方应用开发者继续分享或者使用iPhone、Mac、AppleWatch的UDID的话,那么他们的应用将会禁止上架。为什么苹果要在应用中禁止使用呢?那是因为隐私问题。比如我开发了5款App,很多用户都下载了这5款App并使用。如果我能轻易的获取这些用户的UDID,其实我能拼凑出用户的很多信息。由于UDID本身的隐私属性,之前常常用来做第三方统计和其他的目的。当然现在也有人使用MAC地址来识别设备,因为MAC地址也唯一的识别了一台设备并且不会被修改,不知道以后苹果会对此如何操作。

转载于:https://www.cnblogs.com/hero11223/p/6757311.html

相关文章:

  • WDS 三种模式
  • C++11: atomic 头文件
  • 有特殊字符的JSON串
  • 微信错误提示code= -4/微信发送被拒绝
  • 关于mysql的初步学习 (四)
  • Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)
  • GridView中字符串太长处理方式
  • Squid.conf配置文件详解
  • CCF NOI1034 钞票兑换
  • Oracle11_g R2安装配置及PL/SQL Developer安装配置
  • ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。...
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 《SolidWorks 2017中文版机械设计从入门到精通)》——第1章 认识SolidWorks1.1 SolidWorks概述...
  • 《数据科学与大数据分析——数据的发现 分析 可视化与表示》一2.4 第3阶段:模型规划...
  • 《网页美工设计Photoshop+Flash+Dreamweaver从入门到精通》——1.2 网页美工常用工具...
  • 2017-08-04 前端日报
  • angular组件开发
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • JS数组方法汇总
  • session共享问题解决方案
  • SpringBoot 实战 (三) | 配置文件详解
  • 从0到1:PostCSS 插件开发最佳实践
  • 第2章 网络文档
  • 复杂数据处理
  • 机器学习学习笔记一
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端面试之闭包
  • 微信小程序--------语音识别(前端自己也能玩)
  • 因为阿里,他们成了“杭漂”
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • k8s使用glusterfs实现动态持久化存储
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何在招聘中考核.NET架构师
  • ​批处理文件中的errorlevel用法
  • # 达梦数据库知识点
  • #pragma once
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • %@ page import=%的用法
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (六)激光线扫描-三维重建
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (七)Knockout 创建自定义绑定
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (译)2019年前端性能优化清单 — 下篇
  • (转) Android中ViewStub组件使用
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET分布式缓存Memcached从入门到实战
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET序列化 serializable,反序列化
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @Validated和@Valid校验参数区别