Con l'imminente aggiornamento di watchOS 3 su tutti i dispositivi Apple Watch, le prestazioni di molte applicazioni di controllo miglioreranno significativamente. Ciò è dovuto principalmente alle nuove forme di esecuzione in background che le app watchOS possono sfruttare per aggiornare periodicamente il loro contenuto e avere sempre le informazioni più recenti pronte per essere visualizzate dall'utente.
In questo tutorial ti mostrerò come utilizzare le nuove API WatchKit in watchOS 3 per far sì che la tua applicazione utilizzi queste nuove attività in background. È importante notare che, anche se la tua app è configurata correttamente per supportare questi aggiornamenti in background, a seconda della configurazione di un particolare utente, il sistema potrebbe non consentire alla tua app di funzionare in background.
Questo tutorial richiede che tu stia eseguendo Xcode 8 su OS X El Capitan o successivo.
La prima importante nuova classe in watchOS 3 è la WKRefreshBackgroundTask
classe. Questa è una classe astratta che non dovresti creare in sottoclasse o creare istanze di te stesso. Definisce solo una proprietà, userInfo
, che può memorizzare ulteriori informazioni relative all'attività in background. Definisce anche un singolo metodo, setTaskCompleted ()
, che devi chiamare per dire al sistema che l'attività è completa. Se non chiami questo, il sistema spenderà la quantità massima di tempo preventivato per la tua app cercando di completare l'attività, che a sua volta spreca batteria e fa male alle prestazioni di altre app.
Quando l'applicazione deve gestire un'attività in background completata, il sistema chiamerà i delegati dell'estensione watchOS maniglia(_:)
metodo. Il parametro singolo di questo metodo è un insieme di WKRefreshBackgroundTask
oggetti che è necessario scorrere e elaborare di conseguenza.
All'interno del framework WatchKit, Apple fornisce le seguenti quattro sottoclassi concrete; watchOS trasferirà alla tua estensione delegata un'istanza della classe appropriata in base all'attività.
WKApplicationRefreshBackgroundTask
è un tipo di attività in background generale che non è specializzato per un particolare tipo di aggiornamento. Il caso d'uso più comune per questo tipo è per la pianificazione di altre attività. Ad esempio, puoi pianificare un aggiornamento in background per la tua app in un momento specifico della giornata ogni giorno. Quando il corrispondente WKApplicationRefreshBackgroundTask
l'oggetto viene quindi passato al delegato dell'estensione maniglia(_:)
metodo, è possibile creare un'attività di rete in background per scaricare alcuni dati per aggiornare il contenuto dell'app.WKSnapshotRefreshBackgroundTask
è un tipo di attività specifico per quando la tua app deve aggiornare la sua istantanea. Discuteremo più avanti istantanee in questo tutorial. Tutto quello che devi sapere per ora è che l'istantanea di un'app viene utilizzata come immagine di avvio e può anche essere visualizzata nel dock dell'utente (accessibile premendo il pulsante laterale). Si noti che questo tipo di attività in background ha un unico metodo di completamento delle attività, di cui parleremo in seguito.WKWatchConnectivityRefreshBackgroundTask
è un tipo di attività per quando hai trasferito i dati dal tuo iPhone al tuo orologio tramite il framework WatchConnectivity. Poiché questo framework fornisce un metodo per trasferire i dati di complicazione direttamente sull'orologio, questo tipo di attività in background corrispondente viene principalmente utilizzato per pianificare gli aggiornamenti di istantanee in risposta ai dati ricevuti dall'iPhone.WKURLSessionRefreshBackgroundTask
è un tipo di attività assegnato al delegato dell'estensione quando un'attività di rete in background è stata completata. In questo scenario, i metodi delegati impostati per URLSession
oggetto sono ancora chiamati, ed è qui che è necessario lavorare con i dati in modo appropriato. Il maniglia(_:)
il metodo dell'estensione delegato viene chiamato solo in modo che l'applicazione possa rispondere all'operazione di rete completata. Il WKURLSessionRefreshBackgroundTask
non ti dà accesso a URLSession
oggetto né i dati che sono stati trasferiti. L'unica proprietà extra che definisce è una stringa chiamata sessionIdentifier
che è possibile utilizzare per determinare quale processo di rete è stato completato.Esistono diversi modi per pianificare un aggiornamento in background in watchOS 3. Per una semplice applicazione o aggiornamento snapshot, è possibile utilizzare i seguenti due metodi su qualsiasi WKExtension
oggetto.
scheduleBackgroundRefresh (withPreferredDate: userInfo: scheduledCompletion :)
Al termine, questo metodo restituirà a WKApplicationRefreshBackgroundTask
oggetto al delegato di estensione. Il sistema watchOS tenterà di riattivare l'interno in background all'ora specificata da Data
parametro.
Si prega di notare che non è garantito che la vostra applicazione verrà svegliata in background in questo preciso momento. A causa di altre circostanze (ad esempio batteria residua, altre app in esecuzione e in memoria, ecc.) Il sistema potrebbe decidere di riattivare l'app in un secondo momento.
Il userInfo
il parametro sarà accessibile tramite uno qualsiasi degli oggetti task in background passati al delegato dell'estensione. Questo può essere particolarmente utile se è necessario inviare informazioni relative solo all'aggiornamento corrente. Infine, il scheduledCompletion
parametro può fornire un blocco di codice che verrà eseguito una volta che l'aggiornamento è stato programmato o è fallito a causa di un errore.
scheduleSnapshotRefresh (withPreferredDate: userInfo: scheduledCompletion :)
Questo metodo restituirà a WKSnapshotRefreshBackgroundTask
oggetto al delegato di estensione. I parametri per questo metodo sono identici a quando si pianifica un aggiornamento regolare dell'applicazione. L'unica differenza con questo metodo è il tipo di aggiornamento che si sta pianificando.
Di seguito è riportato un esempio di codice che potrebbe essere utilizzato in qualsiasi punto dell'applicazione WatchOS per pianificare un aggiornamento in background:
WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil) (errore: errore?) In if let error = error print ("Errore durante la pianificazione dell'aggiornamento in background: \ (errore .localizedDescription) ")
Come accennato in precedenza, a WKWatchConnectivityRefreshBackgroundTask
viene creato in risposta all'invio di dati all'orologio dal suo iPhone associato tramite le API WatchConnectivity.
L'ultimo tipo di attività in background, WKURLSessionRefreshBackgroundTask
, è programmato automaticamente dal sistema quando si crea un URLSession
oggetto con una configurazione di sfondo. Facendo questo da qualsiasi punto all'interno della tua app di controllo, il sistema pianifica automaticamente la richiesta e chiama i delegati dell'estensione maniglia(_:)
metodo quando completato. Il seguente codice di esempio contiene due funzioni all'interno di una classe di esempio. La prima funzione configura e avvia un'attività di download in background. Il secondo è un metodo delegato dichiarato in URLSessionDelegate
protocollo.
class SomeClass: URLSessionDelegate func beginDownloadTask () let config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") let session = URLSession (configurazione: config, delegate: self, delegateQueue: nil) let task = session.downloadTask (con: URL (string: "http://www.example.com/data")!) task.resume () func urlSession (_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) print ("La sessione è stata completata ")
In watchOS 3, gli sguardi delle app sono stati rimossi interamente dall'Apple Watch e sono stati sostituiti dal bacino. Si accede a questo dock premendo il pulsante laterale sull'orologio e contiene un numero illimitato di app che l'utente può configurare:
Se la tua app è stata inserita nel dock di un utente, sei responsabile di mantenere aggiornata la "istantanea" mostrata nel dock.
La tua app viene avvisata quando è necessario aggiornare la tua istantanea di a WKSnapshotBackgroundRefreshTask
essere passati nel tuo delegato di estensione maniglia(_:)
metodo. Quando ricevi questa notifica, oltre che l'estensione di WatchKit viene svegliata in background, il controller dell'interfaccia di root dell'app viene anche svegliato in background e fuori dallo schermo. In questo processo, i seguenti metodi sono chiamati in questo ordine:
sveglio (withContext :)
metodowillActivate ()
metodomaniglia(_:)
metodoIn qualsiasi momento in questi tre metodi, è possibile personalizzare l'aspetto dell'interfaccia della propria app per creare l'istantanea visualizzata nel dock.
Il passaggio finale dell'aggiornamento dell'istantanea avviene nel delegato dell'estensione maniglia(_:)
metodo. Come per gli altri tipi di attività in background, è necessario comunicare al sistema che l'attività è stata completata. Per gli aggiornamenti dell'istantanea, tuttavia, ciò viene fatto chiamando il setTaskCompleted (restoredDefaultState: estimatedSnapshotExpiration: userInfo :)
metodo sul WKSnapshotBackgroundRefreshTask
oggetto. Appena chiami questo metodo, watchOS cattura l'istantanea dell'interfaccia corrente della tua app e la mantiene in memoria fino al prossimo aggiornamento. Per comprendere meglio questo metodo, analizziamo tutti i suoi parametri:
restoredDefaultState
è solo un valore booleano che specifica se la tua istantanea è o meno il primo controller di interfaccia della tua app. Se si è passati a un'altra interfaccia, passare falso
per questo valore. estimatedSnapshotExpiration
è un Data
oggetto che specifica quando il sistema dovrebbe successivamente tentare di aggiornare l'istantanea della tua app. Se non è necessario pianificare un altro aggiornamento immediatamente, è possibile passare il nuovo Date.distantFuture
proprietà di classe.userInfo
è una raccolta di dati personalizzati e sarà passata al successivo WKSnapshotBackgroundRefreshTask
oggetto se stai pianificando un altro aggiornamento immediatamente.Il framework WatchConnectivity introdotto in watchOS 2 e iOS 9 sta anche acquisendo alcune nuove funzionalità con watchOS 3 e iOS 10.
Se un utente ha messo la complicazione dell'app sul quadrante, è possibile trasferire i dati dal telefono all'orologio fino a 50 volte in un solo giorno. Questo è fatto, come in iOS 9 e watchOS 2, tramite il WCSession
transferCurrentComplication (userInfo :)
metodo di istanza. Nuovo in watchOS 3 e iOS 10 è il WCSession
remainingComplicationUserInfoTransfers
proprietà, che ti dirà quanti trasferimenti rimangono per quel giorno.
Un altro nuovo WCSession
la proprietà aggiunta con gli aggiornamenti della piattaforma di quest'anno è la hasContentPending
proprietà, che è solo un valore booleano che indica se ci sono o meno dati da trasferire tra iPhone e Apple Watch.
Se vuoi saperne di più su WatchConnectivity e come funziona, puoi consultare le nostre esercitazioni precedenti che riguardano il framework.
Nel complesso, le nuove API di watchOS 3 consentono di aggiornare in modo rapido ed efficiente i contenuti dell'app Apple Watch in background. Man mano che più app adottano queste nuove API, le prestazioni delle app watchOS in generale miglioreranno notevolmente e creeranno un'esperienza utente molto migliore.
Il repository GitHub collegato contiene un progetto XOS watchOS 3 con un codice di esempio che mostra come è possibile pianificare e rispondere agli aggiornamenti in background nelle proprie app.
Come sempre, si prega di essere sicuri di lasciare i vostri commenti e feedback nei commenti qui sotto.