前几个月第一次做关于ios录屏的功能,在网上看到有关于replaykit的介绍,总结之后集成到项目中,初步达到了项目要求的录屏的功能,但是在后续的测试发现,有录屏出现黑屏的情况,也有不能保存到系统系统相册的情况,后来及时改改逻辑,调用顺序就解决,现在是没什么问题了,但是感觉也不是太稳定,还没正式的使用,还不能确定不会出现问题,现在,把代码贴出来,欢迎指导指正

replaykit是ios9后出的,所以replaykit支持ios9+录屏,

//开始录屏
- (void)StartRecoder
{
//将开启录屏功能的代码放在主线程执行dispatch_async(dispatch_get_main_queue(), ^{if ([[RPScreenRecorder sharedRecorder] isAvailable] && [self isSystemVersionOk]) { //判断硬件和ios版本是否支持录屏NSLog(@"支持ReplayKit录制");//这是录屏的类RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder;recorder.delegate = self;__weak typeof (self)weakSelf = self;MBProgressHUD *hud;hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];hud.maskView.hidden = NO;hud.labelText = NSLocalizedString(@"正在启动录屏...", @"HUD loading title");[self delay:8 execute:^{if (hud.hidden == NO) {hud.hidden = YES;[self showAlert:@"录屏启动失败" andMessage:@"请重试"];}}];//在此可以设置是否允许麦克风(传YES即是使用麦克风,传NO则不是用麦克风)recorder.microphoneEnabled = YES;recorder.cameraEnabled = YES;//开起录屏功能[recorder startRecordingWithHandler:^(NSError * _Nullable error) {//在此可以设置是否允许麦克风(传YES即是使用麦克风,传NO则不是用麦克风)(ios 后被废弃了 下面的这个开始录屏)
//            [recorder startRecordingWithMicrophoneEnabled:YES handler:^(NSError * _Nullable error) {recorder.microphoneEnabled = YES;if (error) {hud.hidden = YES;IsDecoderScreen = 0;MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];hud.mode = MBProgressHUDModeText;hud.labelText = @"录屏启动失败!\n请重试";hud.margin = 10.f;hud.yOffset = 150.f;hud.removeFromSuperViewOnHide = YES;[hud hide:YES afterDelay:4];NSLog(@"========%@",error.description);_DecoderButton.selected = NO;} else {if (recorder.recording) {_DecoderButton.selected = YES;//记录是否开始录屏 系统也有一个再带的检测是否在录屏的方法 (@property (nonatomic, readonly, getter=isRecording) BOOL recording;)IsDecoderScreen = 1;hud.hidden = YES;}}}];} else {[self showAlert:@"设备不支持录制" andMessage:@"升级ios系统"];return;}});}
//结束录屏
- (void)stopDecoder
{   __weak typeof (self)weakSelf = self;[[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController *previewViewController, NSError *  error){_RPPreview = previewViewController;if (error) {NSLog(@"这里关闭有误%@",error.description);} else {[_RPPreview setPreviewControllerDelegate:self];_DecoderButton.selected = NO;IsDecoderScreen = 0;
//在结束录屏时显示预览画面
[weakSelf showVideoPreviewController:_RPPreview withAnimation:YES];}}];
}
//显示视频预览页面,animation=是否要动画显示
- (void)showVideoPreviewController:(RPPreviewViewController *)previewController withAnimation:(BOOL)animation {__weak typeof (self) weakSelf = self;//UI需要放到主线程dispatch_async(dispatch_get_main_queue(), ^{CGRect rect = previewController.view.frame;if (animation) {rect.origin.x += rect.size.width;previewController.view.frame = rect;rect.origin.x -= rect.size.width;[UIView animateWithDuration:0.3 animations:^(){previewController.view.frame = rect;} completion:^(BOOL finished){}];} else {previewController.view.frame = rect;}[weakSelf.view addSubview:previewController.view];[weakSelf addChildViewController:previewController];});
}
//关闭视频预览页面,animation=是否要动画显示
- (void)hideVideoPreviewController:(RPPreviewViewController *)previewController withAnimation:(BOOL)animation {//UI需要放到主线程dispatch_async(dispatch_get_main_queue(), ^{CGRect rect = previewController.view.frame;if (animation) {rect.origin.x += rect.size.width;[UIView animateWithDuration:0.3 animations:^(){previewController.view.frame = rect;} completion:^(BOOL finished){//移除页面[previewController.view removeFromSuperview];[previewController removeFromParentViewController];}];} else {//移除页面[previewController.view removeFromSuperview];[previewController removeFromParentViewController];}});
}
#pragma mark -RPPreviewViewControllerDelegate
//关闭的回调
- (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {if (isSave == 1) {//这个地方我添加了一个延时,我发现这样保存不到系统相册的情况好多了
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self hideVideoPreviewController:_RPPreview withAnimation:YES];});isSave = 0;}else{dispatch_async(dispatch_get_main_queue(), ^{UIAlertAction *queding = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {[self hideVideoPreviewController:_RPPreview withAnimation:YES];
//                dispatch_async(dispatch_get_main_queue(), ^{//                                [weakSelf.RPPreview dismissViewControllerAnimated:YES completion:nil];
//                            });isSave = 0;}];UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"录制未保存\n确定要取消吗" preferredStyle:UIAlertControllerStyleAlert];[alert addAction:actionCancel];[alert addAction:queding];[self presentViewController:alert animated:NO completion:nil];});}
}
//选择了某些功能的回调(如分享和保存)
- (void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet <NSString *> *)activityTypes {__weak typeof (self)weakSelf = self;if ([activityTypes containsObject:@"com.apple.UIKit.activity.SaveToCameraRoll"]) {isSave = 1;NSLog(@"***************************");//这个地方我延时执行,等预览画面移除后再显示提示框
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{dispatch_async(dispatch_get_main_queue(), ^{[weakSelf showAlert:@"保存成功" andMessage:@"已经保存到系统相册"];});});}if ([activityTypes containsObject:@"com.apple.UIKit.activity.CopyToPasteboard"]) {dispatch_async(dispatch_get_main_queue(), ^{[weakSelf showAlert:@"复制成功" andMessage:@"已经复制到粘贴板"];});}
}
#pragma mark ====RPScreenDelegate===
- (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder
{
//    [screenRecorder addObserver:self forKeyPath:@"recording" options:NSKeyValueObservingOptionNew context:nil];
//    [screenRecorder setValue:@"1" forKey:@"recording"];NSLog(@" delegate ======%@",screenRecorder);
}- (void)screenRecorder:(RPScreenRecorder *)screenRecorder didStopRecordingWithError:(NSError *)error previewViewController:(nullable RPPreviewViewController *)previewViewController
{[_RPPreview setPreviewControllerDelegate:self];_DecoderButton.selected = NO;IsDecoderScreen = 0;[self showVideoPreviewController:_RPPreview withAnimation:YES];
}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{if ([keyPath isEqualToString:@"recording"]) {NSLog(@"keyPath === %@",object);if ([change valueForKey:@"recording"] == 0) {NSLog(@"可以录制");}else{NSLog(@"++++++++++++不可以");}}
}
//显示弹框提示
- (void)showAlert:(NSString *)title andMessage:(NSString *)message {if (!title) {title = @"";}if (!message) {message = @"";}UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];[alert addAction:actionCancel];[self presentViewController:alert animated:NO completion:nil];
}
//判断对应系统版本是否支持ReplayKit
- (BOOL)isSystemVersionOk {if ([[UIDevice currentDevice].systemVersion floatValue] < 9.0) {return NO;} else {return YES;}
}

ios 自带录屏框架replayKit的使用相关推荐

  1. iOS安全及录屏相关问题

    iOS安全及录屏相关问题 iOS安全机制 iOS自带的安全机制是什么?我们能做那些事,不能做那些事? iOS的安全机制主要有: -更小的受攻击面.例如,iOS不支持Java跟Flash,不能处理psd ...

  2. windows录屏_电脑自带录屏软件怎么打开?详细操作教程

    电脑自带录屏软件怎么打开?现在主流的三大PC设备操作系统,即:Windows.Linux.Mac.和两大主流的移动设备操作系统,即安卓和iOS,都是有自带的录屏软件(功能)的.这也是考虑到使用电子设备 ...

  3. android4.2屏幕录像,android——使用自带录屏工具进行屏幕录像

    在做开源项目的时候,想传一个gif效果图上去.但是,要有连贯的动画效果.所以,就想到先录制视频,然后视频转gif.但是,用第三录屏软件总是不完美. 那么,怎么办呢? android4.4 提供了自带录 ...

  4. 苹果6手机怎么录屏_【苹果手机小技巧】 自带录屏功能

    苹果手机可以说是手机领域的佼佼者,凭借着它的IOS系统,收获了大批的苹果手机粉,其中最为重要的就是它有很好的使用体验,今天就来给大家分享几个苹果手机实用的小技巧. ▍自带录屏功能 发现很多小伙伴会去A ...

  5. 计算机的用户软件在哪,电脑自带录屏软件在哪?这里教你怎么找

    电脑自带录屏软件在哪?众所周知,不管是Windows系统还是MacOS系统都是有自带录屏软件的!但是在查了一些关键词之后,小编发现有很多小伙伴不知道怎么找电脑自带录屏软件的.那么,电脑自带录屏软件在哪 ...

  6. android 手机录屏功能,手机自带录屏功能在哪里找?轻松搞定屏幕录制

    手机的录屏功能如何使用?智能手机发展到现在,除了无线通话功能.讯息发送功能之外,又逐渐发展出拍照功能.上网功能.各类应用交互功能.尤其近几年在手机上看视频成为打发碎片化时间的重要消遣,在手机上录屏的需 ...

  7. mac录屏快捷键 - mac截图截屏快捷键 - 自带录屏软件QuickTime Player如何使用

    mac截图截屏快捷键 全屏截图 command + shift + 3 (截图文件自动保存到桌面) 区域截图 command + shift + 4  再用鼠标框选截图范围(截图文件自动保存到桌面) ...

  8. 解决Mac笔记本电脑自带录屏软件没有声音问题

    Mac自带录屏功能,通过快捷键 ⌘-Shift-5 即可唤醒该功能,点击录制即可开始录制,录制之前还能调整录制的框选区域. 但是这个录屏功能有个缺点,不能录下声音(不管是外置的还是内置的),但是我们可 ...

  9. 为什么苹果录屏没有声音_苹果手机自带录屏功能,打开声音录制方法

    有时候我们会用苹果的自带录屏功能,可是录制出来的视频,只有视频没有声音,其实这并不是说苹果不能录制带声音的视频,只是没有打开声音录制的开关. 1,首先从屏幕上面下滑(iphone x及以上机型,其他机 ...

最新文章

  1. R 循环中将变量作为对象名
  2. C语言(CED)C语言中双引号和单引号的区别
  3. Lync Server 2013群聊天室创建和简单测试
  4. Windows Server 2012 解决无法连接无线网络
  5. Linux 命令(109)—— ping 命令
  6. Django 3.2正式发布! 附中文文档链接地址!
  7. Docker 容器中添加字体
  8. DBMS 中实现事务持久性的子系统是()
  9. js中的DOM事件之冒泡和捕获事件详解
  10. python项目实战:爬取东方财富热门股票数据
  11. php处理微信消息,微信开发之处理微信客户端发来的消息
  12. Google谷歌拼音输入法
  13. U盘变成RAW格式,数据如何恢复?
  14. vue项目中使用可选链 ( ?. )和双问号 ( ??)详解
  15. 微信群高效轻松拉人进群,轻松每日爆粉
  16. C#中使用SHA1算法对密码进行加密
  17. 网络安全需要学什么?网络安全需要掌握哪些技能?
  18. Github上Stars最多的53个深度学习项目
  19. christoffel 符号的直观解释
  20. 不知道还有哪个公司周末培训的啊?

热门文章

  1. SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析
  2. 大疆网上测评题库_大疆校招笔试题及参考(一个小编程题)
  3. Say Hello to Integers (Java)
  4. 常见的网络协议有哪些?
  5. Android Bmob
  6. Spark大数据分析案例之平均心率检测[2021]
  7. 3D旋转相册炫酷js特效
  8. 快添加用用户并添加指定目录和家目录
  9. HowToDoIt 开源框架爱好者组织发布第一份项目总结
  10. java获取微信公众号二维码