iOS 9 een inleiding tot ReplayKit

Invoering

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.

voorwaarden

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.

1. Opnames initiëren

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.

2. Opnames stoppen, verwijderen en bewerken

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.

3. Exclusief interface-elementen

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:

4. Protocollen delegeren

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.

5. Belangrijke opmerkingen

Om af te sluiten, ga ik een aantal belangrijke dingen vertellen om in gedachten te houden wanneer je met ReplayKit werkt.

  • Slechts één opname kan op elk moment per app worden opgeslagen. Zodra u een nieuwe opname start, wordt bij een eerdere opname deze automatisch verwijderd en niet meer beschikbaar.
  • Verwijder opnames zo snel mogelijk. Om ervoor te zorgen dat de lokale opslag van een apparaat niet gevuld blijft met onnodige videogegevens, verwijdert u opnamen zodra u weet dat de gebruiker op een later tijdstip geen toegang heeft tot zijn opname. In deze zelfstudie hebben we deze best practice gevolgd door de opname te verwijderen zodra we wisten dat de gebruiker deze niet wilde bekijken.
  • Geef opname-indicatoren weer. Zoals we in deze tutorial deden, is het tonen van een opname-indicator essentieel voor een goede gebruikerservaring bij het gebruik van ReplayKit, met name bij gebruik van de microfoon van het apparaat.
  • Selecteer zorgvuldig welke elementen van de gebruikersinterface worden uitgesloten van opnames. Wanneer u kiest welke interface-elementen u in een apart venster wilt plaatsen, kiest u items die niet belangrijk zijn of die afbreuk doen aan de gameplay zelf. Dit omvat zaken als opname-indicatoren, virtuele bedieningselementen en menuknoppen.
  • U hebt geen directe toegang tot het definitieve videobestand. Alleen ReplayKit bevat een verwijzing naar de opnames van uw app in opslag en maakt deze zichtbaar voor de gebruiker via de 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.
  • ReplayKit ondersteunt ouderlijk toezicht. Zelfs als uw app op een compatibel apparaat wordt uitgevoerd zonder dat andere apps op de achtergrond worden uitgevoerd, kan het starten van een opname nog steeds worden voorkomen vanwege ouderlijk toezicht. Dit betekent dat u altijd moet controleren of er opnamevideo beschikbaar is.
  • Tot slot, ook al heeft Apple ReplayKit gericht op game-ontwikkelaars om gamers te laten delen in het spel, niets weerhoudt je ervan om ReplayKit te gebruiken in een reguliere applicatie. ReplayKit is beschikbaar voor elke toepassing die is gebouwd met Xcode 7 en de iOS 9 SDK. Als u er gebruik van kunt maken in uw app, moedig ik u aan om dit geweldige framework te gebruiken.

Conclusie

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.