iOS全埋點解決方案-數據採集SDK

来源:https://www.cnblogs.com/r360/archive/2022/03/23/16044806.html
-Advertisement-
Play Games

前言 ​ 埋點一般可以分為客戶端埋點和後端埋點。由於客戶端埋點更加貼近業務,更加直觀,因此稱為市面上主流數據採集手段。對於 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 框架完成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、.NET6中使用swagger swagger支持 API 自動生成同步的線上文檔,下麵在.NET6中引入 1.建.NET6應用並建以下控制器 /// <summary> /// 訂單介面 /// </summary> [ApiController] [Route("[controller]/[ ...
  • 起因 由於某些不可知的原因,需要在系統上安裝深信服的Singress監控,後來卸載的時候,因某些未知原因,損壞了系統的某些設置。導致IE、Chrome無法正常打開網頁。 微信、音樂軟體等都OK,火狐依舊能使用。幸甚。 IE地址欄輸入baidu.com無果,沒響應 IE地址欄輸入14.215.177. ...
  • 故事背景 做linux開發的一般都會涉及到deb包,那麼我們如何製作deb包,debian目錄中都有哪些文件以及他們的含義是什麼呢?那麼我們就帶著這些疑惑去探索了。 探索之路 首先安裝 sudo apt install dh-make 。 修改源代碼文件名 mv xxx xxx-1.0.1 ,為了生 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 linux配置yum源的三種方法: 1.配置網路yum源 2.通過上傳鏡像文件配置本地yum源 3.通過連接存儲或本地鏡像文件配置本地yum源(虛擬機) 配置各種yum源的時候,需要提前知道自己的linux系統是什麼版本的,以方便後面的配置 // ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 安裝依賴包 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl systat libseccomp wget vim net-tools git iptables ...
  • RadonDB MySQL Kubernetes 於 3 月 24 日正式發佈新版本 2.1.3 。該版本主要基於在 2.1.2 進行功能優化和升級。 致謝 首先感謝 @andyli029 @acekingke @runkecheng @mgw2168 @molliezhang 提交的修改。 什麼是 ...
  • 作者:程潤科 資料庫研發工程師 編輯:張莉梅 高級文檔工程師 視頻:錢芬 高級測試工程師 本文將演示在 Kubernetes 上部署 RadonDB MySQL Kubernetes 2.X(Operator)的步驟,快速實現 MySQL 高可用集群部署,以及部署集群的校驗和卸載方式。 部署版本為 ...
  • 近期熱播的電視劇《人世間》,講述了70年代無數普通人的故事,細膩的人物形象和真實的故事感動著我們。原來在那個年代,我們的父母和祖輩都在為新中國的美好生活而奮鬥著,為國家捨棄了小家團聚的機會;原來在那個年代,擁有一張合照也不是容易的事情。 多年來,隨著影像技術的迭代更新,人們的多彩生活被即時記錄著。同 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...