Un'introduzione a Handoff

introduzione

Con iOS 8 e OS X Yosemite, Apple ha introdotto una nuova grande funzionalità per gli sviluppatori di cui avvalersi, Giù le mani. Handoff consente alle app di trasferire dati e informazioni sullo stato dell'applicazione da un dispositivo a un altro tramite Bluetooth. Ciò consente agli utenti delle tue app di iniziare un'attività su uno dei loro dispositivi e quindi continuarla senza interruzioni su un altro.

Un esempio di questo sarebbe iniziare a scrivere un messaggio sul tuo iPhone e poi finire e inviare lo stesso messaggio sul tuo iPad. In questo tutorial, ti mostrerò come puoi adottare Handoff nelle tue applicazioni attraverso una semplice app per prendere appunti.

Questo tutorial richiede che tu stia utilizzando Xcode 6+ e disponga di due dispositivi Handoff compatibili. Non tutti i dispositivi iOS 8 hanno Bluetooth LE (Low Energy), necessario per Handoff. Questa funzione è quindi disponibile solo e può essere testata solo sui seguenti dispositivi:

  • iPhone 5 e versioni successive
  • iPad 4th Generation, incluso ogni modello di iPad Air
  • Ipad mini
  • iPod Touch 5th Generation

Durante i test, è necessario accedere allo stesso account iCloud su ciascun dispositivo e abilitare Handoff nelle impostazioni del dispositivo.

1. Impostazione del progetto

Crea un nuovo progetto in Xcode e scegli il Applicazione vista singola modello dal iOS> Applicazione sezione.

Configura il progetto come mostrato di seguito. Nota che linguaggio è impostato per velocedispositivi è impostato per universale.

Una volta che Xcode ha creato il tuo progetto, apri ViewController.swift e sostituire l'implementazione del ViewController classe con la seguente implementazione:

class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate var noteTitleField: UITextField! var noteContentView: UITextView! override func viewDidAppear (animato: Bool) self.noteTitleField = UITextField (frame: CGRect (x: 12, y: 28, larghezza: self.view.frame.width - 22, height: 20)) self.noteTitleField.placeholder = "Note Title" self.noteTitleField.delegate = self self.noteContentView = UITextView (frame: CGRect (x: 8, y: 56, width: self.view.frame.width - 16, height: self.view.frame.height - 64)) self.noteContentView.text = "Contenuto della nota" self.noteContentView.delegate = self self.view.addSubview (self.noteTitleField) self.view.addSubview (self.noteContentView) func textViewDidBeginEditing (textView: UITextView)  if textView.text == "Contenuto della nota" textView.text = "" override func viewDidLoad () super.viewDidLoad () // Esegue un'impostazione aggiuntiva dopo aver caricato la vista, in genere da un pennino. 

L'implementazione è piuttosto semplice. Rende il ViewController classe adotta sia il UITextFieldDelegateUITextViewDelegate protocolli e aggiunge a UITextFieldUITextView per visualizzare la vista del controller per l'immissione di testo.

Crea ed esegui la tua app su uno dei tuoi dispositivi di test e dovresti vedere un'interfaccia utente molto semplice con due campi di input, un campo di testo per un titolo e una visualizzazione di testo per il contenuto della nota.

2. Impostazione del trasferimento

Le attività trasferite tra i dispositivi con Handoff sono modellate dal NSUserActivity classe. Imparerai di più su questa lezione e su come usarla più avanti in questo tutorial. Innanzitutto, la tua app deve essere configurata per creare correttamente queste attività.

Ogni tipo di attività supportata dalla tua app deve avere un identificatore univoco, simile a come ogni applicazione iOS ha il proprio ID univoco. Questi identificatori possono essere qualsiasi cosa tu voglia, ma la migliore pratica è usare la notazione DNS inversa, come ad esempio com.tutsplus.handoff-introduction.note. L'istanza dell'applicazione in esecuzione su ciascun dispositivo deve inoltre essere firmata dallo stesso team di sviluppo iOS affinché le attività vengano riconosciute correttamente.

