当前位置: 首页 > 科技观察

iOS9学习系列:ReplayKit框架入门

时间:2023-03-16 15:19:38 科技观察

ReplayKit介绍在iOS9中,ReplayKit是一个全新的框架,可谓是游戏开发者(开发者)的福音。它可以让玩家更方便地记录游戏进度或数据以及分享功能。此外,更强大的是:ReplayKit为用户(玩家)提供了一个功能齐全的交互界面,用户可以使用它来编辑或制作自己的视频剪辑!ReplayKit可以在没有太多功耗和性能损失的情况下制作高清视频录制。ReplayKit支持A7以上芯片、iOS9以上操作系统的设备。您需要准备什么本教程要求您的Xcode版本为7.0或更高版本,OSX为Yosemite(10.10.x)或更高版本。如果您仍想在您的设备上体验这个简单的项目,请确保您的设备能够满足ReplayKit所需的软硬件要求。当然,你还需要在GitHub上下载项目源码。开始录制ReplayKit框架提供了RPScreenRecorder类和单例方法sharedRecorder()供您录制游戏。该实例对象负责检查设备的录音功能,包括开始、停止和丢弃录音,并且可以选择激活麦克风让播放器录制现场解说!打开从GitHub下载的入门项目中的GameViewController.swift文件。在文件顶部,导入ReplayKit框架。importReplayKit接下来,调用GameViewController类中的startRecording(_:)方法,当用户按下StartRecording按钮时开始录制。funcstartRecording(sender:UIButton){ifRPScreenRecorder.sharedRecorder().available{RPScreenRecorder.sharedRecorder().startRecordingWithMicrophoneEnabled(true,handler:{(error:NSError?)->Voidiniferror==nil{//录音已启动sender.removeTarget(self,动作:“startRecording:”,forControlEvents:.TouchUpInside)sender.addTarget(self,action:“stopRecording:”,forControlEvents:.TouchUpInside)sender.setTitle(“StopRecording”,forState:.Normal)sender.setTitleColor(UIColor.redColor(),forState:.Normal)}else{//Handleerror}})}else{//DisplayUIforrecordingbeingunavailable}}按照代码一步一步来。我们通过sharedRecorder()方法访问RPScreenRecorder实例,以检查我们的设备的录制功能是否可用。如果该功能可用,我们可以通过调用startRecordingWithMicrophone(_:handler:)方法开始录音。该方法第一个参数是一个BOOL类型的值,表示是否打开设备的麦克风,第二个参数是完成后回调的代码块。如果出现某些错误,RepalyKit框架可以通过代码块返回给您,并提示您错误信息。如果一切准备就绪,我们改变按钮的样式来通知用户录音已经开始,再次点击停止录音。编译并运行你的应用程序并尝试按下绿色按钮,你会看到一个像火焰一样的粒子效果,如果你点击开始录制,你会看到这样一个警告,如图:注意,每次都会出现这个警告开始录音时出现。然而,一旦用户选择了这些偏好之一,系统就会在接下来的8分钟内记住该选择。选择一个选项后,“开始录制”按钮会变为红色的“停止录制”按钮。停止、丢弃和编辑录音现在我们的应用程序可以开始ReplayKit录音,是时候了解完成后要编码的内容了。在GameViewController类中实现stopRecording(_:)这个方法:funcstopRecording(sender:UIButton){RPScreenRecorder.sharedRecorder().stopRecordingWithHandler{(previewController:RPPreviewViewController?,error:NSError?)->VoidinifpreviewController!=nil{letalertController=UIAlertController(title:"Recording",message:"Doyouwishtodiscardorviewyourgameplayrecording?",preferredStyle:.Alert)letdiscardAction=UIAlertAction(title:"Discard",style:.Default){(action:UIAlertAction)inRPScreenRecorder.sharedRecorder().discardRecordingWithHandler({())}->Voidin//Executedoncerecordinghassuccessfullybeendiscarded})}letviewAction=UIAlertAction(title:"View",style:.Default,handler:{(action:UIAlertAction)->Voidinself.presentViewController(previewController!,animated:true,completion:nil)})alertController.addAction(discardAction)alertController.addAction(viewAction)self.presentViewController(alertController,animated:true,completion:nil)sender.removeTarget(self,action:“stopRecording:”,forControlEvents:.TouchUpInside)sender.addTarget(self,action:“startRecording:”,forControlEvents:.TouchUpInside)sender.setTitle(“StartRecording”,forState:.Normal)sender.setTitleColor(UIColor.blueColor(),forState:.Normal)}else{//Handleerror}}}继续一步步研究这个方法的实现。我们仍然使用RPScreenRecorder的实例对象来调用stopRecordingWithHandler(_:)方法,这次在callback块中,通过判断previewController是否存在来判断app是否成功完成录制。我们创建一个包含两个操作的UIAlertController,一个用于丢弃记录,另一个用于查看记录。要选择丢弃记录,请调用discardRecordingWithHandler(_:)方法。需要注意的是,该方法只有在确保录制成功后才能调用。如果在录制过程中调用它,虽然系统不会抛出任何错误,但也不会丢弃任何记录。选择查看录音,我们呈现previewController视图,它是RPPreviewController类的实例,从stopRecordingWithHandler(_:)方法回调块返回给我们,用于查看、编辑或共享录音。这个previewController视图控制器实例是唯一一个可以访问ReplayKit生成的视频文件的实例,它的功能是保存/共享录制。***,不要忘记恢复开始录制按钮以再次开始另一次录制!编译并运行您的应用程序并点击开始录制。按下停止录制按钮后,您将看到以下弹出窗口:如果您选择视图选项,将显示以下视图控制器:在这里,您可以编辑您的录制并单击保存按钮选择将其保存到您的相片。当然,你也可以点击左下角的分享按钮分享你录制的视频。需要注意的是,无论是设计原因还是ReplayKit框架的bug,在保存到“Photo”时,都没有确认就直接保存了。排除界面元素您可能已经注意到,顶部和底部按钮在应用程序录制中都是可见的,并且它们包含在最终的视频录制中。RepalyKit在记录你的应用时,会毫无遗漏地记录应用在UIWindow中渲染的所有视图,毫无隐瞒地记录任何细节。幸运的是,RepalyKit可以在电话来了或用户正在打字时停止界面上的录音。要从记录中排除UI元素,您需要将它们放在单独的UIWindow实例中。让我们来看看它是如何工作的。在GameViewController类中添加一个属性buttonWindow,类型为UIWindow!varbuttonWindow:UI窗口!接下来,将GameViewController类中的addButtons(_:)方法替换为以下代码:)forbuttoninbuttons{self.buttonWindow.rootViewController?.view.addSubview(button)}self.buttonWindow.makeKeyAndVisible()}在addButton(_:)方法中,我们新创建了一个新的UIWindow对象,并给它添加了一些按钮,并制作了它们可见的。注意HiddenStatusBarViewController类是我们在初始项目中添加的自定义视图控制器,用于确保屏幕顶部的状态栏在新窗口中隐藏。***,用下面的代码补充stopRecording(_:)方法的实现部分:funcstopRecording(sender:UIButton){RPScreenRecorder.sharedRecorder().stopRecordingWithHandler{(previewController:RPPreviewViewController?,error:NSError?)->VoidinifpreviewController!=nil{letalertController=UIAlertController(title:"Recording",message:"Doyouwishtodiscardorviewyourgameplayrecording?",preferredStyle:.Alert)letdiscardAction=UIAlertAction(title:"Discard",style:.Default){(action:UIAlertAction)inRPScreenRecorder.sharedRecorder().discardRecordingWithHandler({()->Voidin//Executedoncerecordinghassuccessfullybeendiscarded})}letviewAction=UIAlertAction(title:"View",style:.Default,handler:{(action:UIAlertAction)->Voidinself.buttonWindow.rootViewController?.presentViewController(previewController!,animated:true,completion:nil)})alertController.addAction(discardAction)alertController.addAction(viewAction)print(self.buttonWindow.rootViewController)self.buttonWindow.rootViewController?.presentViewController(alertController,animated:true,completion:nil)sender.removeTarget(self,action:"stopRecording:",forControlEvents:.TouchUpInside)sender.addTarget(self,action:"startRecording:",forControlEvents:.TouchUpInside)sender.setTitle("StartRecording",forState:.Normal)sender.setTitleColor(UIColor.blueColor(),forState:.Normal)}else{//Handleerror}}}新的viewcontroller只是和之前的不一样1是窗口顶部的交互部分,保证了交互控件的正确显示和用户交互的正确进行。再次运行你的应用,重新录制,你会发现界面按钮被隐藏了:delegate协议和ReplayKit关联的两个协议一共有四个代理方法,但是本教程没有用到,但是大家应该明白那如何使用它们。RPScreenRecorderDelegate协议定义了以下两个方法:screenRecorder(_:didStopRecordingWithError:previewViewController:)每当录制过程中发生错误时,都会调用该方法。当然,如果ReplayKit可以从这个错误中自我修复并完成录制,您仍然可以选择将预览视图呈现给用户。screenRecorderDidChangeAvailability(_:)当触发另一个动作导致录制状态改变时调用此方法。例如,当您连接或断开Airplay时会触发此方法。RPPreviewViewControllerDelegate协议定义了以下方法:previewViewControllerDidFinlish(_:)当用户退出RPPreviewViewController视图实例时立即调用该方法。previewViewController(_:didFinlishWithActivityTypes:)这个方法会和previewViewControllerDidFinlish(_:)回调同时被触发,但是这个方法额外携带了一个UIActivity类型的参数。请注意,如果您实现任何RPPreviewViewControllerDelegate方法,您有责任在适当的时间呈现previewViewController视图控制器。要点当我们接近完成时,您在使用RepalyKit时需要注意一些关键点。每个应用程序在任何时候都只能存储一个记录。一旦开始录制新记录,如果之前的记录已经存在,新的记录会自动覆盖之前的记录!及时丢弃不需要的记录。确保没有过多不必要的视频数据占用设备本地存储空间,一旦从用户行为判断一条记录没有价值,及时丢弃。在本教程中,当用户不需要记录时,教程也给出了最好的实现逻辑,就是丢弃。显示录音指示器。在本教程中,显示??一个指示器可以告知用户是否正在录制视频,尤其是在同时使用设备的麦克风时,以尽可能改善用户体验。仔细选择要从用户录制界面中排除的元素,将选择界面的元素放置在单独的窗口中,包括选择控件或偏离游戏本身的不重要内容。如:记录指示器、虚拟控件或菜单??按钮。您不能直接访问最终的视频文件。您可以使存储在ReplayKit记录中的数据在用户回头查看视图控制器previewViewController时可见。但是,出于苹果对用户隐私的保护,ReplayKit的记录数据应该被应用程序访问。如果你想将这些录音上传到你自己的服务器,你需要创建一个共享扩展视图控制器来这样做,并从previewViewController中呈现它。ReplayKit还支持家长控制。即使设备后台没有其他进程在运行,录音功能是否可用仍然由家长控制授权。这意味着您必须确保在录制开始时检查是否允许使用该功能。***我想说的是,虽然苹果已经准备好游戏开发者(developers)使用ReplayKit让用户分享他们的游戏,但是你可以在任何苹果应用程序中使用ReplayKit,只要Xcode7+和iOS9+要求.我非常支持使用ReplayKit这个优秀的框架,很高兴看到更多的开发者可以用它做出更多更好的苹果应用!总结您现在应该乐于将ReplayKit框架集成到您的应用程序中以进行屏幕录制,从而轻松编辑您的用户共享。总的来说,ReplayKit是一款优秀而强大的框架,是一款非常棒的app录屏分享工具!