watchOS 2 Bakgrundsöverföringar och köer

Introduktion

Watch Connectivity är en ny kommunikationsram som släpps utöver iOS 9 och watchOS 2. Det är huvudsakliga syftet att enkelt och smidigt överföra information mellan en Apple Watch-applikation och dess föräldrars iOS-applikation.

Ramverket ger många olika funktioner. För några veckor sedan skrev Jorge Costa om möjligheten att skicka meddelanden mellan en IOS och en Apple Watch-applikation. I denna handledning zoomar vi in ​​på att överföra data i bakgrunden.

Möjligheten att skicka meddelanden är utformad för data som behövs omedelbart av den andra enheten. I motsats till detta är bakgrundsöverföringar bäst lämpade för större bitar av data som inte behövs omedelbart av motparten. Ett undantag till detta är med komplikationsinformation, som vi kommer att diskutera senare i denna handledning.

förutsättningar

Denna handledning kräver att du kör Xcode 7 på OS X 10.10 eller senare. Du måste också ladda ner startprojektet från GitHub.

1. Framework Setup

För att kunna använda klockans anslutningsram måste både din iOS- och watchOS-app ha en klass som överensstämmer med WCSessionDelegate protokollet och som konfigurerar standardinställningen korrekt WCSession. Metoderna för WCSessionDelegate protokoll hanterar mottagandet av all data via Watch Connectivity-ramen och gör att du kan ta kontroll över de nya data i din ansökan.

Öppna startprojektet i Xcode och redigera AppDelegate.swift. Överst lägg till följande importera påstående:

importera WatchConnectivity

Uppdatera sedan klassdefinitionen för AppDelegate klass för att få det att överensstämma med WCSessionDelegate protokoll.

klass AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

Vi förklarar också en egenskap av typ WCSession! i AppDelegate klass för att lagra en referens till standardvärdet WCSession objekt.

var session: WCSession!

Slutligen uppdatera applikations (_: didFinishLaunchingWithOptions :) metod som visas nedan.