Devi prima aggiungere gli identificatori di attività che la tua app supporta per il target Info.plist. Apri il bersaglio Info.plist e aggiungi il NSUserActivityTypes chiave. Rendi questo oggetto un schieramento e aggiungere un singolo elemento, com.tutsplus.handoff-introduction.note, come mostrato nello screenshot qui sotto.

Quindi, selezionare il progetto nel Project Navigator e, nell'editor a destra, apri il Generale scheda. Nel Identità sezione, impostare Squadra al corretto team di sviluppo iOS.

Completati questi passaggi, a patto di aver effettuato l'accesso allo stesso account iCloud e connesso alla stessa rete Wi-Fi su ciascuno dei dispositivi di prova, l'applicazione è pronta per iniziare a utilizzare Handoff.

3. Invio di un'attività dell'utente

Successivamente, è necessario aggiungere del codice per consentire l'invio dell'attività dell'utente da un dispositivo a un altro. Aggiorna il viewDidLoad metodo del ViewController classe come mostrato di seguito.

override func viewDidLoad () super.viewDidLoad () let activity = NSUserActivity (activityType: "com.tutsplus.handoff-introduction.note") activity.title = "Note" activity.userInfo = ["title": "", " content ":" "] userActivity = activity userActivity? .becomeCurrent ()

Questo crea una base NSUserActivity oggetto con l'identificatore che hai aggiunto al tuo bersaglio Info.plist in precedenza. Dare questo oggetto attività a titolo e a userInfo dizionario con valori stringa vuoti per il titolo e soddisfare chiavi.

In questo tutorial, inseriremo le stringhe nelle nostre attività userInfo dizionario. Tuttavia, è possibile aggiungere qualsiasi tipo di elenco di proprietà, come numeri, matrici e dizionari, nonché qualsiasi NSCoding oggetto conforme.

Quindi assegni questa nuova attività al UserActivity proprietà del tuo ViewController istanza in modo che l'API Handoff abbia un riferimento ad essa. Il UIViewController la classe eredita questa proprietà dal UIResponder classe.

Infine, chiami becomeCurrent sull'oggetto attività per comunicare al sistema che questa è l'attività dell'utente corrente che deve essere inviata dall'applicazione.

Ora hai impostato correttamente l'attività dell'utente, ma dobbiamo anche riempirlo con alcuni contenuti mentre l'utente scrive la sua nota. Per fare ciò, aggiorniamo l'attività dell'utente corrente sovrascrivendo il updateUserActivityState (_ :) metodo nel ViewController classe. Questo metodo è chiamato periodicamente dall'API Handoff per aggiornare l'attività dell'utente corrente. Aggiungi il seguente codice al ViewController classe.

override func updateUserActivityState (attività: NSUserActivity) activity.addUserInfoEntriesFromDictionary (["title": self.noteTitleField.text, "content": self.noteContentView.text]) super.updateUserActivityState (attività) func textField (textField: UITextField, shouldChangeCharactersInRange range: NSRange, replaceString stringa: String) -> Bool self.updateUserActivityState (userActivity!) restituisce true func textView (textView: UITextView, shouldChangeTextInRange range: NSRange, replaceText text: String) -> Bool self.updateUserActivityState (userActivity! ) return true

Il updateUserActivityState (_ :) il metodo ci fornisce un riferimento all'attività dell'utente corrente e sostituisce i valori nelle attività userInfo dizionario con gli ultimi valori dalla tua app. Nota che invochiamo anche questo metodo sulla superclasse.

Abbiamo anche implementato altri due metodi, textField (_: shouldChangeCharactersInRange: ReplacementString :) del UITextFieldDelegate protocollo e textView (_: shouldChangeTextInRange: replacementText :) del UITextViewDelegate protocollo. In questi metodi, aggiorniamo l'attività dell'utente corrente ogni volta che cambia il testo in uno qualsiasi dei campi di input. Anche se questo non è necessario, questo garantisce che la tua attività contenga sempre le informazioni più recenti.

Ora sei pronto per testare la tua app con Handoff. Crea ed esegui la tua app su entrambi i tuoi dispositivi di prova. Premi il pulsante di blocco su un dispositivo per mettere in stop il dispositivo mantenendo l'app aperta sull'altro. Riattiva il dispositivo che hai appena bloccato e dovresti vedere l'icona dell'app apparire nell'angolo in basso a sinistra della schermata di blocco. Esegui un gesto di scorrimento su questa icona e la tua app riprenderà tramite Handoff.

