在iOS系统中,获取设备唯一标识的方法有很多:
一.UDID(Unique Device Identifier)

UDID的全称是Unique Device Identifier,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从IOS5.0(2011年8月份)开始,苹果宣布将不再支持用uniqueIdentifier方法获取设备的UDID,iOS5以下是可以用的。在2013年3月21日苹果已经通知开发者:从2013年5月1日起,访问UDID的程序将不再被审核通过,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”。所以UDID是绝对不能用啦。

二.UUID(Universally Unique Identifier)

UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。

三.MAC Address

这个MAC地址是指什么?有什么用?
       MAC(Medium/Media Access Control)地址,用来表示互联网上每一个站点的标识符,采用十六进制数表示,共六个字节(48位)。其中,前三个字节是由IEEE的注册管理机构 RA负责给不同厂家分配的代码(高位24位),也称为“编制上唯一的标识符” (Organizationally Unique Identifier),后三个字节(低位24位)由各厂家自行指派给生产的适配器接口,称为扩展标识符(唯一性)。
    MAC地址在网络上用来区分设备的唯一性,接入网络的设备都有一个MAC地址,他们肯定都是不同的,是唯一的。一部iPhone上可能有多个MAC地址,包括WIFI的、SIM的等,但是iTouch和iPad上就有一个WIFI的,因此只需获取WIFI的MAC地址就好了,也就是en0的地址。
      形象的说,MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。这样就可以非常好的标识设备唯一性,类似与苹果设备的UDID号,通常的用途有:1)用于一些统计与分析目的,利用用户的操作习惯和数据更好的规划产品;2)作为用户ID来唯一识别用户,可以用游客身份使用app又能在服务器端保存相应的信息,省去用户名、密码等注册过程。

那么,如何使用Mac地址生成设备的唯一标识呢?主要分三种:
1、直接使用“MAC Address”
2、使用“MD5(MAC Address)”
3、使用“MD5(Mac Address+bundle_id)”获得“机器+应用”的唯一标识(bundle_id 是应用的唯一标识)

iOS7之前,因为Mac地址是唯一的, 一般app开发者会采取第3种方式来识别安装对应app的设备。为什么会使用它?在iOS5之前,都是使用UDID的,后来被禁用。苹果推荐使用UUID 但是也有诸多问题,从而使用MAC地址。而MAC地址跟UDID一样,存在隐私问题,现在苹果新发布的iOS7上,如果请求Mac地址都会返回一个固定 值,那么Mac Address+bundle_id这个值大家的设备都变成一致的啦,跟UDID一样相当于被禁用。

四.OPEN UDID

OPEN UDID,没有用到MAC地址,同时能保证同一台设备上的不同应用使用同一个OpenUDID,只要用户设备上有一个使用了OpenUDID的应用存在时,其他后续安装的应用如果获取OpenUDID,都将会获得第一个应用生成的那个。但是根据贡献者的代码和方法,和一些开发者的经验,如果把使用了OpenUDID方案的应用全部都删除,再重新获取OpenUDID,此时的OpenUDID就跟以前的不一样。可见,这种方法还是不保险。(可通过重置手机功能直接修改)

五.广告标示符(IDFA-identifierForIdentifier)

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

六.Vindor标示符 (IDFV-identifierForVendor)

Vindor标示符,也是在iOS 6中新增的,跟advertisingIdentifier一样,该方法返回的是一个 NSUUID对象,可以获得一个UUID。如果满足条件“相同的一个程序里面-相同的vindor-相同的设备”,那么获取到的这个属性值就不会变。如果是“相同的程序-相同的设备-不同的vindor,或者是相同的程序-不同的设备-无论是否相同的vindor”这样的情况,那么这个值是不会相同的。

七.推送token+bundle_id

推送token+bundle_id的方法:
1、应用中增加推送用来获取token
2、获取应用bundle_id
3、根据token+bundle_id进行散列运算
apple push token保证设备唯一,但必须有网络情况下才能工作,该方法不依赖于设备本身,但依赖于apple push,而苹果push有时候会抽风的。

以上是主流的几种获取策略,差不多被苹果封禁的差不多了,下面讲解折中的办法:

第一个解决的办法是:UUID一般只生成一次,保存在iOS系统里面,如果应用删除了,重装应用之后它的UUID还是一样的,除非系统重置 。但是不能保证在以后的系统升级后还能用(如果系统保存了该信息就能用).

由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。

通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。

keychain里保存的信息不会因App被删除而丢失。所以,可以利用这个keychain这个特点来保存设备唯一标识。

那么,如何在应用里使用使用keyChain呢,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。

直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,我们可以使用已经封装好了的工具类KeychainItemWrapper来对keychain进行操作。

KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上下载了GenericKeychain项目后,

只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework 。KeychainItemWrapper的用法:

//获取手机的UUID(设备的唯一标示)
-(NSString *)getDeviceIdentifier
{KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"deviceIdentifier" accessGroup:nil];NSString *uniqueIdentifier = [wrapper objectForKey:(id)kSecAttrAccount];NSLog(@"device_identifier:%@",uniqueIdentifier);NSLog(@"device_ADID:%@",[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]);//通过广告标识符 暂时替换(但使用ASI而并没有广告在上架的时候会被拒绝)if ([uniqueIdentifier isEqualToString:@""]) {[wrapper setObject:[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString] forKey:(id)kSecAttrAccount];/*如果是上架问题也可以替换为别的[[UIDevice currentDevice].identifierForVendor UUIDString];*/NSLog(@"set uniqueIdentifier.");}uniqueIdentifier = [wrapper objectForKey:(id)kSecAttrAccount];return uniqueIdentifier;
}

