iOS 9 O introducere în ReplayKit

Introducere

ReplayKit este un nou cadru care a fost introdus alături de iOS 9. Acesta permite dezvoltatorilor de jocuri să ofere jucătorilor posibilitatea de a înregistra și împărtăși cu ușurință un gameplay. În plus față de înregistrare și partajare, ReplayKit include, de asemenea, o interfață de utilizator pe deplin funcțională pe care jucătorii o poate folosi pentru a-și edita videoclipurile.

Înregistrările produse de ReplayKit sunt de înaltă definiție și sunt create cu o utilizare minimă a puterii și o pierdere de performanță. Funcțiile ReplayKit sunt disponibile pentru toate dispozitivele cu sistem A7, A8 sau A9 pe sistem (fiecare dispozitiv care acceptă metale), care rulează iOS 9 sau o versiune ulterioară.

Cerințe preliminare

Acest tutorial cere să executați Xcode 7+ pe OS X Yosemite sau mai târziu. Dacă doriți să testați proba de proiect pe un dispozitiv, atunci aveți nevoie de un dispozitiv care suportă ReplayKit. De asemenea, va trebui să descărcați proiectul Starter de la GitHub.

1. Inițierea înregistrărilor

Înregistrarea gameplay-ului cu ReplayKit începe cu RPScreenRecorder clasa și sharedRecorder () disponibilă aplicației dvs. Acest recorder este responsabil pentru verificarea capacității dispozitivului de a înregistra, de a începe, de a opri și de a elimina înregistrările, precum și de a permite opțional microfonul dispozitivului să permită jucătorilor să adauge propriul comentariu vocal live asupra jocului audio.

Deschideți proiectul inițial pe care l-ați descărcat de la GitHub și mergeți la GameViewController.swift. În partea de sus a acestui fișier, adăugați o declarație de import pentru cadrul ReplayKit.

import ReplayKit

Apoi, implementați începe înregistrarea(_:) metodă în GameViewController clasă. Această metodă este invocată atunci când utilizatorul interceptează Începe înregistrarea buton.

