神策分析 iOS SDK 全埋点解析之启动与退出 | 数据采集

本文是《神策分析 iOS SDK 源码解析》系列的第二篇,主要讨论如何在 SDK 中实现 App 启动和退出的全埋点事件采集。通过分析 App 的不同运行状态,探讨了冷启动、热启动和被动启动的采集方案,以及相应的优化措施,确保在各种场景下准确记录用户行为数据。
摘要由CSDN通过智能技术生成

图片

一、前言

上一篇《神策分析 iOS SDK 代码埋点解析》主要介绍了如何设计与实现代码埋点。具体而言,就是实现了一个 - track: 接口,可以在合适的时机调用,来记录一条用户的行为数据。一般情况下,对于不同的 App,有价值的行为数据是不一样的,调用 - track: 接口的时机自然也是不一样的,需要开发者根据业务场景来手动调用。

对于 App 而言,有些特定的且有分析意义的用户行为我们可以在 SDK 直接采集。例如:App 启动、App 退出、元素点击、页面浏览等。为了将其与代码埋点区分开,我们称之为全埋点(也叫无埋点、无码埋点、无痕埋点、自动埋点)。

不难看出,全埋点主要面临两个难点:

1、时机:如何在事件发生的时机,插入采集事件的代码?

2、属性:除了默认采集的预置属性外,是否可以采集其他有意义的预置属性?以及如何为这些事件补充自定义属性?

接下来的全埋点解析系列博客,主要就是来解决上面这两个难点。本文主要讨论 App 启动与退出事件的采集。

二、应用程序状态

在讨论 App 启动与退出事件的采集之前,先要了解这两个事件本身的意义。这里需要介绍下 App 的几种运行状态:

typedef NS_ENUM(NSInteger, UIApplicationState) {
      UIApplicationStateActive,    UIApplicationStateInactive,    UIApplicationStateBackground} API_AVAILABLE(ios(4.0));

App 在执行时可能的几种状态:

  • Active:程序运行在 Foreground,且正在接收事件;

  • Inactive:程序运行在 Foreground,但未接收事件。这可能是由于以下几种原因引起的:中断(例如:传入电话或SMS消息)、应用正在过渡到后台、应用从后台过渡而来;

  • Background:程序运行在 Background,且正在执行代码。

此外,App 还会有两种没有执行代码的状态:

  • Not Running:程序未运行。App 首次安装还未启动、App 被 Kill、手机重启后还未运行 App 等均会处于此状态;

  • Suspended:程序运行在 Background,但没有执行代码,处于挂起状态。大部分应用进入后台,都会在短暂时间内被系统切换为挂起状态。

这五个状态即为 App 所有的运行状态,如图 2-1 所示:

图片

图 2-1 App 运行状态

(图片来源:Apple 开发者官网)

当应用程序的运行状态发生变化时,会回调 UIApplicationDelegate 中的协议方法,默认是由 AppDelegate 实现的,如表 2-1 所示:

图片

表 2-1 UIApplicationDelegate 中的协议方法

这里需要注意的是,并不是每一种状态变化都会有对应的方法,如图 2-1 中红框内的两个变化就没有对应的方法。

App 启动与退出事件的采集,应当在这些方法与通知中寻找思路。下面列举下常见的运行状态变化的场景:

1、冷启动,也即 Kill App 之后启动,或 App 安装后第一次启动(Not Running -> Inactive -> Active);

2、App 返回主屏幕(Active -> Inactive -> Background -> Suspended)。若在 Info.plist 中设置 Application does not run in background 为 YES,则 App 返回主屏幕后会立即被 Kill(Active -> Inactive -> Background -> Suspended -> Not Running);

3、App 内进入App 切换器,然后直接返回 App(Active -> Inactive -> Active);

4、App 内进入App 切换器,然后进入主屏幕(Active -> Inactive -> Background -> Suspended);

5、App 内进入App 切换器,然后 Kill App(Active -> Inactive -> Background -> Suspended -> Not Running);

6、App 挂起状态重新运行,即热启动(Suspended -> Background -> Inactive -> Active);

7、App 挂起状态时 Kill  App 或直接删除 App(Suspended -> Not Running)。

三、App 启动

App 启动是指应用程序启动,同时包括冷启动和热启动场景。冷启动与热启动会涉及到不同的 App 应用状态方法,因此采集方式也是不相同的,下面分开讨论。

3.1 冷启动

3.1.1 采集方案

冷启动,即 Kill App 之后启动,或 App 安装后第一次启动。采集方法如下:​​​​​​​

- (void)autoTrackAppStart {
      // 是否开启 $AppStart 全埋点    if ([self isAutoTrackEventTypeIgnored:SensorsAnalyticsEventTypeAppStart]) {
          return;    }    // 由于一次完整的应用生命周期只会触发一次冷启动,因此添加 dispatch_once 以防止多次触发。    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{
          // 是否首次启动,记录到 SA_EVENT_PROPERTY_APP_FIRST_START 中。标记存到 NSUserDefaults 中。        BOOL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值