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

作者:暗夜星辰 发布于:2013-9-12 10:32 Thursday 分类:IOS学习笔记

设备唯一标示,在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。

 

标签: 权限 openid IOS7 UDID UUID

发表评论:

©2012-2014 woodbunny.com 木头♥兔子的小屋 sitemap