func startRecording (expeditor: UIButton) if RPScreenRecorder.sharedRecorder () disponibil RPScreenRecorder.sharedRecorder () startRecordingWithMicrophoneEnabled (true, handler: (eroare: NSError? a început sender.removeTarget (auto, acțiune: "startRecording:", forControlEvents: .TouchUpInside) sender.addTarget (auto, acțiune: "stopRecording:", forControlEvents: .TouchUpInside) sender.setTitle ("Stop Recording", forState:. ) sender.setTitleColor (UIColor.redColor (), forState: .Normal) altceva // Eroare de manevră) altceva // Interfața de afișare pentru înregistrare fiind indisponibilă

Să trecem prin această metodă pas cu pas. Accesăm RPScreenRecorder instanță disponibilă pentru aplicația noastră prin sharedRecorder () și verificăm dacă înregistrarea este disponibilă pentru dispozitiv.

Dacă înregistrarea este disponibilă, începem o înregistrare sunând la startRecordingWithMicrophone (_: handler :) pe obiectul înregistratorului partajat. Parametrii pentru această metodă sunt booleani, indicând dacă doriți sau nu să utilizați microfonul dispozitivului și un handler de completare. Managerul de terminare are acces la un obiect de eroare opțional, care vă este returnat de către cadrul ReplayKit dacă ceva nu merge bine. Dacă cadrul nu a aruncat o eroare, ajustăm ținta și aspectul butonului, astfel încât utilizatorul să poată opri înregistrarea când este gata.

Construiți și executați aplicația și încercați aplicația atingând butonul verde. Veți vedea că un sistem de particule din scena generează particule în timp ce butonul verde este împins. Dacă atingeți Începe înregistrarea, ar trebui să vedeți următoarea alertă:

Rețineți că această alertă va apărea de fiecare dată când începeți să înregistrați în aplicația dvs. Odată ce un utilizator a selectat una dintre aceste opțiuni, preferința lor va fi reținută și niciuna dintre aceste alerte nu va apărea pentru următoarele opt minute.

După ce ați selectat una dintre aceste opțiuni din alertă, Începe înregistrarea butonul trebuie să devină roșu Opriți înregistrarea buton.

2. Oprirea, eliminarea și editarea înregistrărilor

Acum că aplicația noastră este capabilă să inițieze înregistrări ReplayKit, este timpul să învățăm cum să ne ocupăm de aceste înregistrări după terminare. Implementați stopRecording (_ :) metodă în GameViewController clasă.

funcția stopRecorder (expeditor: UIButton) RPScreenRecorder.sharedRecorder () stopRecordingWithHandler (previewController: RPPreviewViewController ?, eroare: NSError?) -> Void in if previewController! = nil let alertController = UIAlertController "Vrei să renunți sau să vizualizezi înregistrarea de gameplay?", PreferatStyle: .Alert) lasă discardAction = UIAlertAction (titlu: "Discard", stil: .Default) (acțiune: UIAlertAction) în RPScreenRecorder.sharedRecorder () -> Void în // Execuția o dată ce înregistrarea a fost eliminată cu succes a permite viewAction = UIAlertAction (titlu: "View", stil:. (previewController !, animat: true, completare: nil)) alertController.addAction (discardAction) alertController.addAction (viewAction) auto.presentViewController (alertController, animat: true, completare: nil) sender.removeTarget : ", pentruC ("Începeți înregistrarea", forState: .Normal) sender.setTitleColor (UIColor.blueColor (), forState:). Normal) altceva // Eroare de manevră

Încă o dată, să trecem prin această metodă pas cu pas. Noi numim stopRecordingWithHandler (_ :) pe obiectul înregistratorului partajat. În acest program de completare, verificăm dacă înregistrarea a terminat cu succes verificând dacă previewController există.

Creăm a UIAlertController cu două acțiuni, una pentru a renunța la înregistrare și una pentru a vedea înregistrarea. Dacă utilizatorul alege să renunțe la înregistrare, vom invoca discardRecordingWithHandler (_ :). Rețineți că această metodă poate fi apelată cu succes numai după terminarea unei înregistrări. Dacă apelați această metodă în timp ce o înregistrare este în curs de desfășurare, nu este aruncată nicio eroare, dar nici datele de înregistrare nu sunt aruncate.

Dacă utilizatorul alege să vizualizeze înregistrarea, vă prezentăm previewController, o instanță a RPPreviewController clasa, înmânată de noi stopRecordingWithHandler (_ :) unde utilizatorul poate previzualiza, edita și împărtăși înregistrarea. Controllerul de previzualizare este singurul obiect care are acces la fișierul video generat de ReplayKit și este responsabil de salvarea / partajarea acelei înregistrări.

În cele din urmă, readucem butonul înapoi la starea inițială, astfel încât să se poată face o altă înregistrare dacă utilizatorul dorește.

Construiți și rulați din nou aplicația și începeți o înregistrare. Odată ce ați apăsat apoi Opriți înregistrarea butonul trebuie să vadă următoarea alertă:

Dacă apăsați apoi pe Vedere , este prezentat următorul controler de vizualizare.

Din acest ecran, puteți să editați videoclipul și să îl salvați în rola aparatului foto, apăsând pe Salvați buton. Puteți, de asemenea, să o distribuiți apăsând butonul din colțul din stânga jos.

Rețineți că, la momentul redactării acestui tutorial, fie prin design, fie datorită unei erori în cadrul ReplayKit, nu există confirmare după ce o înregistrare a fost salvată pe rola aparatului foto.

3. Excluderea elementelor de interfață

Este posibil să fi observat că butoanele de sus și de jos sunt, de asemenea, vizibile în înregistrările făcute de aplicație. Acestea sunt incluse în filmul final. Atunci când ReplayKit înregistrează aplicația dvs., înregistrează totul în principalul aplicației dvs. UIWindow instanță. Din fericire, ReplayKit exclude automat orice notificări de intrare și intrarea utilizatorilor de la înregistrare.

Pentru a exclude elementele interfeței utilizator din înregistrare, trebuie să le plasați în propriile lor separate UIWindow instanță. Să vedem cum funcționează. Adăugați o proprietate, buttonWindow de tip UIWindow!, la GameViewController clasă.

buton varWindow: UIWindow!

Apoi, înlocuiți implementarea actuală a addButtons (_ :) metodă a GameViewController clasa cu următoarea implementare:

func addButtons (butoane: [UIButton]) self.buttonWindow = UIWindow (cadru: self.view.frame) self.buttonWindow.rootViewController = HiddenStatusBarViewController () pentru butonul în butoane self.buttonWindow.rootViewController? .view.addSubview ) self.buttonWindow.makeKeyAndVisible ()

