• iOS全埋点解决方案数据采集SDK


    前言

    ​ 埋点一般可以分为客户端埋点和后端埋点。由于客户端埋点更加贴近业务,更加直观,因此称为市面上主流数据采集手段。对于 iOS 端的埋点,目前市面上主流代码埋点和全埋点两种方案。其中,代码埋点即显式地调用数据采集 SDK 提供的接口来采集数据,在采集能力上有比较大的优势,但是需要做额外的开发,易用性较欠缺;全埋点则不需要做额外写代码,使用方便快捷,但是在采集能力上有所欠缺,并且存在较多的兼容性问题。两种方案上不上孰优孰劣,各自有适用的场景。根据市面的的需求,推崇两种方案综合使用。

    数据分析的流程一般是:

    image-20220325104323206

    因此,数据采集是分析和运营的基本,源头。

    一、数据采集 SDK 简介

    ​ 数据采集 SDK 一般需要包含两大基础功能:

    ​ 1、通过埋点来采集数据

    ​ 2、将采集的数据传输到指定的服务器端。

    ​ 主流的埋点方式包括三种:

    ​ 1、代码埋点:应用程序集成埋点 SDK 后,在程序启动时初始化埋点 SDK,然后在某个事件触发的时候调用埋点 SDK 提供的方法拉埃触发事件。

    ​ 2、全埋点:无须应用程序写代或者只写少量的代码,即可预先自动收集用户绝大部分的行为数据,然后根据实际的业务分析需求从中筛选出所需要的数据并进行分析。

    ​ 3、可视化埋点:通过可视化的方式在产品界面中筛选出来,形成可视化全埋点事件。

    二、搭建 SDK 框架

    1、创建 Cocoa Touch Framework

    ​ 第一步:启动 Xcode 创建项目,双击 Framework & library 栏目下Framework 项。

    image-20220325104350242

    第二步:填写 Product Name 相关的信息,然后点击 Next 按钮,选择 SensorsSDK Project 的保存位置,并点击 Create 按钮,Xcode 会打开创建好的项目。

    image-20220325104414668

    2、新建 Workspace

    第一步:依次单击 File -> New -> Workspace (或者使用快捷键 Control + Command -> N),出现下图弹框,将 Workspace 的名字填写为 SensorsSDK 点击选择保存到 SensorsSDK Project 根目录下,然后点击保存 Save 按钮,此时 Xcode 会打开 SensorsSDK Workspace 窗口。

    image-20220325104438705

    第二步:在当前 Sensors Workspace 窗口中,将 SensorsSDK Project 项目添加到 SensorsSDK Workspace 中。(在 SensorsSDK Workspace 窗口中依次单击 File -> Add Files to "SensorsSDK",或者使用 Option + Command + A 快捷键)。

    image-20220325104459541

    此时,SensorsSDK Workspace 的目录结构如图所示:

    image-20220325104520131

    3、新建 Demo 工程

    第一步:依次单击 File -> New -> Project (或者使用快捷键 Shift + Command + N),双击 App 图标。填写 Product Name 为 Demo,然后点击 Next 按钮,选择项目保存的位置

    image-20220325104540486

    第二步:选择 Demo Project 的保存位置为 SensorsSDK Project 同级目录,并单击 Create 按钮,Demo 创建成功

    image-20220325104558320

    第三步:返回到 SensorSDK Workspace 窗口,依次单击 File -> Add Files to "SensorsSDK"(或者使用快捷键 Option + Command + A), 选中 Demo.xcodeproj 文件,然后单击 Add 按钮, 将 Demo Project 添加到

    image-20220325104618018

    4、添加依赖关系

    在 SensorsSDK Workspace 窗口中,点击 Demo TARGERS ,依次选择 General -> Frameworks,点击添加(+)按钮,选择 SensorsSDK.framework ,单击 Add 按钮。

    image-20220325104845284

    SensorsSDK Workspace 窗口目录如下图:

    image-20220325153357247

    5、编写埋点SDK

    第一步:在 SensorsSDK Group 下,新建埋点 SDK 主类 SensorsAnalyticsSDK。

    image-20220325154036487

    第二步: 实现埋点 SDK 获取实例以及 +sharedInstance 类方法。

    #import <UIKit/UIkit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface SensorsAnalyticsSDK : NSObject
    
    
    /// 获取 SDK 实例方法
    /// 返回单例对象
    + (SensorsAnalyticsSDK *)sharedInstance;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "SensorsAnalyticsSDK.h"
    
    @implementation SensorsAnalyticsSDK
    
    + (SensorsAnalyticsSDK *)sharedInstance {
        static SensorsAnalyticsSDK *sdk = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sdk = [[SensorsAnalyticsSDK alloc] init];
        });
        return sdk;
    }
    
    @end
    

    第三步:实现基本的预置属性

    预置属性:一般情况下,用户触发任何事件都会携带一些最基本的信息,比如:操作系统类型、运行商信息、应用版本号等,这些信息都是有埋点 SDK 自动采集,我们把这些属性称为预置属性。

    我们需要做的就是 SDK 初始化的时候,获取这些预置属性,然后在触发事件时,将这些预置属性添加到每一个事件中。

    首先,在 SensorsAnalyticsSDK.m 文件中新增一个 NSDictionary<NSString *, id> 类型的属性 automaticProperties, 用于保存事件的预置属性。

    @interface SensorsAnalyticsSDK()
    
    /// 预置属性
    @property (nonatomic, strong) NSDictionary<NSString *, id> *automaticProperties;
    
    @end
    

    接着,在 SensorsAnalyticsSDK.m 文件中新增 - collectAutomaticProperties 方法来获取预置属性

    #import "SensorsAnalyticsSDK.h"
    
    #include <sys/sysctl.h>
    
    static NSString * const SensorsAnalyticsVersion = @"1.0.0";
    
    @interface SensorsAnalyticsSDK()
    
    /// 预置属性
    @property (nonatomic, strong) NSDictionary<NSString *, id> *automaticProperties;
    
    @end
      
    #pragma mark - Properties
    - (NSDictionary<NSString *, id> *)collectAutomaticProperties {
        NSMutableDictionary *properties = [NSMutableDictionary dictionary];
        // 操作系统类型
        properties[@"$os"] = @"iOS";
        // SDK平台类型
        properties[@"$lib"] = @"iOS";
        // 设备制造商
        properties[@"$manufacturer"] = @"Apple";
        // SDK 版本号
        properties[@"$lib_version"] = SensorsAnalyticsVersion;
        // 手机型号
        properties[@"$model"] = [self deviceModel];
        // 操作系统版本号
        properties[@"$os_version"] = UIDevice.currentDevice.systemVersion;
        // 应用程序版本号
        properties[@"$app_version"] = NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"];
        
        return [properties copy];
    }
    
    /// 获取手机型号
    - (NSString *)deviceModel {
        size_t size;
        sysctlbyname("hw.machine", NULL, &size, NULL, 0);
        char answer[size];
        sysctlbyname("hw.machine", answer, &size, NULL, 0);
        NSString *results = @(answer);
        return results;
    }
    

    第四步:实现 init 方法

    - (instancetype)init {
        self = [super init];
        if (self) {
            _automaticProperties = [self collectAutomaticProperties];
        }
        return self;
    }
    

    第五步:实现 -track:properties: 方法,用于触发事件

    @implementation SensorsAnalyticsSDK (Track)
    
    - (void)track:(NSString *)eventName properties:(nullable NSDictionary<NSString *, id> *)properties {
        NSMutableDictionary *event = [NSMutableDictionary dictionary];
        // 设置事件名称
        event[@"event"] = eventName;
        // 事件发生的时间戳,单位毫秒
        event[@"time"] = [NSNumber numberWithLong:NSDate.date.timeIntervalSince1970 *1000];
        
        NSMutableDictionary *eventProperties = [NSMutableDictionary dictionary];
        // 添加预置属性
        [eventProperties addEntriesFromDictionary:self.automaticProperties];
        // 添加自定义属性
        [eventProperties addEntriesFromDictionary:properties];
        // 设置事件属性
        event[@"propeerties"] = eventProperties;
        
        // 打印
        [self printEvent:event];
    }
    
    @end
    
    - (void)printEvent:(NSDictionary *)event {
    #if DEBUG
        NSError *error = nil;
        NSData *data = [NSJSONSerialization dataWithJSONObject:event options:NSJSONWritingPrettyPrinted error:&error];
        if (error) {
            return NSLog(@"JSON Serialized Error: %@", error);
        }
        NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"[Event]: %@", json);
    #endif
    }
    

    第六步:修改 SensorsSDK.h 文件

    在 SensorsSDK.h 文件中导入 SensorsAnalyticeSDK。

    #import "SensorsAnalyticsSDK.h"
    

    第七步:修改 Headers

    依次选择 SensorsSDK -> Build Phases -> Headers,然后将 Project 下的 SensorsAnalyticsSDK.h 头文件拖到 Public 下

    image-20220325173835738

    6、Demo 集成埋点 SDK

    第一步:在 AppDelegate.m 文件的头部导入 SDK 头文件

    #import <SensorsSDK/SensorsSDK.h>
    

    第二步:初始化埋点 SDK

    在 AppDelegate.m 文件的 - application: didFinishLaunchingWithOptions: 方法中初始化 SDK,并进行事件触发。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        [SensorsAnalyticsSDK sharedInstance];
        [[SensorsAnalyticsSDK sharedInstance] track:@"MyFirstTrack" properties:@{@"testKey": @"testValue"}];
        
        return YES;
    }
    

    第三步:测试验证

    通过Xcode 启动 Demo,可以在 Xcode 控制台中看到如下事件信息。

    2022-03-25 17:27:55.956029+0800 Demo[23382:685455] [Event]: {
      "event" : "MyFirstTrack",
      "time" : 1648200475955,
      "propeerties" : {
        "$model" : "x86_64",
        "$manufacturer" : "Apple",
        "$lib_version" : "1.0.0",
        "$os" : "iOS",
        "testKey" : "testValue",
        "$app_version" : "1.0",
        "$os_version" : "15.2",
        "$lib" : "iOS"
      }
    }
    

    至此,一个非常基础的数据采集 SDK 框架完成。

  • 相关阅读:
    实现centos系统的自动化安装部署
    加密与CA证书的创建
    Linux系统启动和内核管理
    进程,系统性能和计划任务
    第十七周运维作业
    第十六周运维作业
    第十四周运维作业
    第十三周运维作业
    第十二周运维作业
    第十一周运维作业
  • 原文地址:https://www.cnblogs.com/r360/p/16044806.html
Copyright © 2020-2023  润新知