func application (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = själv om WCSession.isSupported () session.activateSession () returnera true

applikations (_: didFinishLaunchingWithOptions :), Vi får en hänvisning till standardvärdet WCSession objekt, sätt sessionens delegat till din app AppDelegate instans och, om det stöds, aktivera sessionen. De isSupported klassmetod kontrollerar om huruvida motparten watchOS-appen för din iOS-app är installerad på en parad Apple Watch och kan skicka data.

Inställningen för watchOS-sidan är mycket lika. Öppna ExtensionDelegate.swift och ersätt dess innehåll med följande:

importera WatchKit import WatchConnectivity class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate var session: WCSession! func applicationDidFinishLaunching () session = WCSession.defaultSession () session.delegate = self session.activateSession () func applicationDidBecomeActive ()  func applicationWillResignActive () 

Du märker att vi inte ringer isSupported på WCSession klass innan du aktiverar sessionen. Detta beror på att denna metod alltid återvänder Sann på watchOS sidan.

För att kontrollera att allt fungerar korrekt, kör din Apple Watch-app på någon av de två simulatorerna som visas nedan.

Kör sedan din iOS-app på samma iPhone-simulatortyp du valde när du kör klockan.

När din iOS-app har startat, ska din Apple Watch-simulator bara gå tillbaka till klockans ansikte som visas på skärmdumpen nedan.

2. Sändning av data

Med standardvärdet WCSession objektet är korrekt konfigurerat, det är dags för oss att skicka några data mellan iOS och Apple Watch-programmet.

Öppna TableViewController.swift och lägg till följande rad kod i slutet av createNewItem (_ :) metod:

WCSession.defaultSession (). TransferUserInfo (post)

De transferUserInfo (_ :) Metoden accepterar en ordlista som enda parameter. När den här metoden har blivit kallad, läggs den användarinformationsordlista du har lagt till i kön av information som ska överföras.

Både iOS och watchOS arbetar tillsammans med varandra för att överföra informationen vid en lämplig tidpunkt. Det kombinerade systemet tittar på saker som appanvändning, batterilivslängd, huruvida den andra enheten används för tillfället etc. När systemet har överfört informationen, kommer appen på den andra enheten att utföra en delegerad återkallningsmetod nästa gång den lanseras.

Nu är det dags för oss att implementera mottagningssidan på Apple Watch. Öppna ExtensionDelegate.swift och lägg till följande metod till ExtensionDelegate klass:

func session (session: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> Invalidera om låter objekt = NSUserDefaults.standardUserDefaults (). objectForKey ("items") som? [NSDictionary] var newItems = items newItems.append (userInfo) NSUserDefaults.standardUserDefaults (). SetObject (newItems som AnyObject, forKey: "items") annars NSUserDefaults.standardUserDefaults (). SetObject ([userInfo] som AnyObject, forKey : "objekt")

Denna metod kommer att ringas så snart vi kör Apple Watch-programmet och när informationen har överförts framgångsrikt.

Observera att medan denna handledning endast visar ett exempel på överföring av information från iOS till watchOS, WCSession och WCSessionDelegate metoder beter sig exakt lika på båda plattformarna för bakgrundsöverföringar.

Med den här koden implementeras, kör din Apple Watch-app i simulatorn. Kör sedan iPhone-appen igen och tryck på knappen för att skapa ett nytt objekt.

Gå nu tillbaka till Apple Watch-simulatorn och tryck på Kommando-skift-H två gånger för att gå tillbaka till den senaste appen. Du ser att det objekt du just skapat visas på Apple Watch.

Observera att även om informationsöverföringen hände omedelbart mellan simulatorerna, i en verklig situation med fysiska enheter kommer det inte alltid att vara fallet.

3. Åtkomst till den väntande överföringskön

När din iOS-app fortfarande körs, avsluta Apple Watch-simulatorn från menyraden eller genom att trycka på Kommando-Q. Efter detta har du tryckt på knappen i din iOS-app för att skapa några fler objekt som visas nedan.

När du försöker överföra information med hjälp av Watch Connectivity-ramen läggs den till i en kö som gradvis rensas när information överförs. Denna kö kan nås och även överföringarna i kön kan nås.

Det här är användbart eftersom du kan se hur många artiklar som fortfarande är pågående och du kan till och med avbryta specifika överföringar om du behöver. De objekt du just skapat hålls för tillfället i användarinformationskön, eftersom Apple Watch för tillfället kopplas från moderenheten, vilket gör en överföring omöjlig.

Öppna AppDelegate.swift och lägg till följande kod i slutet av applikations (_: didFinishLaunchingWithOptions :):

låt överföringar = session.outstandingUserInfoTransfers om transfers.count> 0 let transfer = transfers.first! transfer.cancel ()

Med den här koden får vi tillgång till de enastående överföringarna av användarinformation och, om det finns minst en, avbryter den första överföringen. De WCSessionUserInfoTransfer föremål som returneras från outstandingUserInfoTransfers Egenskapen har också två skrivskyddade egenskaper som du kan komma åt:

  • användarinformation: Den här egenskapen lagrar ordlistan du överför.
  • överföring: Den här egenskapen lagrar ett booleskt värde och anger om användarinformationen för närvarande överförs.

Det finns inte mycket funktionalitet tillgänglig med enastående informationsöverföringar i Watch Connectivity-ramen, men beroende på din applikation kan vissa av dessa funktioner vara mycket användbara.

4. Övriga överföringsmetoder

I den här handledningen har vi endast täckt användarinformation bakgrundsöverföringar, men det finns några andra sätt att överföra data mellan enheter. Var och en av dessa metoder är utformade för ett visst syfte när de kommunicerar mellan en iPhone och en Apple Watch.

Applikationskontext

Här måste du överföra information mellan enheter där endast den senaste informationen är relevant. Du överför en enkel ordlista genom att ringa updateApplicationContext (_: error :) metod. De fel parameter i denna metod är en pekare till en NSError objekt som fylls med information om ett problem uppstår vid överföringen.

På mottagningssidan kan du implementera session (_: didReceiveApplicationContext :) metod eller alternativt få tillgång till applikationskontext via standardvärdet WCSession objekt receivedApplicationContext fast egendom.

Komplikationsinformation

Det här är det du behöver överföra en informationslista för en användare specifikt för din apps anpassade komplikation. Du kan bara skicka information från iOS-sidan och det här görs med transferCurrentComplicationUserInfo (_ :) metod.

Nyckelfaktorn mellan detta och transferUserInfo (_ :) Metoden som används tidigare i den här handledningen är att när du uppdaterar en komplikation försöker systemet alltid att överföra informationen omedelbart.

Observera att en överföring inte garanteras eftersom enheterna kan kopplas bort eller om din komplikation kan ha överskridit budgeten för bakgrundsutförande. Om en komplikationsinformation överföring inte kan slutföras läggs den till outstandingUserInfoTransfers kö där den kan ses och avbokas om det behövs.

Observera också att om en komplikationsinfoöverföring är i kön och du ringer till transferCurrentComplicationUserInfo (_ :) metod igen kommer den befintliga överföringen i köen att ogiltigförklaras och annulleras.

filer

Du kan till och med använda Watch Connectivity-ramen för att överföra filer mellan enheter. Detta görs via transferFile (_: metaData :) metod där den första parametern är en lokal NSURL till filen och den andra är en valfri ordlista, som innehåller ytterligare data som är associerade med den filen.

Som du förväntar dig hanteras mottagandet av den här filen med en metod av WCSessionDelegate protokollet, session (_: didReceiveFile :) metod för att vara exakt. I denna metod ges du en singel WCSessionFile objekt som innehåller en ny lokal URL till själva filen samt de metadata du överförde.

Som med användarinformation överföringar kan du också visa pågående eller filöverföringar som är igång via standardvärdet WCSession objekt outstandingFileTransfers fast egendom.

Slutsats

Sammantaget erbjuder Watch Connectivity-ramen ett mycket enkelt och lättanvänt gränssnitt för överföring av data mellan en ansluten iPhone och en Apple Watch. Ramverket möjliggör överföring av användarinformation, applikationskontext och komplikationsinfo ordböcker samt filer.

Du borde nu vara bekväm med både att skicka och ta emot information med hjälp av Watch Connectivity-ramen, samt hur du kan interagera med några utestående överföringar.

Som alltid, var noga med att lämna dina kommentarer och feedback i kommentarerna nedan.