前言 埋點一般可以分為客戶端埋點和後端埋點。由於客戶端埋點更加貼近業務,更加直觀,因此稱為市面上主流數據採集手段。對於 iOS 端的埋點,目前市面上主流代碼埋點和全埋點兩種方案。其中,代碼埋點即顯式地調用數據採集 SDK 提供的介面來採集數據,在採集能力上有比較大的優勢,但是需要做額外的開發,易 ...
前言
埋點一般可以分為客戶端埋點和後端埋點。由於客戶端埋點更加貼近業務,更加直觀,因此稱為市面上主流數據採集手段。對於 iOS 端的埋點,目前市面上主流代碼埋點和全埋點兩種方案。其中,代碼埋點即顯式地調用數據採集 SDK 提供的介面來採集數據,在採集能力上有比較大的優勢,但是需要做額外的開發,易用性較欠缺;全埋點則不需要做額外寫代碼,使用方便快捷,但是在採集能力上有所欠缺,並且存在較多的相容性問題。兩種方案上不上孰優孰劣,各自有適用的場景。根據市面的的需求,推崇兩種方案綜合使用。
數據分析的流程一般是:
因此,數據採集是分析和運營的基本,源頭。
一、數據採集 SDK 簡介
數據採集 SDK 一般需要包含兩大基礎功能:
1、通過埋點來採集數據
2、將採集的數據傳輸到指定的伺服器端。
主流的埋點方式包括三種:
1、代碼埋點:應用程式集成埋點 SDK 後,在程式啟動時初始化埋點 SDK,然後在某個事件觸發的時候調用埋點 SDK 提供的方法拉埃觸發事件。
2、全埋點:無須應用程式寫代或者只寫少量的代碼,即可預先自動收集用戶絕大部分的行為數據,然後根據實際的業務分析需求從中篩選出所需要的數據併進行分析。
3、可視化埋點:通過可視化的方式在產品界面中篩選出來,形成可視化全埋點事件。
二、搭建 SDK 框架
1、創建 Cocoa Touch Framework
第一步:啟動 Xcode 創建項目,雙擊 Framework & library 欄目下Framework 項。
第二步:填寫 Product Name 相關的信息,然後點擊 Next 按鈕,選擇 SensorsSDK Project 的保存位置,並點擊 Create 按鈕,Xcode 會打開創建好的項目。
2、新建 Workspace
第一步:依次單擊 File -> New -> Workspace (或者使用快捷鍵 Control + Command -> N),出現下圖彈框,將 Workspace 的名字填寫為 SensorsSDK 點擊選擇保存到 SensorsSDK Project 根目錄下,然後點擊保存 Save 按鈕,此時 Xcode 會打開 SensorsSDK Workspace 視窗。
第二步:在當前 Sensors Workspace 視窗中,將 SensorsSDK Project 項目添加到 SensorsSDK Workspace 中。(在 SensorsSDK Workspace 視窗中依次單擊 File -> Add Files to "SensorsSDK",或者使用 Option + Command + A 快捷鍵)。
此時,SensorsSDK Workspace 的目錄結構如圖所示:
3、新建 Demo 工程
第一步:依次單擊 File -> New -> Project (或者使用快捷鍵 Shift + Command + N),雙擊 App 圖標。填寫 Product Name 為 Demo,然後點擊 Next 按鈕,選擇項目保存的位置
第二步:選擇 Demo Project 的保存位置為 SensorsSDK Project 同級目錄,並單擊 Create 按鈕,Demo 創建成功
第三步:返回到 SensorSDK Workspace 視窗,依次單擊 File -> Add Files to "SensorsSDK"(或者使用快捷鍵 Option + Command + A), 選中 Demo.xcodeproj 文件,然後單擊 Add 按鈕, 將 Demo Project 添加到
4、添加依賴關係
在 SensorsSDK Workspace 視窗中,點擊 Demo TARGERS ,依次選擇 General -> Frameworks,點擊添加(+)按鈕,選擇 SensorsSDK.framework ,單擊 Add 按鈕。
SensorsSDK Workspace 視窗目錄如下圖:
5、編寫埋點SDK
第一步:在 SensorsSDK Group 下,新建埋點 SDK 主類 SensorsAnalyticsSDK。
第二步: 實現埋點 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 下
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 框架完成。