第二个解决办法(也是目前最常用的方法):使用描述文件获取手机的UDID

让你的手机安装一个描述文件,就能在控制台获得手机的udid

首先需要你新建一个后缀是.mobileconifg的这么一个文件,文件其实就是一个XML的文件

需要修改是以上两个地方,第一个是你的后台的URL,描述文件安装的时候就会发送请求给这个URL,在URL的get请求内能获得设备的信息

第二个地方是你所请求的设备信息UDID,Version等

完成xml后 将文件放入服务器,在写一个php文件指向改文件即可

receive.php

<?php
$data = file_get_contents('php://input');
//这里可以进行xml解析
//header("Location: http://dev.skyfox.org/udid?data=".rawurlencode($data)); //有人说必须得目录形式才会安装成功
header('HTTP/1.1 301 Moved Permanently');  //这里一定要301跳转,否则设备安装会提示"无效的描述文件"
header("Location: http://服务器地址/udid/index.php?".$params);
?>

关于后续文件签名可以参考我的另一篇博文:https://blog.csdn.net/u012717715/article/details/86542360

iOS设备唯一标识获取策略(不定时更新)相关推荐

  1. 转-ios设备唯一标识获取策略

    [http://www.2cto.com/kf/201308/237648.html] 英文原文:In iOS 7 and later, if you ask for the MAC address ...

  2. [转]iOS设备唯一标识探讨

    转自:http://www.jianshu.com/p/b83b0240bd0e iOS设备唯一标识探讨 为了统计和检测应用的使用数据,几乎每家公司都有获取唯一标识的业务需求,在iOS5以前获取唯一标 ...

  3. 获取iOS设备唯一标识

    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: 1.UUID 2.IDFA ...

  4. iOS设备唯一标识(可以用版)

    由于UDID和OpenUDID被禁用,系统自带的的识别唯一标识有两种 广告标示符(IDFA-identifierForIdentifier) 这是iOS 6中另外一个新的方法,advertisingI ...

  5. iOS设备唯一标识符探讨

    iOS设备唯一标识符探讨 一.现有方案 1.UDID(Unique Device Identifier) 获取方法:[[UIDevice currentDevice] uniqueIdentfier] ...

  6. iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

    http://www.ithao123.cn/content-8688001.html iOS获取设备唯一标识的各种方法?IDFA.IDFV.UDID分别是什么含义? [摘要:1.UDID (Uniq ...

  7. 跨平台应用开发进阶(六十):uniapp 获取设备唯一标识信息

    文章目录 一.前言 二.其他方案 2.1 调用原生 2.2 插件调用 2.2.1 Ba-IdCode 2.2.2 KeyChain 三.实施方案 四.拓展阅读 一.前言 应App个人信息保护与安全要求 ...

  8. android获取设备唯一标识_数据埋点:用户唯一标识

    用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户. 01 为什么要建设用户唯一标识 如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情. ...

  9. 获取android设备唯一编号_如何获取Android设备唯一标识码教程

    ID的全称是(Virtual identity electronic identification),中文名为通用账户,是俗称的网络身份证.它是一种互联网身份认证协议,其具有唯一性和信息不可否认性.I ...

最新文章

  1. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用50
  2. A folder failed to be moved——Android SDK的安装问题解决方案
  3. java竞拍系统代码,网上拍卖系统的设计与实现(源代码及全套资料).doc
  4. 2021 “AI Earth”人工智能创新挑战赛 AI助力精准气象和海洋预测
  5. python socket清空接受区_用Python制作只属于你和ta的聊天渠道吧
  6. 提取过程_大米多肽提取过程中如何应用膜分离技术呢?
  7. Myeclipse包变成文件夹
  8. python廖老师_Python3.5-20190518-廖老师-自我笔记-面向对象
  9. latex中的对号和错号
  10. 智方8000系进销存管理系统 杀毒软件下载
  11. python中计算ln和lg的方法
  12. Java 新人含笑7步癫 No.140
  13. W10应用商店Microsoft Store的安装
  14. 如何写一篇可实施的技术方案?
  15. 巧用win7搜索功能
  16. 加拿大量子计算机原理,量子计算机是基于什么原理而制造出来的?
  17. 线路中央计算机系统,线路中央计算机系统主要负责各自线路数据的收集、处理、分析和整理,并与ACC系统进行数据交换。...
  18. PFLD: A Practical Facial Landmark Detector--Xiaojie Guo
  19. [转]银监会紧急澄清:二套房贷首付六成报道不实
  20. ‘数据分析实战’——营销组合分析(甲厨电公司案例)

热门文章

  1. 搭建Mysql双主双从报错The slave I/O thread stops because master and slave have equal MySQL server UUIDs(已解决)
  2. Layui前端框架教程_layui视频教程_Layui使用教程
  3. vite如何兼容低版本浏览器
  4. 2019年浙江大学计算机考研复试线,2019年浙江大学考研复试分数线已经公布
  5. subclass and extends
  6. rtx2060什么水平_显卡新秀:RTX2060性能评测
  7. 自然语言处理--加载使用facebook的预训练 fastText 模型wiki-news-300d-1M.vec
  8. openwrt 配置 wifidog
  9. Linux系统备份系统还原
  10. 怎么复制网页上不能复制的文字