设备唯一标示,在App中,常用来统计和跟踪用户的行为。自从苹果在iOS5之后废弃掉了UDID后,找到一个稳定可用的设备标识一时成了业界棘手的问题,我们先看看目前的几种方案。

1 UDID  UIDevice.uniqueIdentifier 接口在iOS 5.0被废弃

示例: 137891ec369c899b01cc3df6cad90360514827e7

2 CFUUID 官方推荐,但是有几个问题,如果从一台设备将系统备份到另一个设备,两个设备就会拥有相同的CFUUID,如果从临时文件中备份系统,就会出现一个设备中出现不同的CFUUID,代码如下:

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);

NSString *uuid = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,cfuuid));

但是这个值系统并不存储,也就是说再次调用CFUUIDCreate时,系统会返回一个新的标识符,如果出现用户卸载app后又重新安装,这时候就会对统计产生影响了。

类似的方案还有iOS6出的 NSUUID类:[[NSUUID UUID] UUIDString]

示例: 68753A44-4D6F-1226-9C60-0050E4C00067

iOS6 中还有几种方案:

Vendor标识符

添加在已有的UIDevice类中。跟下面的advertisingIdentifier一样,该方法返回的是一个NSUUID对象。

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

示例: 599F9C00-92DC-4B5C-9464-7971F01F8370

IDFA 广告标识符

使用广告框架AdSupport.framework 中的 ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个上面提到的NSUUID实例。如

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

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

示例:1E2DFA89-496A-47FD-9941-DF1FC4E6484A

3 MAC 地址 。后来也不能用了,得到的是类似0x2FFFFFFFF的假地址

4  openUDID

OpenUDID是用系统粘贴板作为中间存储供所有app调用. 新的系统把粘贴板的访问权限限制在了同一个开发者的范围内,既同一个开发者的多个app在同个设备上共享粘贴板。

当将设备上所有使用了OpenUDID方案的应用程序删除,且设备关机重启,xcode彻底清除并重启,重装应用程序去获取OpenUDID,此时OpenUDID变化。

Usage:

#include “OpenUDID.h”

NSString* openUDID = [OpenUDID value];

示例:2b25df58cede9faef5d132ffa9b45c1a13b818d1

核心代码:

if (_openUDID==nil) {

CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);

CFStringRef cfstring = CFUUIDCreateString(kCFAllocatorDefault, uuid);

const char *cStr = CFStringGetCStringPtr(cfstring,CFStringGetFastestEncoding(cfstring));

unsigned char result[16];

CC_MD5( cStr, strlen(cStr), result );// 主要是这句。将字符串cStr digest 成MD5 string,放入result中。下面附录中会说说MD5算法

CFRelease(uuid);

CFRelease(cfstring);

_openUDID = [NSString stringWithFormat:

@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%08x",

result[0], result[1], result[2], result[3],

result[4], result[5], result[6], result[7],

result[8], result[9], result[10], result[11],

result[12], result[13], result[14], result[15],

(NSUInteger)(arc4random() % NSUIntegerMax)];

}

据淘宝的同学反映,他们目前打算从服务器端着手,分析用户的数据行为来确定用户唯一ID。目前tb做法:openudid + mac地址 + 加密算法

大家有什么好的做法,欢迎交流~

附录


* 程序必须重启才能看到改变的效果。

** 删除了所有相同vendor提供的程序,才能看到改变的值。

MD5 算法

—————————

MD5 即消息摘要算法简称。可以将一段文字利用散列算法运算变成一个固定长度的值。MD5是输入不定长度信息,输出固定长度128-bits的算法。不同的输入得到的不同的结果,且算法过程是不可逆的。

基本原理是:求余、取余、调整长度、与链接变量进行循环运算。得出结果。

 是 XORANDOR , NOT 的符号(以后专门写一篇文字阐述计算过程)。

MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。

在安全方面,MD5的弱点不断被发现,以及当今计算机运算能力的不断提升,现在已经可能人为构造出两个具有相同MD5校验值的信息。因此,在安全要求高的场合不应再使用MD5。

原文

