ReplayKit is een nieuw framework dat naast iOS 9 werd geïntroduceerd. Het biedt ontwikkelaars de mogelijkheid om spelers de mogelijkheid te bieden om eenvoudig gameplay op te nemen en te delen. Naast opnemen en delen, bevat ReplayKit ook een volledig functionele gebruikersinterface die spelers kunnen gebruiken om hun videoclips te bewerken.
De door ReplayKit geproduceerde opnames zijn van hoge definitie en zijn gemaakt met minimaal energieverbruik en prestatieverlies. ReplayKit's functies zijn beschikbaar voor elk apparaat met een A7, A8 of A9 systeem-op-chip (elk apparaat dat Metal ondersteunt) met iOS 9 of hoger.
Deze tutorial vereist dat je Xcode 7+ draait op OS X Yosemite of hoger. Als u het voorbeeldproject op een apparaat wilt testen, hebt u ook een apparaat nodig dat ReplayKit ondersteunt. Je zult ook het startersproject van GitHub moeten downloaden.
Het opnemen van gameplay met ReplayKit begint met de RPScreenRecorder
klasse en de sharedRecorder ()
beschikbaar voor uw app. Deze recorder is verantwoordelijk voor het controleren van de mogelijkheid van het apparaat om opnames op te nemen, te starten, te stoppen en te verwijderen, alsmede om de microfoon van het apparaat optioneel in te schakelen zodat spelers hun eigen live commentaar op de stem kunnen toevoegen.
Open het startersproject dat u hebt gedownload van GitHub en ga naar GameViewController.swift. Voeg aan de bovenkant van dit bestand een importinstructie toe voor het ReplayKit-framework.
importeer ReplayKit
Implementeer vervolgens de start met opnemen(_:)
methode in de GameViewController
klasse. Deze methode wordt aangeroepen wanneer de gebruiker op de knop tikt Start met opnemen knop.
func startRecording (afzender: UIButton) if RPScreenRecorder.sharedRecorder (). beschikbaar RPScreenRecorder.sharedRecorder (). startRecordingWithMicrophoneEnabled (true, handler: (error: NSError?) -> Void in if error == nil // Recording heeft start sender.removeTarget (self, action: "startRecording:", forControlEvents: .TouchUpInside) sender.addTarget (self, action: "stopRecording:", forControlEvents: .TouchUpInside) sender.setTitle ("Stop Recording", forState: .Normal ) sender.setTitleColor (UIColor.redColor (), forState: .Normal) else // Handle error) else // Display-gebruikersinterface voor opname niet beschikbaar
Laten we deze methode stap voor stap doorlopen. We hebben toegang tot de RPScreenRecorder
instance beschikbaar voor onze app via de sharedRecorder ()
methode en we controleren of opname beschikbaar is voor het apparaat.
Als er opname beschikbaar is, starten we een opname door de startRecordingWithMicrophone (_: handler :)
methode op het object van de gedeelde recorder. De parameters voor deze methode zijn een boolean, die aangeeft of u de microfoon van het apparaat wilt gebruiken en een voltooiingshandler. De voltooiingshandler heeft toegang tot een optioneel foutobject dat door het ReplayKit-framework aan u wordt geretourneerd als er iets misgaat. Als het framework geen fout heeft gegenereerd, passen we het doel en het uiterlijk van de knop aan, zodat de gebruiker kan stoppen met opnemen wanneer hij klaar is.
Bouw en voer uw applicatie uit en probeer de app door op de groene knop te tikken. Je zult zien dat een deeltjessysteem in de scène deeltjes genereert terwijl de groene knop wordt ingedrukt. Als je tikt Start met opnemen, je zou de volgende melding moeten zien:
Houd er rekening mee dat deze waarschuwing elke keer wordt weergegeven wanneer u begint met opnemen in uw app. Zodra een gebruiker een van deze opties heeft geselecteerd, wordt zijn voorkeur echter onthouden en zal geen van deze waarschuwingen de volgende acht minuten worden weergegeven.
Nadat u een van deze opties uit de waarschuwing hebt geselecteerd, zorgt de Start met opnemen knop moet rood worden Stop met opnemen knop.
Nu onze app ReplayKit-opnames kan starten, is het tijd om te leren hoe u met deze opnamen moet omgaan wanneer u klaar bent. Implementeer de stop met opnemen(_:)
methode in de GameViewController
klasse.
func stopRecording (afzender: UIButton) RPScreenRecorder.sharedRecorder (). stopRecordingWithHandler (previewController: RPPreviewViewController ?, error: NSError?) -> Void in if previewController! = nil let alertController = UIAlertController (title: "Recording", message: "Wilt u uw gameplay-opname verwijderen of bekijken?", PreferredStyle: .Alert) laat discardAction = UIAlertAction (title: "Discard", style: .Default) (action: UIAlertAction) in RPScreenRecorder.sharedRecorder (). DiscardRecordingWithHandler ( () -> Void in // Uitgevoerd zodra opname succesvol is verwijderd) let viewAction = UIAlertAction (title: "View", style: .Default, handler: (action: UIAlertAction) -> Void in self.presentViewController (previewController !, geanimeerd: true, completion: nil)) alertController.addAction (discardAction) alertController.addAction (viewAction) self.presentViewController (alertController, geanimeerd: true, completion: nil) sender.removeTarget (self, action: "stopRecording : ", forC ontrolEvents: .TouchUpInside) sender.addTarget (self, action: "startRecording:", forControlEvents: .TouchUpInside) sender.setTitle ("Start Recording", forState: .Normal) sender.setTitleColor (UIColor.blueColor (), forState:. Normaal) else // Handelingsfout
Nogmaals, laten we deze methode stap voor stap doorlopen. We noemen het stopRecordingWithHandler (_ :)
methode op het object van de gedeelde recorder. In deze voltooiingshandler controleren we of de opname met succes is voltooid door te controleren of de previewController
bestaat.
We creëren een UIAlertController
met twee acties, één om de opname te negeren en één om de opname te bekijken. Als de gebruiker ervoor kiest de opname te verwijderen, roepen we aan discardRecordingWithHandler (_ :)
. Merk op dat deze methode alleen kan worden aangeroepen als een opname is voltooid. Als u deze methode aanroept terwijl er een opname bezig is, wordt er geen fout gegenereerd, maar worden ook geen opnamegegevens weggegooid.
Als de gebruiker ervoor kiest om de opname te bekijken, presenteren we de previewController
, een instantie van de RPPreviewController
klas, ons overhandigd door de stopRecordingWithHandler (_ :)
methode waarbij de gebruiker zijn opname kan bekijken, bewerken en delen. De preview-controller is het enige object dat toegang heeft tot het videobestand dat door ReplayKit is gegenereerd en is verantwoordelijk voor het opslaan / delen van die opname.
Ten slotte keren we de knop terug naar de oorspronkelijke staat, zodat een andere opname kan worden gemaakt als de gebruiker dat wil.
Bouw en voer je app opnieuw uit en start een opname. Zodra u vervolgens op de Stop met opnemen knop zou je de volgende waarschuwing moeten zien:
Als u vervolgens op drukt op Uitzicht optie, de volgende view controller wordt gepresenteerd.
In dit scherm kunt u uw video bewerken en deze op de camerarol van uw apparaat opslaan door op de knop te drukken Opslaan knop. U kunt het ook delen door op de knop in de linkerbenedenhoek te drukken.
Merk op dat op het moment van schrijven van deze tutorial, hetzij door ontwerp of als gevolg van een bug in het ReplayKit-framework, er geen bevestiging is nadat een opname is opgeslagen in de camerarol.
U hebt misschien gemerkt dat de bovenste en onderste knoppen ook zichtbaar zijn in de opnames gemaakt door de toepassing. Ze zijn opgenomen in de laatste video. Wanneer ReplayKit uw toepassing registreert, registreert het alles in het hoofd van uw app UIWindow
aanleg. Gelukkig sluit ReplayKit automatisch alle inkomende meldingen en gebruikersinvoer van de opname uit.
Als u elementen van de gebruikersinterface wilt uitsluiten van de opname, moet u deze in een afzonderlijke map plaatsen UIWindow
aanleg. Laten we kijken hoe dat werkt. Voeg een eigenschap toe, buttonWindow
van type UIWindow!
, naar de GameViewController
klasse.
var buttonWindow: UIWindow!
Vervang vervolgens de huidige implementatie van de addButtons (_ :)
methode van de GameViewController
klasse met de volgende implementatie:
func addButtons (knoppen: [UIButton]) self.buttonWindow = UIWindow (frame: self.view.frame) self.buttonWindow.rootViewController = HiddenStatusBarViewController () voor knop in knoppen self.buttonWindow.rootViewController? .view.addSubview (knop ) self.buttonWindow.makeKeyAndVisible ()
In addButtons (_ :)
, we creëren een nieuw UIWindow
object, voeg de knoppen toe en maak het zichtbaar. Merk op dat de HiddenStatusBarViewController
klasse is een aangepaste die ik heb toegevoegd aan het startersproject. Het zorgt ervoor dat de statusbalk verborgen blijft in het nieuwe venster.
Ten slotte de uitvoering van de stop met opnemen(:_)
methode met de volgende implementatie:
func stopRecording (afzender: UIButton) RPScreenRecorder.sharedRecorder (). stopRecordingWithHandler (previewController: RPPreviewViewController ?, error: NSError?) -> Void in if previewController! = nil let alertController = UIAlertController (title: "Recording", message: "Wilt u uw gameplay-opname verwijderen of bekijken?", PreferredStyle: .Alert) laat discardAction = UIAlertAction (title: "Discard", style: .Default) (action: UIAlertAction) in RPScreenRecorder.sharedRecorder (). DiscardRecordingWithHandler ( () -> Void in // Uitgevoerd zodra opname succesvol is verwijderd) let viewAction = UIAlertAction (title: "View", style: .Default, handler: (action: UIAlertAction) -> Void in self.buttonWindow .rootViewController? .presentViewController (previewController !, geanimeerd: true, completion: nil)) alertController.addAction (discardAction) alertController.addAction (viewAction) print (self.buttonWindow.rootViewController) self.buttonWindow.rootViewController? .presentViewControl ler (alertController, geanimeerd: true, completion: nil) sender.removeTarget (self, action: "stopRecording:", forControlEvents: .TouchUpInside) sender.addTarget (self, action: "startRecording:", forControlEvents: .TouchUpInside) afzender. setTitle ("Start Recording", forState: .Normal) sender.setTitleColor (UIColor.blueColor (), forState: .Normal) else // Handle error
Het enige verschil is dat we de view controller in het nieuwe, bovenste venster alle presentaties laten verwerken. Dit zorgt ervoor dat alles correct wordt weergegeven en met de gebruikersinterface kan worden gecommuniceerd.
Run je app nog een keer en maak een nieuwe opname. Je zult zien dat de knoppen niet meer zichtbaar zijn in de video:
Hoewel het niet in deze zelfstudie wordt gebruikt, zijn er twee protocollen en in totaal vier methoden gekoppeld aan ReplayKit. Laten we eens kijken hoe en wanneer u ze zou moeten gebruiken.
De RPScreenRecorderDelegate
protocol definieert de volgende methoden:
screenrecorder (_: didStopRecordingWithError: previewViewController :)
: Deze methode wordt aangeroepen wanneer een fout optreedt tijdens de opname. Als ReplayKit deze fout kan herstellen en uw opname kan beëindigen, krijgt u ook een voorbeeldweergavecontroller die u aan uw gebruiker kunt presenteren.screenRecorderDidChangeAvailability (_ :)
: Deze methode wordt gebruikt wanneer een opname beschikbaar wordt of niet beschikbaar is vanwege een andere actie. Dit kan bijvoorbeeld gebeuren wanneer u verbinding maakt met AirPlay of de verbinding verbreekt.De RPPreviewViewControllerDelegate
protocol definieert de volgende methoden:
previewViewControllerDidFinish (_ :)
wordt aangeroepen zodra de gebruiker de RPPreviewViewController
aanleg.previewViewController (_: didFinishWithActivityTypes :)
wordt gelijktijdig met previewViewControllerDidFinish (_ :)
, maar het biedt een extra UIActivity
parameter.Merk op dat, als u een van de implementeert RPPreviewViewControllerDelegate
methoden, dan u verantwoordelijk worden voor het op het juiste moment afwijzen van de preview-viewcontroller.
Om af te sluiten, ga ik een aantal belangrijke dingen vertellen om in gedachten te houden wanneer je met ReplayKit werkt.
RPPreviewViewController
. Om privacyredenen zijn ReplayKit-opnamen nooit rechtstreeks toegankelijk voor uw app. Als u de gameplay-opname bijvoorbeeld naar uw eigen servers wilt uploaden, moet u een gedeelde extensie maken die wordt weergegeven in het gedeelde blad dat door de previewview-controller wordt gepresenteerd.U moet nu vertrouwd zijn met het nieuwe ReplayKit-framework om opnames te maken van het scherm van uw app, dat door uw gebruikers kan worden bewerkt en gedeeld. Over het algemeen is ReplayKit een zeer compact en toch krachtig framework waarmee ontwikkelaars eenvoudig opnamen kunnen maken binnen hun applicaties die door hun gebruikers worden gedeeld..
Laat zoals altijd, opmerkingen of feedback achter in de opmerkingen hieronder.