iOS录屏框架ReplayKit的应用总结

简介: iOS录屏框架ReplayKit的应用总结

ReplayKit是iOS自带的一个屏幕录制的框架,其支持应用程序对当前应用内页面进行录屏,并将最终的视频保存到系统相册中。ReplayKit在iOS 9之后引入,其接口简介,可以非常方便的为应用添加录屏功能。需要注意,在某些iOS 12系统上,开启录屏可能会失败(通常需要重启设备解决)。

  在ReplayKit框架中,有两个非常重要的类,分别是RPScreenRecorder类与RPPreviewViewController类。RPScreenRecorder是录屏核心功能类,RPPreviewViewController是录屏结束后的预览控制器类。

  下面,列举了一个简单的录屏示例代码:

@interface ViewController () <RPScreenRecorderDelegate, RPPreviewViewControllerDelegate>

@end

@implementation ViewController

  • (void)viewDidLoad {
    self.view.backgroundColor = [UIColor whiteColor];
    [super viewDidLoad];
    // 获取录屏功能是否可用
    NSLog(@"%d", [RPScreenRecorder sharedRecorder].available);
    // 设置录屏代理
    [RPScreenRecorder sharedRecorder].delegate = self;

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn setTitle:@"Start" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
    btn.frame = CGRectMake(100, 100, 100, 30);
    [self.view addSubview:btn];

    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn2 setTitle:@"End" forState:UIControlStateNormal];
    [btn2 addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];
    btn2.frame = CGRectMake(100, 150, 100, 30);
    [self.view addSubview:btn2];

}

  • (void)stop {
    // 结束录屏
    [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController _Nullable previewViewController, NSError _Nullable error) {

    NSLog(@"stopRecordingWithHandler");
    if (!error) {
        previewViewController.previewControllerDelegate = self;
        // 到视频预览控制器
        [self presentViewController:previewViewController animated:YES completion:nil];
    }

    }];

}

// 开始录屏

  • (void)start {
    [[RPScreenRecorder sharedRecorder] startRecordingWithHandler:^(NSError * _Nullable error) {

    NSLog(@"startRecordingWithHandlerError:%@", error);

    }];

}

  • (void)touchesBegan:(NSSet)touches withEvent:(UIEvent )event {
    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

}

// 录屏结束的回调

  • (void)screenRecorder:(RPScreenRecorder )screenRecorder didStopRecordingWithPreviewViewController:(nullable RPPreviewViewController )previewViewController error:(nullable NSError *)error {
    NSLog(@"didStopRecordingWithPreviewViewControllerError:%@", error);

}

// 录屏可用性改变的回调

  • (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder {
    NSLog(@"screenRecorderDidChangeAvailability:%d", screenRecorder.available);

}

// 录屏预览控制器的代理回调

  • (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
    [previewController dismissViewControllerAnimated:YES completion:nil];

}

  • (void)previewController:(RPPreviewViewController )previewController didFinishWithActivityTypes:(NSSet )activityTypes {
    NSLog(@"didFinishWithActivityTypes %@", activityTypes);

}

@end
其中,RPScreenRecorder类中提供了丰富的接口可以使用,列举如下:

@interface RPScreenRecorder : NSObject
// 获取单例

  • (RPScreenRecorder *)sharedRecorder;

// iOS 10 之前使用,可以通知是否开启麦克风

  • (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * _Nullable error))handler;

// iOS 10 之后使用 开启录屏

  • (void)startRecordingWithHandler:(nullable void(^)(NSError * _Nullable error))handler;

// 结束录屏

  • (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController _Nullable previewViewController, NSError _Nullable error))handler;

// 放弃录屏

  • (void)discardRecordingWithHandler:(void(^)(void))handler;

// 开启录屏,可以获取到视频流数据 iOS 11后可用

  • (void)startCaptureWithHandler:(nullable void(^)(CMSampleBufferRef sampleBuffer, RPSampleBufferType bufferType, NSError _Nullable error))captureHandler completionHandler:(nullable void(^)(NSError _Nullable error))completionHandler;

// 结束视频流捕获

  • (void)stopCaptureWithHandler:(nullable void(^)(NSError * _Nullable error))handler;

// 设置代理对象
@property (nonatomic, weak, nullable) id delegate;
// 录屏功能是否可用
@property (nonatomic, readonly, getter=isAvailable) BOOL available;
// 是否正在录制中
@property (nonatomic, readonly, getter=isRecording) BOOL recording;
// 是否使用麦克风
@property (nonatomic, getter=isMicrophoneEnabled) BOOL microphoneEnabled;
// 是否可以使用相机
@property (nonatomic, getter=isCameraEnabled) BOOL cameraEnabled;
// 设置摄像头模式 前置/后置
@property (nonatomic) RPCameraPosition cameraPosition;
// 相机预览视图
@property (nonatomic, readonly, nullable) UIView *cameraPreviewView;
@end
在录屏的时候,也支持调用系统的麦克风和摄像头共同完成录制。RPScreenRecorderDelegate协议中定义了一些回调方法,如下:

