iOS设备唯一标识的几种方法

 

iOS设备指纹的前世今生

https://baijiahao.baidu.com/s?id=1684399908939398817&wfr=spider&for=pc

 

iOS获取设备唯一标识的8种方法

http://www.wjhsh.net/anjijiji-p-6194626.html

https://www.jianshu.com/p/686958c352f1

https://www.jianshu.com/p/8bc3b1d5323f

IDFV(identifierForVendor)使用陷阱

 https://www.jianshu.com/p/94872bf60439

https://www.jianshu.com/p/ee8d4c027eb6

iOS14+中广告标识(idfa)获取方式 https://blog.csdn.net/lwb102063/article/details/114938899  

keychain https://blog.hudongdong.com/ios/356.html https://www.jianshu.com/p/1b23fc0aca70

https://blog.csdn.net/u012495305/article/details/41382823

https://zhuanlan.zhihu.com/p/79079052?from_voters_page=true

http://t.zoukankan.com/isItOk-p-4628699.html

https://www.jianshu.com/p/1352f702dcd0

 

IDFA全称应该是Identifier For Advertising, 一个跟device相关的唯一标识符,可以理解为广告id,apple公司提供的用于追踪用户的广告标识符,可以用来打通不同app之间的广告

IDFA全称应该是Identifier For Advertising, 一个跟device相关的唯一标识符,可以用来打通不同app之间的广告。比如你在淘宝里搜索了某个商品之后,你在用浏览器去浏览网页的时候,那个网页的广告就会给你展示相应的那个商品的广告。当然你可以重置你的IDFA,使别人不能再track到你的行为。

因为IDFA是可以改变的,所以之前很多人都想拿到一个唯一不变的值比如说UDID(Unique Device Identifier, 这个是跟手机绑定的,用户不能更改),但是Apple后来禁止苹果应用获取UDID。所以现在IDFA成为了iphone用户的标识符的标准。

IDFA是一串16进制的32位串。有了IDFA之后,相当于广告追踪,你所有的浏览历史都会别的商家利用,给你推相同或相似的广告。

另外一个apple上可以用到的标识符是UUID,Universally Unique IDentifier,在应用程序使用生命期间,这个 UUID保持不变。但如果用户重新安装,那么这个 UUID 就会发生变化。

还有一个类似的标识符叫做IDFV,Identifier for Vendor, 来自同一个开发商比如亚马逊下边的购物app和kindle app,此值是相同的。这样可以做到同一开发商下的不同app做到信息共享。

好了, 总结一下这三个标识符:

UUID, app之内信息共享。

IDFV, 同一开发商下的不同app信息共享。

IDFA,同一设备下的不同app信息共享。 

IDFA 是苹果 iOS 6 开始新增的广告标识符,英文全称是 Identifier for Advertising ,用于给开发者跟踪广告效果用的,可以简单理解为 iPhone 的设备临时身份证,说是临时身份证是因为它允许用户更换,IDFA 存储在用户 iOS 系统上,同一设备上的应用获取到的 IDFA 是相同的。iOS 用户可以通过(设置程序 -> 通用 -> 还原 -> 还原位置与隐私)更换 IDFA,iOS 10 系统开始提供禁止广告跟踪功能,用户勾选这个功能后,应用程序将无法读取到设备的 IDFA。

IDFA 是目前苹果生态广告交易的主要标识,一般跟广告商交易一个用户后广告商需要给你提供用户的 IDFA 作为凭证,主流的广告平台腾讯广点通、新浪粉丝通对账是基于 IDFA 的。

另外,在统计唯一用户的时候,IDFA 的可变性会造成部分用户的重复统计,目前有一些比较好的开源方案,感兴趣可以继续往下看。

认识一下iOS系统的各种设备识别码

1、UDID ,全称是 (Unique Device Identifier),顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成,为了保护用户隐私苹果已经禁止读取这个标识了。

UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可以改变设备的 UDID),移动网络可以利用 UDID 来识别移动设备。

  许多开发者把 UDID 跟用户的真实姓名、密码、住址、其它数据关联起来,网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据,同时大部分应用确实在频繁传输 UDID 和私人信息。 为了避免集体诉讼,苹果最终决定在 iOS 5 的时候(2011年8月份),将这一惯例废除。

  从2013年5月1日起,试图访问UIDIDs的程序将不再被审核通过,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”。所以UDID是绝对是不能再使用了,现在应用试图获取 UDID 已被禁止且不允许上架

2、UUID,全称是(Universally Unique IDentifier),是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个 UUID 在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个 UUID 已经发生了改变。UUID 不好的地方就是用户删除了你开发的程序以后,基本上你就不可能获取之前的数据了。

