文档章节

UDID、UUID、IDFA、IDFV的区分记录

o
 osc_z1hvg4cu
发布于 2018/04/26 14:42
字数 1364
阅读 9
收藏 0
ios

精选30+云产品,助力企业轻松上云!>>>

 前言

  有段时间没再碰到过这个,直到前段时间不断提及推广的问题,故总结一下方便使用

UDID

  

UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,由40个字符的字母和数字组成。移动广告商和游戏网络运营商往往需要通过UDID用来识别玩家用户,并对用户活动进行跟踪。 

UDID 在 iOS5.0 的时候已经被抛弃使用了. 

  调用代码如下

[[UIDevice currentDevice] uniqueIdenfier];

  不过不要对它抱有希望,官网API里并没有找到uniqueIdenfier 这个方法~~~

UUID

  UUID也被称作 GUID (Globally Unique Identifiers) 或 IID (Interface Identifiers),是一个128-bit的值。

  实际上经常说的UUID实际上是有两个类NSUUID和CFUUID,分别来源于两个框架Foundation和CoreFoundation。

    CFUUID iOS 2.0+ 

    NSUUID iOS6.0 +

 

  值得注意的是在NSUUID的Overview中有这么一句话

    The NSUUID class is not toll-free bridged with CoreFoundation’s CFUUIDRef

    //NSUUID类并不是CoreFoundation框架中CFUUIDRef 的toll-free bridged

  OK,那什么是toll-free bridged呢?

    所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。很多数据类型支持这一特性,其中包括群体和字符串数据类型。

 

  获取CFUUID

- (NSString *)createCFUUID
{
    // Create universally unique identifier (object)
    CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault);
    
    // Get the string representation of CFUUID object.
    NSString *uuidStr = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidObject));
    
    CFRelease(uuidObject);
    
    return uuidStr;
}

  至于获取NSUUID的话,可以查看下面的IDFV

IDFA

     

   

  其实整个AdSupport框架中就只有ASIdentifierManager 的一个类,这个类也很简单的提供了AdvertisingTrackingEnabled和advertisingIdentifier两个属性。

  advertisingIdentifie用于获取用户的IDFA值。 

   Device的identifierForVendor属性,相同的值返回给所有的vendors,这个值或许会被改变,比如说用户擦除设备 - 所以你不应该缓存它。

      ⚠️注意:在iOS10及以后的版本,如果用户限制广告跟踪,那么返回值都为0.

      如果值为nil,那么要等待一会再试。比如:当用户重启设备但没有解锁的时候。

   AdvertisingTrackingEnabled用于IDFA是否被限制进行判断

      这个属性有这样一句描述

If the value is NO, use the advertising identifier only for the following purposes: frequency capping, attribution, conversion events, estimating the number of unique users, advertising fraud detection, and debugging.

//如果返回值为NO,那么只把IDFA用于frequency capping, attribution, conversion events, estimating the number of unique users, advertising fraud detection, and debugging.

 

  获取IDFA

#import <AdSupport/AdSupport.h>

- (NSString *)getIDFAString
{
    //ios10 之后用户可以限制广告追踪 再次判断用户是否进行了限制
    if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
        NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
        return adId;
    }
    return nil;
}

  

 

IDFV

    

  

  由此可见IDFV的值有下面两种情况

    相同:自同一设备上运行的同一供应商(vendor)的应用

    不同:同一设备上不同供应商(vendor)的应用程序

       不同设备上的应用程序(无论供应商(vendor)是否相同)

  同时,苹果给出了供应商(vendor)的依据

    通常,供应商由App Store提供的数据确定。如果应用程序未从应用程序商店安装(例如企业应用程序和应用程序仍在开发中),则根据应用程序的bundle ID计算供应商标识符。bundle ID      被认为是反向DNS格式。

    • 在iOS 6上,bundle ID的前两个部分用于生成供应商ID。如果捆绑包ID仅具有单个组件,则使用整个bundle ID。

    • 在IOS 7上,除最后一个组件之外的所有组件都用于生成供应商ID。如果软件包ID仅包含单个组件,则使用整个bundle ID。

     然后给了个🌰

    

Bundle ID

iOS 6.x

iOS 7.x

com.example.app1

com.example.app1

com.example.app1

com.example.app2

com.example.app2

com.example.app2

com.example.app.app1

com.example.app.app1

com.example.app.app1

