Cu iOS 8 și OS X Yosemite, Apple a introdus o nouă caracteristică nouă pentru dezvoltatori, pentru a profita de ea, Ia mâna. Handoff permite aplicațiilor să transfere date și informații despre starea aplicațiilor de la un dispozitiv la altul prin Bluetooth. Acest lucru permite utilizatorilor aplicațiilor dvs. să înceapă o activitate pe unul dintre dispozitivele lor și apoi să o continue fără probleme pe altul.
Un exemplu de acest lucru ar fi să începeți să scrieți un mesaj pe iPhone și apoi să terminați și să trimiteți același mesaj pe iPad. În acest tutorial, vă voi arăta cum puteți adopta Handoff în propriile aplicații printr-o notă foarte simplă, care va lua aplicația.
Acest tutorial necesită să executați Xcode 6+ și să aveți două dispozitive compatibile Handoff. Nu toate dispozitivele iOS 8 au Bluetooth LE (Energy Low), care este necesar pentru Handoff. Prin urmare, această caracteristică este disponibilă numai și poate fi testată numai pe următoarele dispozitive:
În timpul testării, trebuie să vă conectați la același cont iCloud pe fiecare dispozitiv și să activați funcția Handoff în setările dispozitivului.
Creați un nou proiect în Xcode și alegeți Vizualizare individuală șablon din iOS> aplicație secțiune.
Configurați proiectul după cum se arată mai jos. Rețineți că Limba este setat sa Rapid și Dispozitive este setat sa universal.
După ce Xcode ți-a creat proiectul, deschide-l ViewController.swift și să înlocuiască punerea în aplicare a directivei ViewController
clasa cu următoarea implementare:
clasa ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate var noteTitleField: UITextField! var noteContentView: UITextView! suprascrie func viewDidAppear (animat: Bool) self.noteTitleField = UITextField (cadru: CGRect (x: 12, y: 28, width: self.view.frame.width - 22, height: 20) self.noteTitleField.placeholder = "Notă Titlu" self.noteTitleField.delegate = auto.noteContentView = UITextView (cadru: CGRect (x: 8, y: 56, lățime: self.view.frame.width - 16, height: self.view.frame.height - 64)) auto.noteContentView.text = "Notă Conținut" self.noteContentView.delegate = auto-auto.view.addSubview (self.noteTitleField) self.view.addSubview (self.noteContentView) func textViewDidBeginEditing textView: UITextView) dacă textView.text == "Notă Conținut" textView.text = "" suprascrie func viewDidLoad () super.viewDidLoad () // Efectuați orice setare suplimentară după încărcarea vizualizării, de obicei de la o pensetă.
Implementarea este destul de simplă. Ea face ViewController
clasa adoptă atât UITextFieldDelegate
și UITextViewDelegate
protocoale și adaugă a UITextField
și UITextView
la vizualizarea controlerului de vizualizare pentru introducerea textului.
Construiți și difuzați aplicația pe unul dintre dispozitivele dvs. de testare și ar trebui să vedeți o interfață de utilizator foarte importantă cu două câmpuri de introducere, un câmp de text pentru un titlu și un text pentru conținutul notei.
Activitățile transferate între dispozitivele cu Handoff sunt modelate de NSUserActivity
clasă. Veți învăța mai multe despre această clasă și despre modul de utilizare mai târziu în acest tutorial. Mai întâi, aplicația dvs. trebuie să fie configurată pentru a crea cu succes aceste activități.
Fiecare tip de activitate acceptat de aplicație trebuie să aibă un identificator unic, similar cu modul în care fiecare aplicație iOS are propriul ID unic. Acești identificatori pot fi oricare doriți, dar cea mai bună practică este să utilizați notația DNS inversă, cum ar fi com.tutsplus.handoff-introduction.note. Exemplul aplicației care rulează pe fiecare dispozitiv trebuie, de asemenea, să fie semnat de aceeași echipă de dezvoltare iOS pentru ca activitățile să fie recunoscute în mod corespunzător.
Mai întâi trebuie să adăugați identificatorii de activitate pe care aplicația dvs. îi suportă la destinații Info.plist. Deschideți țintă Info.plist și adăugați NSUserActivityTypes cheie. Faceți acest element un mulțime și adăugați un singur element, com.tutsplus.handoff-introduction.note, după cum se arată în imaginea de mai jos.
Apoi, selectați proiectul din Project Navigator și, în editorul din dreapta, deschideți General tab. În Identitate secțiune, setat Echipă la echipa de dezvoltare iOS corectă.
Cu acești pași finalizați, cu condiția să fiți conectat (ă) la același cont iCloud și să fiți conectat la aceeași rețea Wi-Fi pe fiecare dintre dispozitivele dvs. de testare, aplicația dvs. este gata să înceapă să utilizeze Handoff.
Apoi, trebuie să adăugați un cod pentru ca activitatea utilizatorului să fie trimisă de la un dispozitiv la altul. Actualizați viewDidLoad
metodă a ViewController
clasa, după cum se arată mai jos.
override funcția viewDidLoad () super.viewDidLoad () permite activitatea = NSUserActivity (activityType: "com.tutsplus.handoff-introduction.note") activity.title = "Notă" activity.userInfo = ["title" conținut ":"] userActivity = activitate userActivity? .becomeCurrent ()
Acest lucru creează o bază NSUserActivity
obiect cu identificatorul pe care l-ați adăugat la țintă Info.plist mai devreme. Dați acestei activități obiect a titlu
și a userinfo
dicționar cu valori goale pentru șir titlu și conţinut chei.
În acest tutorial, vom introduce șiruri în activitatea noastră userinfo
dicţionar. Cu toate acestea, puteți adăuga orice tip de listă de proprietăți, cum ar fi numere, tablouri și dicționare, precum și orice altele NSCoding
obiect compatibil.
Apoi atribuiți această nouă activitate companiei userActivity
proprietatea dvs. ViewController
astfel încât API-ul Handoff să aibă o referință la acesta. UIViewController
clasa moștenește această proprietate de la UIResponder
clasă.
În cele din urmă, sunați becomeCurrent
pe obiectul de activitate pentru a spune sistemului că aceasta este activitatea curentă a utilizatorului care trebuie trimisă de către aplicație.
Ați creat acum activitatea dvs. de utilizator cu succes, dar trebuie să o completați și cu un anumit conținut, deoarece utilizatorul scrie nota. Pentru a face acest lucru, actualizăm activitatea curentă a utilizatorilor prin suprascrierea updateUserActivityState (_ :)
metodă în ViewController
clasă. Această metodă este numită periodic de API-ul Handoff pentru a actualiza activitatea curentă a utilizatorului. Adăugați următorul cod la ViewController
clasă.
override func updateUserActivityState (activitate: NSUserActivity) activity.addUserInfoEntriesFromDictionary (["title": self.noteTitleField.text, "content": self.noteContentView.text]) super.updateUserActivityState (activitate) func textField (textField: UITextField, shouldChangeCharactersInRange : Bron auto.updateUserActivityState (userActivity!) return true func textView (textView: UITextView, shouldChangeTextInRange interval: NSRange, textul de înlocuireText: String) -> Bool self.updateUserActivityState (userActivity! ) return true
updateUserActivityState (_ :)
ne dă o referință la activitatea curentă a utilizatorului și înlocuiește valorile din activitatea acestuia userinfo
dicționar cu cele mai recente valori din aplicația dvs. Rețineți că invocăm și această metodă pe superclaj.
Am implementat și alte două metode, textfield (_: shouldChangeCharactersInRange: replacementString :)
din UITextFieldDelegate
protocol și TextView (_: shouldChangeTextInRange: replacementText :)
din UITextViewDelegate
protocol. În aceste metode, actualizăm activitatea curentă a utilizatorilor ori de câte ori se modifică textul din oricare dintre câmpurile de intrare. În timp ce acest lucru nu este necesar, acest lucru asigură că activitatea dvs. va conține întotdeauna cele mai recente informații.
Sunteți gata să vă testați aplicația cu Handoff. Construiți și rulați aplicația dvs. pe ambele dispozitive de testare. Apăsați butonul de blocare de pe un dispozitiv pentru a pune dispozitivul în funcțiune în timp ce țineți aplicația deschisă pe cealaltă. Treziți dispozitivul pe care tocmai l-ați blocat și ar trebui să vedeți pictograma aplicației care apare în colțul din stânga jos al ecranului de blocare. Efectuați un gest de glisare pe această pictogramă, iar aplicația dvs. va fi reluată prin Handoff.
Alternativ, puteți face dublu clic pe butonul de pornire pentru a accesa comutatorul de aplicații, iar aplicația Handoff capabilă să apară în partea stângă a ecranului de pornire. În prezent, aplicația dvs. revine doar la aceeași interfață necompletată. Să rezolvăm asta acum.
Revenirea la o aplicație dintr-un Handoff NSUserActivity
este gestionată de delegatul dvs. de aplicare. Apoi, delegatul aplicației trimite obiectul de activitate al utilizatorului la controlerul de vizualizare rădăcină al aplicației pentru a se restabili. Dacă controlerul de vizualizare care are nevoie să proceseze activitatea nu este controlerul pentru vizualizarea rădăcină a aplicației dvs., atunci pur și simplu îl treceți de la controlerul de vizualizare rădăcină până la ierarhia controlerului de vizualizare până când ajungeți la locul dorit din aplicația dvs..
Deschis AppDelegate.swift și adăugați următoarea metodă la AppDelegate
clasă:
(aplicație: UIApplication, continuUserActivity userActivity: NSUserActivitate, restorationHandler: ([AnyObject]!) -> Void) -> Bool auto.window? .rootViewController? .restoreUserActivityState (userActivity)
În această metodă, treceți obiectul de activitate al utilizatorului la controlerul de vizualizare rădăcină al aplicației și reveniți Adevărat
, spuneți aplicației că ați primit și ați procesat cu succes activitatea de utilizator Handoff.
În continuare, deschideți-vă ViewController.swift și adăugați următoarea metodă la ViewController
clasă:
suprascrie func restoreUserActivityState (activitate: NSUserActivity) self.noteTitleField.text = activity.userInfo? ["title"] ca! String self.noteContentView.text = activity.userInfo? ["Content"] ca! String
Similar cu updateUserActivityState (_ :)
metoda de la mai devreme în acest tutorial, vă suprascrie restoreUserActivityState (_ :)
pentru a prelua informațiile de la NSUserActivity
obiect. În implementarea acestei metode, vă actualizați ambele câmpuri de introducere cu datele stocate în obiectul de activitate al utilizatorului.
Construiți și rulați aplicația pe ambele dispozitive de testare și începeți să scrieți o notă pe un singur dispozitiv. Din ecranul de blocare sau din comutatorul de aplicații de pe celălalt dispozitiv, deschideți aplicația prin Handoff și ar trebui să vedeți textul pe care l-ați scris pe primul dispozitiv pe al doilea.
Spre deosebire de multe API-uri furnizate de Apple pentru iOS, tratarea erorilor nu este ușoară atunci când utilizați Handoff dacă nu știți unde trebuie tratate aceste erori. Primul punct la care aplicația dvs. va fi notificată despre o eroare Handoff este prin intermediul cerere (_: didFailToContinueUserActivityWithType: eroare :)
în clasa de delegați a aplicației. În această metodă puteți determina ce cauză a fost eroarea și ce tip de activitate se referă la eroare. Rețineți că tipul de an NSUserActivity
obiect este același cu identificatorul unic pe care îl alocați.
Când aplicația dvs. continuă de la o activitate de Handoff, trebuie să descărcați mai întâi datele de pe dispozitivul original prin Bluetooth. Înainte ca această descărcare să fie completă, se numește o altă metodă de delegare a aplicației: cerere (_: willContinueUserActivityWithType :)
. În această metodă opțională, puteți reveni la o valoare booleană pentru a spune API Handoff dacă doriți sau nu să continuați să primiți activitatea utilizatorului. În unele situații, acest lucru poate fi util deoarece puteți dezactiva un anumit tip de NSUserActivity
când sunt îndeplinite anumite condiții.
În acest tutorial, v-am arătat cum puteți utiliza NSUserActivity
clasa pentru a adopta Handoff ușor în propriile aplicații iOS 8. Ați creat o aplicație foarte simplă, capabilă să transfere date fără fir pe un alt dispozitiv prin Bluetooth.
În timp ce aplicația de exemplu pe care am trecut-o în acest tutorial a fost foarte simplă, aplicațiile dvs. pot avea cât mai multe tipuri de activități de utilizator pe care le doriți pentru o gamă largă de funcționalități. Ca întotdeauna, dacă aveți orice comentarii sau întrebări, lăsați-le în comentariile de mai jos.