În addButtons (_ :), noi creăm un nou UIWindow obiect, adăugați butoanele și faceți-o vizibilă. Rețineți că HiddenStatusBarViewController clasa este una personalizată pe care am adăugat-o la proiectul de pornire. Se asigură că bara de stare rămâne ascunsă în noua fereastră.

În cele din urmă, înlocuiți punerea în aplicare a directivei stopRecording (: _) cu următoarea implementare:

funcția stopRecorder (expeditor: UIButton) RPScreenRecorder.sharedRecorder () stopRecordingWithHandler (previewController: RPPreviewViewController ?, eroare: NSError?) -> Void in if previewController! = nil let alertController = UIAlertController "Vrei să renunți sau să vizualizezi înregistrarea de gameplay?", PreferatStyle: .Alert) lasă discardAction = UIAlertAction (titlu: "Discard", stil: .Default) (acțiune: UIAlertAction) în RPScreenRecorder.sharedRecorder () -> Void în // Execuția o dată ce înregistrarea a fost eliminată cu succes letAction = UIAlertAction (titlu: "View", stil:. .rootViewController? .presentViewController (previewController !, animat: true, completare: nil)) alertController.addAction (discardAction) alertController.addAction (viewAction) print (self.buttonWindow.rootViewController) self.buttonWindow.rootViewController? .presentViewControl ler (alertController, animat: adevărat, completare: nil) sender.removeTarget (auto, acțiune: "stopRecording:", forControlEvents: .TouchUpInside) sender.addTarget (auto, acțiune: "startRecording:", forControlEvents:. setTitle ("Începeți înregistrarea", forState: .Normal) sender.setTitleColor (UIColor.blueColor (), forState: .Normal) altceva // Eroare de manipulare

Singura diferență este aceea că facem controlerul de vizualizare în fereastra nouă, cea mai de sus să se ocupe de toate prezentările. Acest lucru asigură că totul este afișat corect și că interfața cu utilizatorul poate fi interacționată.

Rulați aplicația încă o dată și faceți o nouă înregistrare. Veți vedea că butoanele nu mai sunt vizibile în videoclip:

4. Protocoalele delegate

Deși nu sunt utilizate în acest tutorial, există două protocoale și un total de patru metode asociate cu ReplayKit. Să aruncăm o privire asupra modului în care ar trebui să le folosiți.

 RPScreenRecorderDelegate protocol definește următoarele metode:

  • screenRecorder (_: didStopRecordingWithError: previewViewController :): Această metodă se numește ori de câte ori apare o eroare în timpul înregistrării. Dacă ReplayKit se poate recupera din această eroare și vă termină înregistrarea, vă va fi dat un controler de vizualizare a previzualizării, pe care îl puteți prezenta utilizatorului.
  • screenRecorderDidChangeAvailability (_ :): Această metodă se numește ori de câte ori o înregistrare devine disponibilă sau indisponibilă din cauza unei alte acțiuni. Acest lucru se poate întâmpla, de exemplu, când vă conectați sau vă deconectați de la AirPlay.

 RPPreviewViewControllerDelegate protocol definește următoarele metode:

  • previewViewControllerDidFinish (_ :) este apelat de îndată ce utilizatorul respinge RPPreviewViewController instanță.
  • previewViewController (_: didFinishWithActivityTypes :) se numește în același timp cu previewViewControllerDidFinish (_ :), dar oferă o extra UIActivity parametru.