UUID(Universally Unique IDentifier),通用唯一标示符,是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12,通过 NSUUID(iOS 6 之后)[NSUUID UUID].UUIDString 或者 CFUUID(iOS 2 之后) CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, CFUUIDCreate(kCFAllocatorDefault))) 来获取,但是每次获取的值都不一样,需要自己存储。

3、MAC 地址,用来定义网络设备的位置。一个主机会有一个 MAC 地址,MAC 地址是网卡决定的,是固定的,为了保护用户隐私苹果已经禁止读取这个标识了。

MAC(Medium / Media Access Control)地址,用来表示互联网上每一个站点的标示符,是一个六个字节(48位)的十六进制序列。前三个字节是由 IEEE 的注册管理机构 RA 负责给不同厂家分配的”编制上唯一的标示符(Organizationally Unique Identifier)”,后三个字节由各厂家自行指派给生产的适配器接口,称为扩展标示符。

  MAC 地址在网络上用来区分设备的唯一性,接入网络的设备都有一个MAC地址,他们肯定都是唯一的。一部 iPhone 上可能有多个 MAC 地址,包括 WIFI 的、SIM 的等,但是 iTouch 和 iPad 上就有一个 WIFI 的,因此只需获取 WIFI 的 MAC 地址就好了。一般会采取 MD5(MAC 地址 + bundleID)获取唯一标识。

  但是 MAC 地址和 UDID 一样,存在隐私问题, iOS 7 之后,所有设备请求 MAC 地址会返回一个固定值,这个方法也不攻自破了。

4、OpenUDID,不是苹果官方的,是一个替代 UDID 的第三发解决方案, 缺点是如果你完全删除全部带有 OpenUDID SDK 包的 App(比如恢复系统等),那么 OpenUDID 会重新生成,而且和之前的值会不同,相当于新设备;

  UDID 被弃用后,广大开发者需要寻找一个可以替代的 UDID,并且不受苹果控制的方案,由此,OpenUDID 成为了当时使用最广泛的开源 UDID 代替方案。OpenUDID 利用一个非常巧妙的方法在不同程序间存储标示符:在粘贴板中用了一个特殊的名称来存储标示符,通过这种方法,其他应用程序也可以获取

  苹果在 iOS 7 之后对粘贴板做了限制,导致同一个设备上的应用间,无法再共享一个 OpenUDID。

5、IDFA 广告标示符,适用于对外:例如广告推广,换量等跨应用的用户追踪等。

IDFA-identifierForIdentifier(广告标示符),在同一个设备上的所有 APP 都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设定的。虽然 iPhone 默认是允许追踪的,而且一般用户都不知道有这么个设置,但是用户可以在 设置 - 隐私 - 广告追踪 里重置此 ID 的值,或者限制此 ID 的使用,所以有可能会取不到值

在今年iOS10推出后,苹果推出了“限制广告追踪”功能,设置的路径和iOS9一致。
不过经过实际的测试,在iOS10之前,即使用户打开这个功能,商家一样可以获取IDFA,只不过与之前的不一样了,每次切换这个开关与点击“还原广告标识符”的效果一样。
而iOS10就不一样了,当用户打开这个功能后,商家只能获取到一连串无意义的0

 

6、IDFV,Vindor 标示符 (IDFV-identifierForVendor),来自同一个开发商(例如com.zhihu.app1和com.zhihu.app2)的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。

 IDFV-identifierForVendor(Vendor 标示符),通过 [UIDevice currentDevice].identifierForVendor.UUIDString 来获取。是通过 bundleID 的反转的前两部分进行匹配,如果相同是同一个 Vendor ,例如对于 com.mayan.app_1 和 com.mayan.app_2 这两个 bundleID 来说,就属于同一个 Vendor ,共享同一个 IDFV,和 IDFA 不同的是,IDFV 的值一定能取到的,所以非常适合于作为内部用户行为分析的主 ID 来识别用户。但是用户删除了该 APP ,则 IDFV 值会被重置,再次安装此 APP ,IDFV 的值和之前的不同。

参考网上一些博客讲解理解:
此时打印出的字符串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的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。

 

IDFV + keychain

  通过以上几种储存唯一标识的方法的分析,总结一下各有优劣。很多方法被苹果禁止或者漏洞太多,越来越不被开发者使用,现在苹果主推 IDFA 和 IDFV 这两种方法,分别对外和对内,但是 IDFV 在 APP 重新安装时会更改,所以我的方法是通过第一次生成的 IDFV 存储到 keychain 中,以后每次获取标识符都从 keychain 中获取

7、推送 token + bundleID, 推送 token 保证设备唯一,但是必须有网络情况下才能工作,该方法不依赖于设备本身,但依赖于 apple push,而 apple push 有时候会抽风的。

 

关于 openUDID 不能用的说法不正确,至今 openUDID 还是可用的(iOS7现在没什么用户了),部分广告渠道的点击接口依然支持使用 openUDID 作为用户标识。

 

 

 

