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


下面我们来具体分析下每种获取方法的利弊

1、UDID

什么是UDID
UDID 「Unique Device Identifier Description」是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches,这些编码看起来是随机的,实际上是跟硬件设备特点相联系的。

UDID是用来干什么的?
UDID可以关联其它各种数据到相关设备上。例如,连接到开发者账号,可以允许在发布前让设备安装或测试应用;也可以让开发者获得iOS测试版进行体验。苹果用UDID连接到苹果的ID,这些设备可以自动下载和安装从App Store购买的应用、保存从iTunes购买的音乐、帮助苹果发送推送通知、即时消息。 在iOS 应用早期,UDID被第三方应用开发者和网络广告商用来收集用户数据,可以用来关联地址、记录应用使用习惯……以便推送精准广告。

为什么苹果反对开发人员使用UDID?
iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。 许多开发者把UDID跟用户的真实姓名、密码、住址、其它数据关联起来;网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据。同时大部分应用确实在频繁传输UDID和私人信息。 为了避免集体诉讼,苹果最终决定在iOS 5 的时候,将这一惯例废除,开发者被引导生成一个唯一的标识符,只能检测应用程序,其他的信息不提供。现在应用试图获取UDID已被禁止且不允许上架。

所以这个方法作废。

2、IDFA

全名:advertisingIdentifier
获取代码:

 #import <AdSupport/AdSupport.h>NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  • 来源:iOS6.0及以后
  • 说明:直译就是广告id, 在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪 里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了。
  • 注意:由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户。

3、IDFV

全名:identifierForVendor
获取代码:

NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
  • 来源:iOS6.0及以后
  • 说明:顾名思义,是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.taobao.app1, com.taobao.app2 这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。
  • 注意:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同。

4、MAC地址

使用WiFi的mac地址来取代已经废弃了的uniqueIdentifier方法。具体可见: http://stackoverflow.com/questions/677530/how-can-i-programmatically-get-the-mac-address-of-an-iphone

然而在iOS 7中苹果再一次无情的封杀mac地址,使用之前的方法获取到的mac地址全部都变成了02:00:00:00:00:00。

5、UUID

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

这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。使用group还可以可以保证同一个开发商的所有程序针对同一台设备能够获取到相同的不变的UDID。
但是刷机或重装系统后uuid还是会改变。