Rețineți că, dacă implementați oricare dintre RPPreviewViewControllerDelegate metode, atunci tu răspundeți de respingerea controlerului de vizualizare a previzualizării la momentul potrivit.

5. Note importante

Pentru a termina, îți voi spune câteva lucruri-cheie pe care să le ții minte când lucrezi cu ReplayKit.

  • Doar o singură înregistrare poate fi stocată în fiecare moment pe fiecare aplicație. De îndată ce începeți o nouă înregistrare, dacă există o înregistrare anterioară, va fi aruncată automat și nu mai este disponibilă.
  • Aruncați înregistrările cât mai curând posibil. Pentru a vă asigura că spațiul de stocare local al unui dispozitiv nu rămâne completat cu date video inutile, eliminați înregistrările de îndată ce știți că utilizatorul nu va accesa sau nu poate accesa înregistrarea lor într-un moment ulterior. În acest tutorial am urmat această bună practică prin eliminarea înregistrării de îndată ce am știut că utilizatorul nu a vrut să o vizualizeze.
  • Afișați indicatorii de înregistrare. Așa cum am făcut în acest tutorial, afișarea unui indicator de înregistrare este esențială pentru o experiență bună a utilizatorului atunci când se utilizează ReplayKit, în special atunci când se utilizează microfonul dispozitivului.
  • Selectați cu atenție elementele interfeței de utilizator pe care să le excludeți din înregistrări. Atunci când alegeți elementele de interfață pentru a le plasa într-o fereastră separată, alegeți elementele care nu sunt importante sau le distrageți de joc în sine. Acestea includ elemente precum indicatoare de înregistrare, comenzi virtuale și butoane de meniu.
  • Nu aveți acces direct la fișierul video final. Numai ReplayKit conține o referință la înregistrările aplicației dvs. în spațiul de stocare și le face vizibile utilizatorilor prin intermediul RPPreviewViewController. Din motive de confidențialitate, înregistrările ReplayKit nu sunt niciodată accesibile direct de aplicația dvs. Dacă doriți să încărcați înregistrarea jocului pe propriile servere, de exemplu, va trebui să creați o extensie de partajare care să apară în foaia de distribuire prezentată de controlerul de vizualizare a previzualizării.
  • ReplayKit acceptă controlul parental. Chiar dacă aplicația dvs. rulează pe un dispozitiv compatibil fără alte aplicații care rulează în fundal, pornirea unei înregistrări ar putea fi totuși împiedicată datorită controlului parental. Aceasta înseamnă că întotdeauna trebuie să verificați dacă este disponibilă înregistrarea video.
  • În sfârșit, deși Apple a îndreptat ReplayKit către dezvoltatorii de jocuri pentru a permite jucătorilor să împărtășească un gameplay, nimic nu vă oprește să utilizați ReplayKit într-o aplicație obișnuită. ReplayKit este disponibil pentru fiecare aplicație construită cu Xcode 7 și SDK-ul iOS 9. Dacă aveți o utilizare în aplicația dvs., vă încurajez să utilizați acest cadru minunat.

Concluzie

Acum ar trebui să vă simțiți confortabil folosind noul cadru ReplayKit pentru a face înregistrări ale ecranului aplicației dvs., care pot fi editate și distribuite de utilizatori. În ansamblu, ReplayKit este un cadru foarte compact dar puternic, care permite dezvoltatorilor să creeze cu ușurință înregistrări în cadrul aplicațiilor lor care sunt împărtășite de utilizatorii lor.

Ca întotdeauna, asigurați-vă că lăsați comentarii sau comentarii în comentariile de mai jos.

Cod