com.example.app.app2

com.example.app.app2

com.example.app.app2

example

example

example

    

    和IDFA类似,同样存在为nil的情况,比如:当用户重启设备但没有解锁的时候。

    IDFV改变的情况

      不变:此应用程序(或来自同一供应商的另一个应用程序)安装在iOS设备上时

      改变:用户删除所有供应商(vender)程序后,又一次安装时这个值会变

         使用Xcode安装测试版本时或在使用ad-hoc分发的设备上安装应用程序时,该值也会发生变化。(其实还是供应商app存不存在的问题)

         即使你存有keyChain,删除所有此供应商(vender)的app,重新安装也是会变的

   获取IDFV

- (NSString *)getIDFVString
{
    NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    return idfv;
}

 

总结

  本身苹果对用户隐私的重视使得我们并不能完全的定位手机,所以当你搜索的时候大都是推荐使用UUID+keyChain的方式。而你细看他们代码的话其实大都是保存的CFUUID。

  这么说来获取NSUUID的值实际上就是获取了IDFV。

  下面来做一下区分

    CFUUID:经常会变,每次获取都会发生改变

    IDFA:所有供应商(vendor)的IDFA都一样(感觉上是那种所有app同生共死的感觉) 

    IDFV:同一个供应商(vendor)只要至少有一个还在手机中就不会改变(简单说就是要灭灭一家,有幸存者这个IDFV就不会变)

    刷机什么的就别指望了,都会变~~~

参考资料    

  IDFA的官网API

  IDFV的官网API

  理解 : UDID、UUID、IDFA、IDFV

  IDFA、IDFV、UUID的变化测试,以及设备唯一标识获取

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
iOS Device ID 的前世今生

平时大家喜欢把各种标识符都称为 Device ID,面对各种各样的标识符我也是一头雾水,觉得有必要梳理一下。不管这些标识符叫什么名字,出于保护用户隐私的考虑, Apple 不会允许开发者来定位用...

Joy_xx
2017/08/25
0
0
UIDevice

iOS 的 APP 应用开发的过程中,有时为了 bug 跟踪或者获取用反馈的需要自动收集用户设备、系统信息、应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发...

osc_mex5dt1i
2018/08/03
2
0
iOS渠道分包2种模式之包内注入文件分包(iOS13验证签名问题)

解决问题:商业模式中会存在这样的形式1款app需要不同的运用团队(工会)去分包推广,谁推广的包下载的人数都会在服务器记录,不同渠道的标示唯一来区分。 iOS渠道分包模式有两种:着重讲第二...

osc_o1mwzw8v
04/16
2
0
移动设备(手机)的唯一ID有哪些

移动设备(手机)的唯一ID有哪些 在移动广告领域,设备的ID 是用来追踪一个人的最重要的标识。 对于APP自身产品而言,使用设备唯一ID可以追踪到用户从下载到激活、注册、使用、流失、回归的全...

osc_bhmyqusc
2018/07/30
2
0
移动设备(手机)的唯一ID有哪些

原文:移动设备(手机)的唯一ID有哪些 移动设备(手机)的唯一ID有哪些 在移动广告领域,设备的ID 是用来追踪一个人的最重要的标识。 对于APP自身产品而言,使用设备唯一ID可以追踪到用户从下...

osc_8zrg3dm7
2019/03/29
2
0

没有更多内容

加载失败,请刷新页面

加载更多

linux下java环境搭建

1、jdk下载: 官方地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 如下图所示,我这边选择的是红框中的版本 2、压缩包上传至服务器 将下载的压缩包上传...

wc_飞豆
42分钟前
17
0
面试题:Java对象不再使用时,为什么要赋值为null?

前言 许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回...

码农突围
44分钟前
22
0
设计模式(5) 原型模式

原型模式 原型模式的适用场景 浅拷贝 深拷贝 用Initialize方法修改初始化状态 原型模式与之前学习的各种工厂方法、单例模式、建造者模式最大、最直观的区别在于,它是从一个既有的对象“克隆...

zhixin9001
44分钟前
7
0
获取免费的pycharm激活码网站

http://www.lookdiv.com/

云烟成雨forever
44分钟前
27
0
用Helm部署Kubernetes应用,支持多环境部署与版本回滚

1 前言 Helm是优秀的基于Kubernetes的包管理器。利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离。现在让我们安...

南瓜慢说
46分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部