Ända sedan release av Apple Watch har utvecklare diskuterat och presenterat tekniker för att övervinna begränsningarna för watchOS 1. Utvecklare har undrat sig, till exempel, hur man på ett tillförlitligt sätt kommunicerar mellan en watchOS-app och dess föräldra-iOS-app och vice versa.
Ett antal lösningar har varit tillgängliga för att lösa detta problem, såsom MMWormhole. Självklart har Apple varit medveten om begränsningarna av watchOS 1 och frisläppandet av watchOS 2 löser ett antal begränsningar för watchOS 1. Kommunikation mellan en watchOS 2 app och dess förälder iOS-app har till exempel blivit mycket enklare tack till introduktionen av Watch Connectivity-ramen.
Klockans anslutningsramverk ger flera sätt att kommunicera mellan en iOS och en watchOS 2-app. Med ramen för Watch Connectivity kan du uppdatera information på en motpart, skicka meddelanden, överföra data i bakgrunden och till och med överföra filer. För att lära mig mer om alla ramverkets funktioner och funktioner rekommenderar jag att du besöker Apples dokumentation för ramen för Watch Connectivity.
I denna handledning kommer jag att visa dig hur du byter data mellan en watchOS 2 app och dess förälder iOS app och vice versa. API: n vi använder för att uppnå detta är sendmessage (_: replyHandler: errorhandler :)
. Med den här metoden kan utvecklare överföra data mellan watchOS 2-appen och dess moderna iOS-app.
Det är viktigt att notera att iOS och watchOS 2 app svarar annorlunda när sendmessage (_: replyHandler: errorhandler :)
åberopas. Om denna metod åberopas av watchOS 2 app, väckas iOS-appen av operativsystemet. Om du skickar data från moderna iOS-app till watchOS 2-appen kommer den senare inte att vakna. Detta är en viktig detalj att tänka på.
Eftersom denna handledning handlar om Apple Watch-utveckling antar jag att du redan är bekant med IOS-utveckling och Swift-programmeringsspråket. Klockans anslutningsramar är endast tillgängliga på watchOS 2, vilket innebär att du måste ha den senaste versionen av Xcode installerad, Xcode 7. Du kan ladda ner Xcode från Apples utvecklarwebbplats.
Öppna Xcode och välj Nytt> Projekt ... från Fil meny. Gå till watchOS> Application, Välj IOS App med WatchKit App projektmall och klicka Nästa. Namn din app SendMessageWatch, uppsättning Språk till Snabb, och enheter till iPhone. Avmarkera Inkludera anmälningsplats och se till att alla kryssrutor längst ner är avmarkerade. Träffa Nästa och välj en plats för att spara ditt projekt.
I det här steget lägger vi till en etikett och en knapp i båda programmen. Etiketten kommer att användas för att visa de meddelanden som vi skickar medan knappen skickar meddelandet till motparten, iOS-appen eller watchOS 2-appen.
Vi börjar med iOS-appen. Öppna Main.storyboard och lägg till en etikett och en knapp. Skapa sedan ett uttag för båda användargränssnittet, och lägg till en åtgärd för knappen. Nedanstående skärmdump visar resultatet.
Låt oss nu fokusera på watchOS 2 app. Öppna Interface.storyboard och lägg till en etikett och en knapp på scenen. Nästa, öppna InterfaceController.swift i Assistent Editor och skapa ett uttag för etiketten och knappen, och lägg till en åtgärd för knappen.
Med användargränssnittet på plats är det dags att zooma in på huvudämnet i denna handledning, skicka meddelanden från iOS-appen till watchOS 2-appen och vice versa.
Använda Watch Connectivity-ramen för att utbyta meddelanden kräver användning av WCSession
klass. För att detta ska fungera måste både iOS-appen och watchOS 2-appen skapa och konfigurera en WCSession
exempel. När sessionen är konfigurerad kan vi kommunicera omedelbart fram och tillbaka.
klass InterfaceController: WKInterfaceController, WCSessionDelegate var session: WCSession! ...
Vi får en instans av WCSession
klass genom att ringa defaultSession
klassmetod. Detta returnerar singleton-sessionobjektet för enheten. Vi måste sedan ställa in sessionens delegat och aktivera sessionen.
Innan vi konfigurerar och använder WCSession
objekt, vi måste verifiera att WCSession
klassen stöds på enheten. Vi gör detta genom att ringa isSupported
klassmetod på WCSession
klass. Vi gör allt detta i willActivate
metod för InterfaceController
klass. Anteckna det activateSession
kommer att göra ett undantag om sessionens delegat är noll
. Med andra ord är ordningen i nedanstående uttalanden viktig.
åsidosätta func willActivate () super.willActivate () om (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self session.activateSession ()
WatchOS 2 app kan nu skicka och ta emot meddelanden. Med sessionen aktiverad behöver vi bara anropa sendmessage (_: replyHandler: errorhandler :)
Metod för att skicka meddelanden. Det första argumentet måste vara en ordbok av typen [String: AnyObject]
och det borde inte vara noll
.
De replyHandler
är en förslutning som accepterar en ordlista av samma typ. Denna ordlista är svaret från motparten. De errorhandler
är också en förslutning som kan vara noll
om du inte behöver ta några fel.
Om vi träffar sändningsknappen på Apple Watch skickas det omgående till en Hej iPhone meddelandet och iPhone kommer att svara med a Hej klocka meddelande. Efter att ha tryckt på skicka-knappen på iPhone skickar den en fråga Hej klocka, kan du prata med mig? och Apple Watch kommer att svara med Ja.
Detta är vad genomförandet av skicka meddelande
Metoden ska se ut i InterfaceController.swift.
@IBAction func sendMessage () let messageToSend = ["Värde": "Hej iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage // // hantera och presentera meddelandet på skärmen låt värdet = svarMessage ["Value"] som ? String self.messageLabel.setText (värde), errorHandler: error in // fånga några fel här print (error))
För att hantera meddelandet på iOS-enheten måste vi implementera session (_: didReceiveMessage :)
delegera metod för WCSessionDelegate
protokoll, som åberopas när ett meddelande mottas av motparten. Så här ser implementeringen ut InterfaceController.snabb.
func session (session: WCSession, didReceiveMessage meddelande: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // hantera mottaget meddelande låt värde = meddelande ["Värde"] som? String // använd detta för att presentera omedelbart på skärmen dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (värde) // skicka ett svar replyHandler (["Value": "Yes"])
Genomförandet av båda metoderna ser mycket ut för iOS-appen. Med ovanstående implementeringar, ge det ett försök genom att implementera skicka meddelande
och session (_: didReceiveMessage: replyHandler :)
metoder. Detta är vad genomförandet av ViewController
klassen ska se ut.
importera UIKit importera WatchConnectivity klass ViewController: UIViewController, WCSessionDelegate var session: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (avsändare: AnyObject) // Skicka meddelande till WatchKit let messageToSend = ["Value": "Hej klocka, kan du prata med mig?"] Session.sendMessage (messageToSend, replyHandler: replyMessage // // handle svaret låt värdet = answerMessage ["Value"] som? String // använd dispatch_asynch för att presentera omedelbart på skärmen dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value, errorHandler: error in // fånga några fel här skriv ut (fel)) åsidosätta func viewDidLoad () super.viewDidLoad () // Gör någon ytterligare inställning efter att ha laddat visningen, vanligtvis från en spets. om (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () åsidosätta func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Kassera alla resurser som kan återskapas. // Swift func session (session: WCSession, didReceiveMessage meddelande: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // hantera mottaget meddelande låt värde = meddelande ["Värde"] som? String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value // skicka ett svar replyHandler (["Value": "Hello Watch"])
Bygg och kör programmen för att se det slutliga resultatet. När du trycker på knappen på Apple Watch, ska ett meddelande visas på den parade iPhone som kör iOS-appen. När du trycker på knappen i iOS-appen ska ett meddelande visas på Apple Watch som kör watchOS 2-appen.
WCSessionDelegate
ProtokollDen delegatmetod vi genomförde för att få meddelandet har en enklare syskon, session (_: didReceiveMessage :)
. Denna metod kallas när sendmessage (_: replyHandler: errorhandler :)
åberopas utan en svarhanterare. Detta indikerar helt enkelt att appen som skickar meddelandet inte förväntar sig ett svar.
Förutom att skicka en ordlista till en motsvarighet är det också möjligt att skicka en NSData
objekt med hjälp av sendMessageData (_: replyHandler: errorhandler :)
metod. Motparten mottar meddelandet genom session (_: didReceiveMessageData :)
och session (_: didReceiveMessageData: replyHandler :)
delegera metoder för WCSessionDelegate
protokoll.
Om du behöver kommunicera omedelbart med en motpart, är Watch Connectivity-ramverket det bästa valet på watchOS 2. Meddelandena är i kö och levereras i samma ordning som de skickades in.
The Watch Connectivity Framework har mycket mer att erbjuda än vad som omfattas av denna handledning. I framtida tutorials kommer vi att dyka djupare in i denna nya ram för att ytterligare utforska dess funktioner och funktioner.