美文网首页
测试阶段用ReplayKit简单提bug

测试阶段用ReplayKit简单提bug

作者: 码痞 | 来源:发表于2021-10-31 14:12 被阅读0次

    痛点:

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

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

    复现是一件耗时的事情

    方案

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

    技术依赖

    iOS 15 ReplayKit的新功能:

    ClipsRecording

    ClipsRecording

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

    Clips recording

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

    技术实现

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

    ///自定义录制模块需要实现该协议,并添加到QARecordManager里去
    @protocol CLCQARecordProtocol <NSObject>
    @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<CLCQARecordProtocol> 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<CLCQARecordProtocol> recorder in self.recorders) {
            [recorder stopRecord];
        }
    }
    
    @end
    

    Demo

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

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

    相关文章

      网友评论

          本文标题:测试阶段用ReplayKit简单提bug

          本文链接:https://www.haomeiwen.com/subject/fjyoaltx.html