iOS一套收集用户行为的实现方案

·  阅读 2514

此方案可以实现行为统计,结合崩溃统计,能快速的发现线上问题的根本原因。

  • CocoaLumberjack
  • SSZipArchive
  • 阿里云(或者腾讯云)本文将用阿里云样例

一、CocoaLumberjack简单用法

  • CocoaLumberjack是一个非常好用的日志框架 ,也就是人们常说的DDLog,其性能以及速度要比系统自带的NSLog好很多。

  • DDLog可以把所有打印记录收集到本地沙盒文件中,方便观察当前用户所有我们想要采集的记录。

1. 初始化相关配置

1.1.全局定义DDLog日志级别,才可以编译通过

#ifdef DEBUG
static const int ddLogLevel = DDLogLevelVerbose;
#else
static const int ddLogLevel = DDLogLevelWarning;
#endif

// DDLogLevelOff 关闭Log
// DDLogLevelError 打印Error级别Log
// DDLogLevelWarning 打印Error、Warning级别Log
// DDLogLevelInfo 打印Error、Warn、Info级别Log
// DDLogLevelDebug 打印Error、Warn、Info、Debug级别Log
// DDLogLevelVerbose 打印Error、Warn、Info、Debug、Verbose级别Log
复制代码

1.2 初始化配置相关

#import <CocoaLumberjack/CocoaLumberjack.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 添加DDASLLogger,你的日志语句将被发送到Xcode控制台
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    
    // 添加DDFileLogger,你的日志语句将写入到一个文件中,默认路径在沙盒的[fileLogger.logFileManager logsDirectory]目录下,文件名为bundleid+空格+日期.log。
    DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
    // 刷新频率为24小时
    fileLogger.rollingFrequency = 60 * 60 * 24;
    // 最多同事包含的文件数量
    fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
    [DDLog addLogger:fileLogger];

    return YES;
}

// 当然这个相关配置不一定非要在AppDelegate中去配置,只要保证正确的执行顺序即可
复制代码

2. 执行log

NSLog使用方法一样

DDLogVerbose(@“Verbose”); // 详细日志
DDLogDebug(@“Debug”); // 调试日志
DDLogInfo(@“Info”); // 信息日志
DDLogWarn(@“Warn”); // 警告日志
DDLogError(@“Error”); // 错误日志
复制代码

3. 样例

上面基本简单使用流程已经介绍完毕,举个例子,方便理解。

3.1 模拟两个方法打印日志 enter image description here

3.2 找到存储路径(上文有讲如何寻找), 查看结果 enter image description here ps: 时间为UTC时间, 对应北京时间在加8个小时即可。

二、SSZipArchive简单用法

  • SSZipArchive是对目标文件进行压缩和解压的操作的一个很好用的一个第三方

1. 使用

//压缩
- (void)createZipFile {
    //目的路径
    NSString *destinationPath = @"/Users/Administrator/Desktop/xxxxx.zip";//注意是这个是 zip 格式的后缀
    //源文件路径
    NSString *sourceFilePath = @"/Users/Administrator/Desktop/xxxxx.txt";
    //数组里可以放多个源文件,这些文件会被同一打包成压缩包,到 destinationPath 这个路径下。
    if ([SSZipArchive createZipFileAtPath:destinationPath withFilesAtPaths:@[sourceFilePath]]) {
        NSLog(@"压缩成功");
    }
    else {
        NSLog(@"压缩失败");
    }
}

//解压
- (void)unzipFile {
    //源文件路径
    NSString *sourceFilePath = @"/Users/Administrator/Desktop/xxxxx.zip";
    //目的文件路径
    NSString *destinationPath = @"/Users/Administrator/Desktop/";
    //把 sourceFilePath 这个路径下的zip包,解压到这个 destinationPath 路径下
    if ([SSZipArchive unzipFileAtPath:sourceFilePath toDestination:destinationPath delegate:self uniqueId:nil]){
        NSLog(@"解压成功");
    }
    else {
        NSLog(@"解压失败");
    }
}

/// 代理方法
#pragma mark - SSZipArchiveDelegate
- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo {
    NSLog(@"将要解压");
}
 
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPat uniqueId:(NSString *)uniqueId {
    NSLog(@"解压完成");
}
复制代码

三、阿里云

四、结合

结合上述,搭建用户行为收集方案

  1. 通过CocoaLumberjack将日志统一收集
  2. 通过SSZipArchive将收集的日志压缩(方便寻找过程)
  3. 将上述压缩包通过阿里云上传到阿里云指定文件夹

通过三个框架,全部简单使用,收集了用户的行为,可以在存在阿里云的目录中寻找指定用户的日志中清晰的查看问题所在(如果你Log的足够详细)。

五、实战

  1. 设置宏啥的不说了。上面有
  2. 直接上代码
/// 上传本地日志
- (void)uploadLocalLog {
	// 确定上传到阿里云的位置以及文件名称
    NSString * fileName = [NSString stringWithFormat:@"iOSLog/%@.zip",userID];
	// 配置阿里云相关信息
    OSSPutObjectRequest * put = [OSSPutObjectRequest new];
	// 桶名称
    put.bucketName = [self baseBucketName]; // 跟后台开发确定
    put.objectKey = fileName;
    
    // 配置DDLog的相关信息
    DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
	
	// 寻找默认存储日志的路径
    NSString * logDirStr = [fileLogger.logFileManager logsDirectory];
    
    // 当前日志的路径
    NSString *filePath = [NSString stringWithFormat:@"%@/logs.zip",logDirStr];
    
    // 排序相关(根据时间排序,方便查看用的)
    NSArray *fileLogsArr = [fileLogger.logFileManager sortedLogFilePaths];
	
	// 压缩
    BOOL success = [SSZipArchive createZipFileAtPath:filePath withFilesAtPaths:fileLogsArr] ;
    if (success) {
        put.uploadingFileURL = [NSURL URLWithString:filePath];

		// 根据当前文件路径地址,上传到阿里云
		..... 省略上传代码。
    }
}
复制代码
  1. 在任何你想要手机log日志的地方加入DDLog,最后都自动存储到指定位置。

关于上传到阿里云的时机问题

其实上传时机更多的是当前产品需求

  • 有些app的上传时机问打开app的时候,会把上次的日志全部上传。
  • 有些app的上传时机问 设置定时器上传。
  • 有些app是在出现崩溃的时候。
  • 有些app是在请求接口的时候。
  • 有些app是上述结合体。

可以通过到阿里oss浏览器看到相应的行为日志文件咯。 enter image description here

打开查看:

enter image description here

参考文献

  1. zhuanlan.zhihu.com/p/138116219
  2. help.aliyun.com/document_de…
  3. blog.csdn.net/happyrabbit…
  4. blog.csdn.net/u014600626/…
分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改