iOS 在数据分析中怎么标识一个用户?

分析用户行为,首先需要标识用户。选取合适的用户标识,对于提高用户行为分析的准确性有非常大的影响,尤其是对漏斗、留存、Session 等和用户相关的分析功能。

对于唯一标识一个用户,需要考虑两种场景:

  • 用户登录之前如何标识?
  • 用户登录之后如何标识?

下面,我们分别进行介绍。

(1)登录之前

对于登录之前的用户,我们可以努力去唯一标识 ta 当前正在使用的 iOS 设备。业界一般使用 iOS 设备的某个特定属性或者某几个特定属性组合的方式,来唯一标识一台 iOS 设备。此时的用户 ID,我们一般称之为设备 ID 或匿名 ID。对于究竟该如何去唯一标识一台 iOS 设备,目前业界也没有一个非常完美或普适的方案。同时,苹果为了维护整个生态系统的健康发展,也会极力阻止个人或者组织去唯一标识一台 iOS 设备。因此,对于如何唯一标识一台 iOS 设备,将会是一场持久战,更是一个多方博弈的过程。可能我们唯一能做的,就是在现有的条件及政策之下,尝试努力寻找一种最优的解决方案。
下面,我们介绍几个常见的可以考虑用来作为 iOS 设备 ID 的属性。

A.UDID

UDID 的英文全称是 Unique Device Identifier,是设备唯一标识符的缩写。从名称我们可以猜测到,UDID 是和设备相关的,而且只跟设备相关。它是一个由 40 位十六进制组成的序列。
在 iOS 5 之前,可以通过如下代码片段获取当前设备的 UDID:

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

返回的 UDID 示例如下:

fc8c9322aeb3b4042c85fda3bc12953896da88f6

但从 iOS 5 开始,苹果为了保护用户隐私,就不再支持通过以上方式获取 UDID。

结论
由于从 iOS 5 开始,苹果禁止 iOS 应用程序通过代码获取 UDID,因此 UDID 不适合作为 iOS 设备 ID。

B.UUID

UUID 的英文全称是 Universally Unique Identifier,是通用唯一标识符的缩写。它是一个由 32 位十六进制组成的序列,
使用小横线来连接,格式为:8-4-4-4-12(数字代表位数,加上 4 个横线,总共是 36 位),如下示例。
UUID 示例:

D8E4354E-C18A-44BB-BC75-548BD67C56E5

通过 UUID,能让你在任何一个时刻,在不借助任何服务器的情况下生成唯一标识符,也就是说,UUID 在某一特定的时空下是全球唯一的。
从 iOS 6 开始,iOS 应用程序可以通过 NSUUID 类来获取 UUID,如下代码片段。

NSString *uuid = [NSUUID UUID].UUIDString;

生成的 UUID,系统不会做持久化存储,因此每次调用的时候都会获得一个全新的 UUID。
如果需要兼容更老版本的 iOS 系统,也可以使用 CFUUID 类来获取 UUID。CFUUID 是 CoreFoundation 框架的一部分,因此 API 都是 C 语言风格,代码片段参考如下。

CFUUIDRef cfuuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuid = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuidRef));

提示:NSUUID 和 CFUUID 的功能完全一样,只不过 NSUUID 是 Objective-C 接口,而 CFUUID 是 C 语言风格的 API。

结论
由于每次获取 UUID 时,返回的都是一个全新的 UUID,如果用户删除应用程序并再次安装时,将无法做到唯一标识iOS 设备。因此 UUID 也不适合作为 iOS 设备 ID。

C.MAC 地址

MAC 地址是用来标识互联网上的每一个站点,它是一个由 12 位十六进制组成的序列,如下示例:

C4:B3:01:BD:42:B1

凡是接入网络的设备都会有一个 MAC 地址,用来区分每个设备的唯一性。一个 iOS 设备(一般指iPhone手机)可能会有多个 MAC 地址,这是因为它可能会有多个设备接入网络,比如 Wi-Fi、SIM 卡等。一般情况下,我们只需要获取 Wi-Fi 的MAC 地址即可,即 en0 的地址。
但从 iOS 7 开始,苹果禁止 iOS 应用程序获取 MAC 地址。如果 iOS 应用程序继续获取 MAC 地址,系统将会返回一个固定的MAC 地址 02:00:00:00:00:00,这也是因为 MAC 地址和 UDID 一样,都属于隐私信息。

结论
从 iOS 7 开始,苹果禁止 iOS 应用程序获取 MAC 地址,因此 MAC 地址也不适合作为 iOS 设备ID。

D.IDFA

IDFA 的英文全称是 Identifier For Advertising,是广告标识符的缩写,主要用于广告推广、换量等跨应用的设备追踪等。
它也是一个由 32 位十六进制组成的序列,格式与 UUID 一致。在同一个 iOS 设备上,同一时刻,所有的应用程序获取到的IDFA 都是相同的。
从 iOS 6 开始,我们可以利用 AdSupport.framework 库提供的方法来获取 IDFA,代码片段参考如下。

#import <AdSupport/AdSupport.h>
 NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

返回 IDFA 示例:

FB584D10-FFC4-40D8-A3AF-DDC77B60462B

但 IDFA 的值也并不是固定不变的。
目前,以下操作均会改变 IDFA 的值:

  • 通过设置 → 通用 → 还原 → 抹掉所有内容和设置,
  • 通过 iTunes 还原设备
  • 通过设置 → 隐私 → 广告 → 限制广告追踪,