// 停止录屏后的回调 iOS 10 之前使用

  • (void)screenRecorder:(RPScreenRecorder )screenRecorder didStopRecordingWithError:(NSError )error previewViewController:(nullable RPPreviewViewController *)previewViewController;

// 停止录屏后的回调 iOS 10 之后使用

  • (void)screenRecorder:(RPScreenRecorder )screenRecorder didStopRecordingWithPreviewViewController:(nullable RPPreviewViewController )previewViewController error:(nullable NSError *)error;

// 录屏权限更改的回调

  • (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder;

RPPreviewViewController类是视频预览控制器类,这个控制器没有暴露太多的属性给开发者使用,其中预览模式可以选择分享模式或编辑模式,除此之外,其中还提供了一个代理协议给开发者进行使用,用来对用户的操作进行处理,如下:

@protocol RPPreviewViewControllerDelegate
@optional
// 预览结束

  • (void)previewControllerDidFinish:(RPPreviewViewController *)previewController;

// 用户行为回调

  • (void)previewController:(RPPreviewViewController )previewController didFinishWithActivityTypes:(NSSet )activityTypes;

@end

目录
相关文章
|
25天前
|
机器学习/深度学习 搜索推荐 数据处理
探索iOS应用开发的新趋势:SwiftUI和Combine框架
【8月更文挑战第6天】随着Apple不断推动其操作系统的进化,iOS开发领域也迎来了新的变革。本文将深入探讨SwiftUI和Combine框架如何革新iOS应用开发流程,提升开发者的工作效率,并改善最终用户的体验。我们将从这两个框架的基本概念出发,分析它们的核心优势,并预测它们将如何塑造iOS开发的未来。
|
2天前
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
2天前
|
存储 Swift iOS开发
探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在引导读者理解并掌握SwiftUI框架,通过简明的语言和直观的代码示例,揭示SwiftUI如何让iOS开发变得更加简单高效。文章不仅介绍基础知识,更深入探讨了SwiftUI的核心特性、布局技巧以及与UIKit的差异,为开发者提供实用的学习路径和实践指南。
|
9天前
|
测试技术 虚拟化 iOS开发
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
这篇文章是iOS自动化测试方案的第二部分,详细介绍了在Xcode开发者工具中构建WebDriverAgent(WDA)应用到iPhone的全过程,包括环境准备、解决构建过程中可能遇到的错误,以及最终成功安装WDA到设备的方法。
25 0
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
|
11天前
|
iOS开发 开发者 UED
探索iOS开发中的SwiftUI框架
【8月更文挑战第20天】本文深入探讨了SwiftUI,这是一个为iOS开发设计的现代化用户界面框架。通过分析SwiftUI的设计理念、核心特性以及与传统UIKit框架的区别,文章揭示了SwiftUI如何简化开发者的工作流程并提升应用性能。同时,文章也讨论了SwiftUI在实现响应式设计方面的能力和它对iOS开发生态的潜在影响。
|
15天前
|
前端开发 API Swift
探索iOS应用开发的新趋势:SwiftUI和Combine框架
【8月更文挑战第16天】本文深入探讨了iOS平台上的两个最新技术:SwiftUI和Combine。SwiftUI旨在简化用户界面的构建,而Combine则优化了事件处理机制。我们将分析这两个框架如何共同推动iOS开发的未来,以及它们给开发者带来的便利和挑战。
32 6
|
19天前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
32 7
|
1天前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
25天前
|
开发工具 Android开发 iOS开发
探索iOS开发中的SwiftUI框架
在数字时代的浪潮中,移动应用开发成为技术革新的重要阵地。苹果公司推出的SwiftUI框架,作为其最新力作,旨在简化iOS应用的界面构建过程,提升开发效率。本文将深入探讨SwiftUI的设计哲学、核心特性及其在实际开发中的应用示例,帮助开发者更好地理解并运用这一框架,以适应不断变化的技术需求和用户期望。
|
27天前
|
开发框架 Swift iOS开发
探索iOS开发中的SwiftUI框架
在数字时代的浪潮中,移动应用开发如同一场永无止境的马拉松。对于开发者而言,如何在这场竞赛中保持领先,选择合适的工具至关重要。本文将深入探讨SwiftUI,这是苹果为iOS开发推出的现代框架,它以声明式语法和灵活的设计改变了移动应用的构建方式。我们将从SwiftUI的基础概念出发,逐步揭示其如何简化界面设计、提高开发效率,并展望其未来可能带来的变革。