iOS7以后,我们如何统计和跟踪用户相关推荐

  1. AI一分钟 | Google因跟踪用户数据接受调查;iPhone XS真机图曝光

    ▌Google 因跟踪用户数据在亚利桑那州接受调查 美联社上月曝出即使在用户选择退出,谷歌仍然记录用户的位置数据.华盛顿邮报本周二报道,谷歌正在因为此事在亚利桑那州接受调查,调查由司法部长 Mark ...

  2. react 交互_如何在React应用程序中跟踪用户交互

    react 交互 by Faouzi Oudouh 通过Faouzi Oudouh 如何在React应用程序中跟踪用户交互 (How to track user interactions in you ...

  3. [css] 除了可以用js跟踪用户信息外,如果不用js,使用纯css怎么做呢?

    [css] 除了可以用js跟踪用户信息外,如果不用js,使用纯css怎么做呢? 可以利用 css 的伪类 :hover :active :focus 之类的监听用户行为,然后给指定的url 发送请求. ...

  4. java web 请求跟踪_java web 项目跟踪用户操作

    java web项目,就几个JSP页面,本人怎么跟踪用户什么时间点击了那个jsp页面,什么时候登录的,什么时候关闭jsp页面的,把跟踪用户的操作(基本上就上面这三个操作),存入数据库里面,什么时候干什 ...

  5. 使用JSP实现简单的登录注册功能,并且使用Session跟踪用户登录信息

    使用JSP实现简单的登录注册功能,并且使用了Session来跟踪用户的登录信息,这个是用纯JSP来实现此功能的,由于没有连接数据库,所以使用List来模拟数据库. 第一步:创建web项目 如果有不会创 ...

  6. 朝鲜红星 Linux 嵌入隐藏标记跟踪用户

    对泄露的朝鲜Red Star Linux操作系统的分析发现,系统内置了水印功能可用于跟踪用户. 在Red Star Linux中,朝鲜自己构建了一个内核模块叫rtscan,运行多个共享代码的二进制文件 ...

  7. 追溯互联网“原罪”之起源:数据跟踪用户是究竟是何时形成的?

    "网络空间"曾被誉为一个公共的.无跟踪的空间,用户享受着自由匿名的氛围.但不知何时起,对用户的个人跟踪,成为主导网络的一种市场实践. 正如我们所知,数据跟踪支撑着网络经济,这种说法 ...

  8. 淘客订单查询策略:淘宝客订单要怎么查?如何实时跟踪用户付款退款等订单状态变化?如何实时结算?

    淘客订单查询策略要怎么安排,可以实时跟踪用户付款.退款等订单状态变化? 如何做到实时跟踪用户订单确认收货并与他结算返利或佣金? 首先要知道目前淘宝客的订单接口的特性,它是按照一个指定的起始时间(sta ...

  9. PHP:PDO->fetch()和fetchAll()遍历,session进行会话跟踪,用户退出清除session

    PHP:PDO->fetch和fetchAll遍历,session进行会话跟踪,用户退出清除session 一.fetch()和fetchAll()遍历 ①fetch()遍历 fetch 采用w ...

最新文章

  1. 查看Linux系统软硬件信息
  2. php星座判断源码,php根据日期判断星座的函数分享
  3. 串行并行程序在效率上的简单比较
  4. DPM2012系列之十三:如何清理无法联系的客户端代理
  5. 63.2. 配置 Postfix
  6. 计生专干招聘计算机,城北村招聘计生专干试题
  7. YApi--使用YApi的目的
  8. python多进程编程_python并发编程中的多进程(代码实现)
  9. web安全实践系列导航
  10. linux培训课程第一天:ppt以及笔记
  11. GD32F103学习笔记(2)——在GD32F103移植STM32F103代码
  12. SharePoint下载服务器资源
  13. vue3:兄弟组件,跨组件传值,事件总线的通信方式(mitt / tiny-emitter)
  14. R 一行代码出Cox回归模型的表格
  15. 工作后,同学关系渐渐疏远了,心里莫名有些失落,怎么办?
  16. Pandas中describe()函数
  17. zigbee 笔记5
  18. ATTCK实战系列——红队实战(一)
  19. 【Linux】ln: failed to create symbolic link ‘*.so’: Operation not supported
  20. 华为linux版本wifi驱动,HuaWei华为

热门文章

  1. 中兴通讯:控股股东拟以持有的本公司股份参与认购基金份额
  2. c++多线程处理数组
  3. henauOJ1050(凑零钱)
  4. Java八大基本数据类型(详解)
  5. 【BERT-多标签文本分类实战】之七——训练-评估-测试与运行主程序
  6. linux zip压缩排除目录,linux tar压缩排除某个文件夹的方法
  7. 为什么企业选择长期发布新闻稿?
  8. 06.MTK关机充电动画显示
  9. 我大阿里“揪头发”详解
  10. PVA刷擦洗对CMP后清洗过程的影响