一 旦 用 户 限 制 了 广 告 追 踪,我 们 获 取 到 的 IDFA 将 是 一 个 固 定 的 IDFA,即 一 连 串 的 零:
00000000-0000-0000-0000-000000000000。
因此,在获取 IDFA 之前,我们可以利用 AdSupport.framework 库提供的接口来判断用户是否限制了广告追踪。

BOOL isLimitAdTracking = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];

一旦用户还原了广告标识符,系统将会生成一个全新的 IDFA。

结论
虽然 IDFA 有一些限制条件,但对于这些操作,只会在特定的情况下才会出现,或者只有专业人士才有可能做这些操作。同时,IDFA 也能解决应用程序卸载重装唯一标识设备的问题。因此,IDFA 目前来说比较适合作为iOS 设备ID。

E. IDFV

IDFV 英文全称是 Identifier For Vendor,是应用开发商标识符的缩写,是给 Vendor 标识用户使用的,主要适用于分析用户在应用内的行为等。它也是一个由 32 位十六进
制组成的序列,格式也与 UUID 一致。每个 iOS 设备在所属同一个 Vendor 的应用里,获取到的IDFV 是相同的。Vendor 是通过反转后的 BundleID 的前两部分进行匹配的,如果相同就属于同一个 Vendor。比如,对 于 com.apple.example1 和 com.apple.example2 这两个 BundleID 来说,它们就属于同一个 Vendor,将共享同一个 IDFV。和 IDFA 相比, IDFV 不会出现获取不到的
场景。但 IDFV 也有一个很大的缺点:如果用户将属于此 Vendor的所有应用程序都卸载,则 IDFV 的值将会被系统重置。即使后面重装此 Vendor 的应用程序,获取到的也将是一个全新的 IDFV。另外,以下操作也会重置 IDFV:

  • 通过设置 → 通用 → 还原 → 抹掉所有内容和设置
  • 通过 iTunes 还原设备
  • 卸载设备上某个开发者账号下的所有应用程序

在 iOS 应用程序内,可以通过 UIDevice 类来获取 IDFV,
可参考如下代码片段。

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

返回的 IDFV 示例如下:

18B4587A-0A6F-44A0-AD3C-3BB1C490C177

结论
和 IDFA 相比,特别是在解决应用程序卸载重装的问题上,IDFV 不太适合作为 iOS 设备 ID。

F. IMEI

IMEI 的英文全称是 International Mobile Equipment Identity, 是国际移动设备身份码的缩写,它是由 15 位纯数字组成的串,并且是全球唯一的。任何一部手机,在其生产并组装完成之后,都会被写入一个全球唯一的 IMEI。我们可以通过设置 → 通用 → 关于本机查看本机 IMEI。

结论
从 iOS 2 开 始,苹 果 提 供 了 相 应 的 API 来 获 取IMEI。但后来为了保护用户隐私,从 iOS 5 开始,苹果就不再允许应用程序获取 IMEI。因此,IMEI 也不适合作为iOS 设备 ID 。

G.最佳实践

上面介绍的属性,它们各有优缺点,都不是非常完美的方案。
它们总的来说有以下两个问题:

  • 无法保证唯一性
  • 会受到各种相关政策的限制

关于设备 ID,到底有没有一种完美的方案呢?目前确实没有!我们只能在现有的条件和限制之下,寻找一种相对比较完美的方案。结合实际情况来看,对于常规数据分析中的设备 ID,可按照如下优先级顺序获取,基本上能满足我们的业务需求。

IDFA → IDFV → UUID

对于设备 ID,不管是使用 IDFA 还是 IDFV,用户限制广告追踪或应用程序卸载重装,都有可能导致发生变化。那我们是否还有更好的方案呢?

是有的,那就是 Keychain。

什么是 Keychain ?

Keychain 是 OS X 和 iOS 都提供的一种安全存储敏感信息的工具。比如,我们可以在 Keychain 中存储用户名、密码等信息。Keychain 的安全机制是从系统层面保证了存
储的这些敏感信息不会被非法读取或者窃取。

Keychain 的特点:
  • 保 存 在 Keychain 中 的 数 据,即 使 应 用 程 序 被 卸 载 了,数据仍然存在;重新安装应用程序,可以从 Keychain 中读取到这些数据
  • Keychain 中的数据可以通过 Group 的方式实现应用程序之间共享,只要应用程序具有相同的 TeamID 即可
  • 保存在 Keychain 中的数据都是经过加密的,因此非常安全

关于 Keychain 的详细用法,我们在此处不再详细描述,详细说明可以参照苹果官方文档 Keychain services

(2)登录之后

对登录之后的用户进行标识,相对来说比较简单。因为用户一旦在你的产品中进行了注册或登录,那 ta 在你的用户系统里肯定就是唯一的了。此时的用户 ID 我们一般称之为登录 ID。登录 ID 通常是业务数据库里的主键或其它唯一标识。因此,登录 ID 相对来说会更精确、更稳定,同时,也具有唯一性。
我们可以提供一个 - login: 方法,当应用程序拿到用户的登录 ID 之后,通过调用 - login: 方法把登录 ID 传给 SDK,在此之后触发的事件,即可使用登录 ID 来标识用户。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容