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

目录
相关文章
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
839 60
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1436 4
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.0版已发布
RainbowChat是一套基于开源IM即时通讯聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题。RainbowChat可能是市面上提供im即时通讯聊天源码的,唯一一款同时支持TCP、UDP两种通信协议的IM产品。与姊妹产品RainbowTalk和RainbowChat-Web 技术同源,历经考验。
615 0
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.0版已发布
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
445 66
|
iOS开发 开发者 Windows
uniapp云打包ios应用证书的获取方法,生成指南
打包用到的一共两个文件,一个是p12格式的私钥证书,一个是证书profile文件。其中生成p12证书的时候,按照官网的教程,是需要MAC电脑来协助做的,主要是生成一些csr文件和导出p12证书等。其实这些步骤也可以借助一些其他的工具来实现,不一定使用mac电脑,用windows电脑也可以创建。
1430 0
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
446 2
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
241 1
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
455 5