===================================================================================================

一、 UDID(Unique Device Identifier Description)

代码貌似取不到了,只能通过iTunes获取了,证书添加设备号就是这个

 


二、IDFA (Identifier For Advertising)

在同一个设备上的所有App都会取到相同的值,是专门给各广告提供商用来追踪用户而设的

NSString *IDFA = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

但是IDFA并不是唯一不变的,如果用户完全重置系统(设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。在iOS 10.0以后如果用户打开限制广告跟踪(设置程序-> 通用 -> 关于本机 -> 广告 -> 限制广告跟踪),则获取到的IDFA为一个固定值00000000-0000-0000-0000-000000000000。因此,通过IDFA也无法唯一标识一个设备。

三、IDFV(Identifier For Vendor)

IDFV是给Vendor标识用户用的,每个设备在所属同一个Vendor的应用里,都有相同的值。其中的Vendor是指应用提供商,准确的说,是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vendor,例如对于com.abc.app1, com.abc.app2 这两个BundleID来说,就属于同一个Vendor,共享同一个IDFV的值。当然,对于同一个设备不同Vendor的话,获取到的值是不同的。和IDFA不同的是,IDFV的值是一定能取到的。它是iOS 6中新增的,获取方法如下:

NSString *IDFV = [[[UIDevice currentDevice] identifierForVendor] UUIDString];


但是使用IDFV也会存在一些问题。如果用户将属于此Vendor的所有App卸载,则IDFV的值会被重置,即再重装此Vendor的App,IDFV的值也会和之前的不同。

四、UUID(Universally Unique Identifier)

UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码,由40个字符的字母和数字组成。它是苹果提供的一个获取大随机数的方法,据说UUID随机数算法得到的数重复概率为170亿分之一。这样,每个人都可以建立不与其它人冲突的 UUID。

NSUUID在iOS 6.0中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。通过下面的代码可以获得一个UUID字符串:

NSString *uuid = [[NSUUID UUID] UUIDString];


苹果公司建议使用UUID为应用生成唯一标识字符串。但是获得的UUID值系统没有存储, 而且每次调用得到UUID,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

IDFA、IDFV、UUID都是32位
————————————————
版权声明:本文为CSDN博主「_uDoctor」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pk_sir/article/details/108341446

 

 

对于用户拒绝授权 UserTracking 的情况,可以考虑接入苹果的 SKAdNetwork 框架进行广告分析。

SKAdNetwork 

一文读懂ios归因框架 SKAdNetwork

https://zhuanlan.zhihu.com/p/431591312

SKAdNetwork 接入

详见 https://developer.apple.com/documentation/storekit/skadnetwork/configuring_the_participating_apps
获得 SKAdNetworkIdentifier : f7s53z58qe.skadnetwork, 将 AdNetwork ID 写到 plist 文件中

 

 

 

 

iOS渠道跟踪

https://www.jianshu.com/p/685e54e08494

 

 

iOS14.5升级所需要的修改,目的是请求用户授权,访问与应用相关的数据以跟踪用户或设备。系统将强制要求App请求用户许可追踪权限,Privacy - Tracking Usage Description,该ID将用于向您推送个性化广告、请允许获取并使用您的活动跟踪,以便于向您进行个性化推送服务,从而减少无关服务对您造成的干扰详情请访问https://developer.apple.com/documentation/apptrackingtransparency

 

上架权限配置

新增开屏广告功能,appstoreconnect后台的app隐私声明,采集数据需要包含idfa,需要添加idfa用于广告,否则会被拒绝。

具体配置:

app主页的隐私收集这次新增了标识符->广告标识符用于第三方广告,未与用户身份关联,会将设备ID用于追踪目的。 在这里插入图片描述

 

 iOS15适配

在iOS15中如果在AppDelegate中的didFinishLaunchingWithOptions方法中调用 + (void)requestTrackingAuthorizationWithCompletionHandler:(void(^)(ATTrackingManagerAuthorizationStatus status))completion; ,则无法弹出权限申请的弹框。

解决方法采用 延迟调用: 推荐在- (void)applicationDidBecomeActive:(UIApplication *)application { 方法中弹出idfa权限申请视图。如果没有弹出,则延迟1秒调用

 

 

2015年5月至7月之间发生了一个影响identifierForVendor计算的错误

https://www.it1352.com/919808.html

https://www.codenong.com/14857247/

 

 

 

ios获取设备IP地址Mac地址(WIFI和蜂窝网络状态下),iOS7以后,无法获取设备的Mac地址

https://www.jianshu.com/p/82ba859524e0?ivk_sa=1024320u 

http://t.zoukankan.com/DafaRan-p-8038450.html

 

 

 

            

 

posted @ 2022-08-02 10:33  LiuZX_贤  阅读(2859)  评论(0编辑  收藏  举报