iOS7以后,我们如何统计和跟踪用户

设备唯一标示,在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的算法。不同的输入得到的不同的结果,且算法过程是不可逆的。

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

F(X,Y,Z) = (X\wedge{Y}) \vee (\neg{X} \wedge{Z})
G(X,Y,Z) = (X\wedge{Z}) \vee (Y \wedge \neg{Z})
H(X,Y,Z) = X \oplus Y \oplus Z
I(X,Y,Z) = Y \oplus (X \vee \neg{Z})

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

 

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

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



原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255383.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

仿QQ变声功能的实现

Android ndk开发之QQ变声 要做出QQ变声的效果,用Android系统自带的MediaPlayer是无法实现的,只能另想他法了。听说汤姆猫是用SoundTouch实现的,而QQ是用FMOD实现的,就根据网上的教程,自己捣鼓ndk好几天,终…

iOS - 加解密(对称,非对称)(AES DES base64这里都有),数字签名,cookie

这篇文章不是研究性的东西,主要是简单的一些知识, 开篇如此, 我尽量不让读者失望。 首先罗列一些知识点: 1.加密算法通常分为对称性加密算法和非对称性加密算法:对于对称性加密算法,信息接收双方都需事先知…

ASP留言板(在一页里实现所有功能)

很久没发贴了,因为这些时间又在做ASP的页面,没用dotnet,有时真有点过意不去了。唉!中国现状呀! 发一个ASP留言板,当资料存着&#xff…

使用ffi-napi引入C++的dll

引言 这一篇将介绍如何在node.jselectron环境中, 使用node-ffi/ffi-napi调用C/C编写的动态链接库(即dll), 实现调用C/C代码。 本教程适用于electron 4.x-6.x版本。 如electron 4.2.10版本, electron 5.0.6版本, electron 6.0.10版本。 ffi 实现这个功能, 主要使用的插件是…

iOS各种设备识别码IDFA、UDID、UUID、MAC、OpenUDID、IDFV

今天在app服务端接口文档中看到2个接口名称,是和idfa相关的,就搜索了解了一下,顺便梳理了ios各种设备识别码。 *IDFA英文全称IdentifierforAdvertising,即广告标示符,目前是苹果生态内广告交易的主要标示符&#xff0…

RFID节点的编写

新项目开始咯,其实就是华清项目的换皮,增强了对传感器的控制加了大量的32采集与控制节点,由于时间紧迫先按照节点发布文章。以后有时间会发一些框架和整体数据流向分析的文章。 一、RFID节点框架 我的想法是使用超高频RFID技术,…

(七)DSP28335基础教程——I2C通信实验(OLED显示控制)

0 前言 本期实验目标:采用硬件I2C模块与OLED进行通信,完成显示控制。 目前发现28335比较缺乏关于I2C模块的实用例程,许多新手在配置使用该模块比较难上手,走弯路。那么通过该例程,大家则可以快速学会使用I2C的基本功…

安卓开发淘宝抢购界面!史上最全的Android面试题集锦,附带学习经验

前言 这是“拔剑金九银十”的第二篇文章,本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理。 希望可以对你们有所帮助。不多废话,进入正题。 目录: Java中高级 计算机网络 Android高级面试—性能优化 Android优秀第三方…

Linux系统下imx6ull QT编程—— Ubuntu 下编写程序(一)

Linux QT编程 文章目录 Linux QT编程前言一、C简介二、C环境设置1.安装编译 C 语言和 C的环境。2.创建文件编写代码3.编译运行代码 总结 前言 绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一个 C源文件。通过编写最简单的示例“Hello,World QCX”。 一、C简介 C (c…

0531最后的挣扎结束于传说中的段错误

部署训练后的缺陷检测模型 Linux Ubuntu18.04双机尝试 报错,Linux内核或是编译器版本不匹配,多次尝试更改18.04的gcc,g,gcc-arm-linux,garm-linux的代码,尝试在Makefile文件里更改编译器路径、添加LInux内…

用Python求最大公约数和最小公倍数(51)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 什么是最大公约数? 如何用Python求最大公约数? 什么是最小公倍数? 如何用Pyt…

PDF免费压缩、在线压缩

找了很多个网站,发现说是免费,其实不然。 在线上传,在线压缩,然后直接下载,没有任何套路。 PDF Compressor – Compress PDF Files OnlineThis online PDF compressor allows compressing PDF files without degradi…

PDF文件怎么压缩大小

PDF文件怎么压缩大小?3个办法实现一键压缩 相信大家在工作中,会收到许多的PDF文件,但随着时间的推移,PDF文件便会越积越多,最终导致我们的电脑内存严重不足,这时候只好把一些PDF文件删除,来释放…

【C#图解教程】第四章 类型、存储和变量 学习笔记总结

类型 C#是一组类型声明,这个与第三章:命名空间就是一组类型声明可以一起理解。类型是一个用来创建数据结构的模板: 使用这个模板创建对象的过程叫做实例化,所以创建的对象也叫实例 类型成员 简单类型可能只包含一个数据成员&…

chatgpt赋能python:Python中的%怎么用

Python中的%怎么用 Python中的%是一个非常重要的运算符,也称为格式化运算符。它用于将一个值插入到另一个字符串中。在本文中,我们将深入了解Python中的%运算符的使用。 %运算符的语法 先看下%运算符的语法: string % values其中&#xf…

Mongo帮助文档

来自:http://xiaoshan5634.iteye.com/blog/1117702 Mongo 适合场景: 网站数据:适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制 及高度伸缩性。 缓存:适合作为信息基础设施的缓存层。在系…

Erlang/OTP设计原则(文档翻译)

http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1。 这个设计原则,其实是说用户在设计系统的时候应遵循的标准和规范。阅读前我一直以为写的是作者在设计 Erlang/OTP 框架时的一些原…

Spring Cloud Alibaba 参考文档-2021.0.4.0

Spring Cloud Alibaba 简介依赖管理Spring Cloud Alibaba Nacos Discovery3.1 服务注册/发现:Nacos Discovery3.2 如何引入Nacos Discovery进行服务注册/发现3.3 使用Nacos Discovery进行服务注册/发现和调用的示例3.3.1 Nacos 服务器启动3.3.2. 启动供应商申请3.3.…

autojs 开发文档集合

加入我们的QQ群553908361,和各作者同群交流 教程会优先发布于收费脚本v群。 该代码选自于aj开发者的文档,群里有人反馈开发文档打开慢.所以做了这个.方便搜索.如有侵权,请私信我进行删除 同时也上传了一份源码到点击网站,供大家更快的查询代码 Auto.js Pro-8.1.0 文档 索引 | …

云网络安全与数据中心安全

近年来,许多云架构师宣称随着公共云的采用,网络安全性将消亡。然而,网络安全仍然是最大的安全市场之一,并且是每个主要云服务提供商 (CSP) 在过去几年中推出重要新产品的领域。 网络对安全仍然至关重要,即使在云中也是…