痛点:
测试过程中,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
没写多少,要出去玩了,溜了溜了
网友评论