测试阶段用ReplayKit简单提bug

痛点:

测试过程中,QA往往需要在问题发生后复现一次,才能将现象录屏等反馈给开发。

开发在接到测试问题后,也需要运行一次,场景复现,检查网络、IM等信息,才能定位到问题的解决方(或许发生的只是前端或后端的问题呢?我可不想每次都切环境再编译一次)

复现是一件耗时的事情

方案

实现一种功能,在问题发生时由QA手动触发,记录下问题发生前一段时间的环境情况(录屏、网络请求情况、IM消息内容、跨端调用等)

技术依赖

iOS 15 ReplayKit的新功能:

ClipsRecording

ClipsRecording

该功能提供了一个LoopBuffer,循环录制当前屏幕,RP在后台持续录制屏幕和音频,每次录制到新的样本时,都会移除在15秒前的样本

Clips recording

当用户调用了导出方法(exportClip)时,ReplayKit就回把当前的视频回传出来

技术实现

1.一个协议,记录工具都实现他(录屏记录工具,请求记录工具……)

///自定义录制模块需要实现该协议,并添加到QARecordManager里去
@protocol CLCQARecordProtocol 
@required
///启动录制
- (void)startRecord;
///生成片段
- (void)exportClip:(void(^)(NSString *))complete;
///结束录制
- (void)stopRecord;
@end

2.Event,一次导出行为对象,在这里处理导出文件收集、打包、上传

3.Manager,用于管理所有工具及生成导出行为

@implementation CLCQARecordManager

static CLCQARecordManager *shareInstance;
+ (instancetype)shareInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shareInstance = [CLCQARecordManager new];
    });
    return shareInstance;
}

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

- (void)commonInit {

    if (!self.recorders) {
        self.recorders = @[].mutableCopy;
        //屏幕录制
        [self.recorders addObject:[CLCQARecord new]];
        //网络请求录制
        [self.recorders addObject:[CLCQAResponseClipRecorder new]];
    }
}

- (void)start {

    for (id recorder in self.recorders) {
        [recorder startRecord];
    }
}

- (void)clip {

    if (self.recording) {
        return;
    }

    self.recording = YES;
    CLCQARecordEvent *event = [[CLCQARecordEvent alloc] initWithRecorders:self.recorders];
    __weak CLCQARecordManager *weakManager = self;

    event.completionHandler = ^{
        CLCQARecordManager *strong = weakManager;
        strong.recording = NO;
    };
    [event start];
}

- (void)stop {
    for (id recorder in self.recorders) {
        [recorder stopRecord];
    }
}

@end

Demo

github传送门:https://github.com/DTD1031/CLCQARecorder

没写多少,要出去玩了,溜了溜了

你可能感兴趣的:(测试阶段用ReplayKit简单提bug)