Segment Analytics-iOS SDK - 专业用户行为追踪解决方案

Segment Analytics-iOS SDK

Analytics-iOS 是 Segment 官方推出的 iOS 客户端库,帮助开发者轻松收集用户行为数据并集成到各种分析平台。

功能特性

  • 多平台集成: 支持一键集成到 200+ 个分析平台和工具
  • 完整事件追踪: 支持 track、identify、screen、group、alias 等核心事件类型
  • 自动屏幕统计: 自动追踪视图控制器的展示和切换
  • 用户身份管理: 完善的用户识别和匿名ID管理机制
  • 数据队列管理: 智能的数据批量上传和本地存储机制
  • 高性能架构: 基于中间件的灵活架构设计,支持自定义扩展
  • 安全可靠: 支持数据加密存储和传输安全保障

安装指南

CocoaPods 安装

在 Podfile 中添加:

pod 'Analytics', '~> 4.1.8'

Carthage 安装

在 Cartfile 中添加:

github "segmentio/analytics-ios" ~> 4.1.8

Swift Package Manager

在 Xcode 中添加包依赖:

dependencies: [
    .package(url: "https://github.com/segmentio/analytics-ios.git", from: "4.1.8")
]

手动安装

  1. 下载最新的 Release 版本
  2. 将 Analytics.framework 添加到项目中
  3. 链接必要的系统框架:Foundation、SystemConfiguration

使用说明

基础配置

#import <Segment/SEGAnalytics.h>

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 启用调试日志
    [SEGAnalytics debug:YES];
    
    // 配置 Analytics
    SEGAnalyticsConfiguration *configuration = 
        [SEGAnalyticsConfiguration configurationWithWriteKey:@"YOUR_WRITE_KEY"];
    
    // 开启应用生命周期事件自动追踪
    configuration.trackApplicationLifecycleEvents = YES;
    
    // 设置批量上传阈值
    configuration.flushAt = 20;
    
    // 初始化 SDK
    [SEGAnalytics setupWithConfiguration:configuration];
    
    return YES;
}

用户识别

// 识别用户
[[SEGAnalytics sharedAnalytics] identify:@"user123" 
                                  traits:@{
                                    @"name": @"John Doe",
                                    @"email": @"john@example.com",
                                    @"plan": @"premium"
                                  }];

// 匿名用户识别
[[SEGAnalytics sharedAnalytics] identify:nil 
                                  traits:@{
                                    @"device": @"iPhone"
                                  }];

事件追踪

// 追踪自定义事件
[[SEGAnalytics sharedAnalytics] track:@"Product Viewed" 
                           properties:@{
                             @"product_id": @"12345",
                             @"category": @"Books",
                             @"price": 29.99
                           }];

// 追踪屏幕浏览
[[SEGAnalytics sharedAnalytics] screen:@"HomeScreen" 
                            properties:@{
                              @"referrer": @"Notification"
                            }];

高级功能

// 用户分组
[[SEGAnalytics sharedAnalytics] group:@"company123" 
                               traits:@{
                                 @"name": @"Segment",
                                 @"industry": @"Technology"
                               }];

// 用户别名
[[SEGAnalytics sharedAnalytics] alias:@"new_user_id"];

// 立即上传数据
[[SEGAnalytics sharedAnalytics] flush];

// 重置用户数据
[[SEGAnalytics sharedAnalytics] reset];

核心代码

事件负载基类

// SEGPayload.h - 事件数据基类
@interface SEGPayload : NSObject

@property (nonatomic, readonly) JSON_DICT context;
@property (nonatomic, readonly) JSON_DICT integrations;
@property (nonatomic, strong) NSString *timestamp;
@property (nonatomic, strong) NSString *messageId;
@property (nonatomic, strong) NSString *anonymousId;
@property (nonatomic, strong) NSString *userId;

- (instancetype)initWithContext:(JSON_DICT)context 
                  integrations:(JSON_DICT)integrations;

@end

事件追踪实现

// SEGTrackPayload.m - 事件追踪数据模型
@implementation SEGTrackPayload

- (instancetype)initWithEvent:(NSString *)event
                   properties:(NSDictionary *)properties
                      context:(NSDictionary *)context
                 integrations:(NSDictionary *)integrations
{
    if (self = [super initWithContext:context integrations:integrations]) {
        _event = [event copy];
        _properties = [properties copy];
    }
    return self;
}

@end

中间件架构

// SEGMiddleware.h - 中间件协议
@protocol SEGMiddleware
@required
- (void)context:(SEGContext *_Nonnull)context 
           next:(SEGMiddlewareNext _Nonnull)next;
@end

// 中间件运行器
@interface SEGMiddlewareRunner : NSObject
@property (nonnull, nonatomic, readonly) NSArray<id<SEGMiddleware>> *middlewares;
- (instancetype)initWithMiddleware:(NSArray<id<SEGMiddleware>> *)middlewares;
- (SEGContext *)run:(SEGContext *)context 
           callback:(RunMiddlewaresCallback)callback;
@end

HTTP 客户端

// SEGHTTPClient.m - 数据上传实现
- (NSURLSessionUploadTask *)upload:(JSON_DICT)batch 
                       forWriteKey:(NSString *)writeKey 
                 completionHandler:(void (^)(BOOL retry))completionHandler
{
    // 数据序列化
    NSError *error = nil;
    NSData *data = [NSJSONSerialization dataWithJSONObject:batch 
                                                   options:0 
                                                     error:&error];
    
    // GZIP 压缩
    data = [data seg_gzippedData];
    
    // 创建上传任务
    NSURL *url = [NSURL URLWithString:@"https://api.segment.io/v1/batch"];
    NSMutableURLRequest *request = self.requestFactory(url);
    
    // 设置请求头
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
    [request setValue:[SEGHTTPClient authorizationHeader:writeKey] 
   forHTTPHeaderField:@"Authorization"];
    
    // 上传数据
    NSURLSessionUploadTask *task = [self.genericSession 
        uploadTaskWithRequest:request 
                     fromData:data 
            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // 处理响应
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        BOOL shouldRetry = (error != nil || 
                           httpResponse.statusCode >= 300 || 
                           httpResponse.statusCode < 200);
        completionHandler(shouldRetry);
    }];
    
    [task resume];
    return task;
}

数据存储管理

// SEGFileStorage.m - 文件存储实现
- (void)setData:(NSData *)data forKey:(NSString *)key
{
    NSURL *url = [self urlForKey:key];
    
    if (data == nil) {
        [[NSFileManager defaultManager] removeItemAtURL:url error:nil];
        return;
    }
    
    // 数据加密
    if (self.crypto) {
        NSData *encryptedData = [self.crypto encrypt:data];
        [encryptedData writeToURL:url atomically:YES];
    } else {
        [data writeToURL:url atomically:YES];
    }

    // 排除备份
    [url setResourceValue:@YES 
                   forKey:NSURLIsExcludedFromBackupKey 
                    error:nil];
}

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-09-18 23:07  qife  阅读(6)  评论(0)    收藏  举报