In alternativa, puoi fare doppio clic sul pulsante Home per accedere allo switcher dell'app e l'app Handoff abilitata verrà visualizzata a sinistra della schermata principale. Al momento, la tua app torna alla stessa interfaccia vuota. Risolviamolo ora.

4. Ripristino da un'attività dell'utente

Ripristino di un'app da un Handoff NSUserActivity è gestito dal delegato dell'applicazione. Il delegato dell'app passa quindi l'oggetto attività utente al controller della vista radice dell'applicazione per ripristinarsi. Se il controller della vista che deve elaborare l'attività non è il controller della vista radice dell'applicazione, è sufficiente passarlo dal controller della vista radice alla gerarchia del controller di visualizzazione fino a raggiungere la posizione desiderata nell'app.

Aperto AppDelegate.swift e aggiungere il seguente metodo al AppDelegate classe:

func application (applicazione: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool self.window? .rootViewController? .restoreUserActivityState (userActivity) return true

In questo metodo, si passa l'oggetto attività utente al controller della vista radice dell'applicazione e, restituendo vero, dichiari all'applicazione che hai ricevuto ed elaborato correttamente l'attività dell'utente Handoff.

Avanti, aperto ViewController.swift e aggiungere il seguente metodo al ViewController classe:

override func restoreUserActivityState (attività: NSUserActivity) self.noteTitleField.text = activity.userInfo? ["title"] as! String self.noteContentView.text = activity.userInfo? ["Content"] as! Stringa

Simile al updateUserActivityState (_ :) metodo di prima in questo tutorial, si sostituisce il restoreUserActivityState (_ :) metodo per recuperare le informazioni dal NSUserActivity oggetto. Nell'implementazione di questo metodo, si aggiornano entrambi i campi di input con i dati memorizzati nell'oggetto attività utente.

Crea ed esegui la tua app su entrambi i dispositivi di prova e inizia a scrivere una nota su un dispositivo. Dalla schermata di blocco o dallo switcher dell'app sull'altro dispositivo, apri l'app tramite Handoff e dovresti vedere il testo che hai scritto sul tuo primo dispositivo sul secondo dispositivo.

5. Metodi di gestione degli errori e delega

A differenza di molte API fornite da Apple per iOS, la gestione degli errori non è facile quando si utilizza Handoff se non si sa dove devono essere gestiti questi errori. Il primo punto in cui la tua app riceverà una notifica di un errore Handoff è tramite il applicazione (_: didFailToContinueUserActivityWithType: errore :) nella classe del delegato dell'app. In questo metodo è possibile determinare quale sia la causa dell'errore e il tipo di attività a cui si riferisce l'errore. Si noti che il tipo di un NSUserActivity l'oggetto è uguale all'identificatore univoco che lo assegni.

Quando l'applicazione continua da un'attività di Handoff, è necessario prima scaricare i dati associati all'attività dal dispositivo originale tramite Bluetooth. Prima che questo download sia completo, viene chiamato un altro metodo di delega dell'applicazione: applicazione (_: willContinueUserActivityWithType :). In questo metodo facoltativo, è possibile restituire un valore booleano per indicare all'API Handoff se si desidera o meno continuare a ricevere l'attività dell'utente. In alcune situazioni, ciò può essere utile in quanto è possibile disabilitare un particolare tipo di NSUserActivity quando sono soddisfatte determinate condizioni.

Conclusione

In questo tutorial, ti ho mostrato come puoi usare il NSUserActivity classe per adottare facilmente Handoff nelle proprie applicazioni iOS 8. Hai creato un'applicazione molto semplice, in grado di trasferire dati in modalità wireless a un altro dispositivo tramite Bluetooth.

Mentre l'esempio di esempio che abbiamo seguito in questo tutorial è stato molto semplice, le tue applicazioni possono avere tutti i tipi di attività utente che desideri per un'ampia varietà di funzionalità. Come sempre, se avete commenti o domande, lasciateli nei commenti qui sotto.