使用Keychain,将UUID当做密码信息来存储.
大致流程:

  1. 通过AdSupport获取UUID(原因AdSupport可以跨应用)
 1. (NSString *)appleIFA {NSString *ifa = nil;Class ASIdentifierManagerClass = NSClassFromString(@"ASIdentifierManager");if (ASIdentifierManagerClass) { // a dynamic way of checking if AdSupport.framework is availableSEL sharedManagerSelector = NSSelectorFromString(@"sharedManager");id sharedManager = ((id (*)(id, SEL))[ASIdentifierManagerClass methodForSelector:sharedManagerSelector])(ASIdentifierManagerClass, sharedManagerSelector);SEL advertisingIdentifierSelector = NSSelectorFromString(@"advertisingIdentifier");NSUUID *advertisingIdentifier = ((NSUUID* (*)(id, SEL))[sharedManager methodForSelector:advertisingIdentifierSelector])(sharedManager, advertisingIdentifierSelector);ifa = [advertisingIdentifier UUIDString];}return ifa;
}
  1. 如果不支持AdSupport,那就使用IFV/IDFV (Identifier for Vendor)
+ (NSString *)appleIFV {if(NSClassFromString(@"UIDevice") && [UIDevice instancesRespondToSelector:@selector(identifierForVendor)]) {// only available in iOS >= 6.0return [[UIDevice currentDevice].identifierForVendor UUIDString];}return nil;
}
  1. 如果以上的都不支持,使用CFUUIDRef手动创建UUID
+ (NSString *)randomUUID {if(NSClassFromString(@"NSUUID")) { // only available in iOS >= 6.0return [[NSUUID UUID] UUIDString];}CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);CFStringRef cfuuid = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);CFRelease(uuidRef);NSString *uuid = [((__bridge NSString *) cfuuid) copy];CFRelease(cfuuid);return uuid;
}
  1. 最后,添加到Keychain
+ (void)setValue:(NSString *)value forKey:(NSString *)key inService:(NSString *)service {NSMutableDictionary *keychainItem = [[NSMutableDictionary alloc] init];keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAlways;keychainItem[(__bridge id)kSecAttrAccount] = key;keychainItem[(__bridge id)kSecAttrService] = service;keychainItem[(__bridge id)kSecValueData] = [value dataUsingEncoding:NSUTF8StringEncoding];SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
}

如果更新了provisioning profile的话, Keychain data会丢失.所以我们应该将UUID在NSUserDefault备份.

[[NSUserDefaults standardUserDefaults] setObject:@”123456-1234-1234-12345678” forKey:@"deviceUID"];
[[NSUserDefaults standardUserDefaults] synchronize];

获取iOS设备唯一标识相关推荐

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

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

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

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

  3. iOS设备唯一标识获取策略(不定时更新)

    在iOS系统中,获取设备唯一标识的方法有很多: 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果IOS设备 ...

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

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

  5. 获取Android设备唯一标识

    很多情况下,需要将APP和设备进行绑定,以保证用户不会无限制的注册或发送请求.然而,Android设备并没有绝对的唯一标识. Android提供了多种方法来获取所谓的唯一标识.常用的有六种. (1)A ...

  6. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  7. 获取安卓设备唯一标识码并存储在SharedPRreferences中

    前言:设备登陆时提供设备序列号信息传到后端,安卓设备日新月异,一些设备仅支持wifi上网即没插卡功能,且互联网企业APP根本无法限制统一用户设备,用户可使用虚拟机不断创建新模拟器来伪装成新设备用于注册 ...

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

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

  9. ios 设备获取idfa_获取iOS设备唯一标示UUID

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

最新文章

  1. debian10 mariadb安装
  2. 【匹配算法】渐进一致采样 PROSAC(PROgressive SAmple Consensus)
  3. Android开发中,eclipse找不到已存在的layout资源文件
  4. numpy.power()
  5. python转csv_python如何将列表存储为csv文件
  6. openresty开发系列15--lua基础语法4表table和运算符
  7. (二)网络安全概论之云安全
  8. stl-map/set
  9. 2020数字中国创新大赛-智能算法赛-冠军方案
  10. jmeter制造大批量的用户数据数据
  11. sfp光模块和sfp+高速线缆有什么区别?
  12. 解字符串不能超过8000的方法及交叉表的处理
  13. discuz邮件设置PHP,Discuz!6.0—如何配置发送邮件的参数
  14. java 记录一个类加载顺序的坑
  15. 计算机中的字,双字以及存储
  16. 【路径规划】基于matlab A_star算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1388期】
  17. 汽车UDS诊断之控制诊断故障码设置服务(0x85)深度剖析
  18. 实测python-onvif协议控制摄像头
  19. 洛谷 P5713 【深基3.例5】洛谷团队系统 C语言
  20. 【CondaHTTPError: HTTP 404 NOT FOUND for url <https://conda.anaconda.org/conda-forg/noarch/repodata.】

热门文章

  1. C# 之多线程篇 Task(C#超级工具类)
  2. vue中播放flv流视频
  3. 测试窗体的FormBorderStyle属性,不同属性所对应的窗体边框显示情况
  4. 全球与中国无线视频门铃对讲机市场深度研究分析报告
  5. kickstarter众筹
  6. mysql快速复制数据库
  7. android应用程序耗电,Android的十大耗电量应用程序,在软件中排名第一
  8. Chrome谷歌浏览器关闭弹出Chrome版本太旧提示框
  9. 【NLP】自然语言处理的中间序列建模
  10. nginx php多域名配置文件,配置文件,nginx_nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点,配置文件,nginx - phpStudy...