watchOS 2 communiceren met een tegenpartij

Sinds de release van Apple Watch discussiëren en presenteren ontwikkelaars technieken om de beperkingen van watchOS te overwinnen. 1. Ontwikkelaars hebben zich bijvoorbeeld afgevraagd hoe betrouwbaar te communiceren tussen een watchOS-app en de bijbehorende iOS-app, en omgekeerd.

Er zijn een aantal oplossingen beschikbaar om dit probleem op te lossen, zoals MMWormhole. Natuurlijk was Apple goed op de hoogte van de beperkingen van watchOS 1 en de release van watchOS 2 lost een aantal van de beperkingen van watchOS 1 op. Communiceren tussen een watchOS 2-app en de bijbehorende iOS-app is bijvoorbeeld veel eenvoudiger geworden dankzij bij de introductie van het Watch Connectivity-framework.

Bekijk connectiviteit

Het Watch Connectivity-framework biedt verschillende manieren om te communiceren tussen een iOS- en een watchOS 2-app. Met het framework Watch Connectivity kunt u informatie over een tegenpartij bijwerken, berichten verzenden, gegevens op de achtergrond overbrengen en zelfs bestanden overbrengen. Om meer te weten te komen over alle functies en mogelijkheden van het framework, raad ik aan om de documentatie van Apple te bekijken voor het kader voor Watch Connectivity.

In deze zelfstudie laat ik u zien hoe u gegevens kunt uitwisselen tussen een watchOS 2-app en de bijbehorende iOS-app, en vice versa. De API die we gebruiken om dit te bereiken is sendMessage (_: replyHandler: errorHandler :). Met deze methode kunnen ontwikkelaars gegevens overbrengen tussen de watchOS 2-app en de bijbehorende iOS-app.

Het is belangrijk om te weten dat de iOS- en WatchOS 2-app anders reageren wanneer sendMessage (_: replyHandler: errorHandler :) wordt aangeroepen. Als deze methode wordt aangeroepen door de watchOS 2-app, wordt de iOS-app gewekt door het besturingssysteem. Als u echter gegevens van de oorspronkelijke iOS-app naar de watchOS 2-app verzendt, wordt deze laatste niet meer wakker. Dit is een belangrijk detail om in gedachten te houden.

voorwaarden

Aangezien deze zelfstudie gaat over de ontwikkeling van Apple Watch, ga ik ervan uit dat u al bekend bent met de ontwikkeling van iOS en de programmeertaal van Swift. Het Watch Connectivity-framework is alleen beschikbaar op watchOS 2, wat betekent dat je de nieuwste versie van Xcode geïnstalleerd hebt, Xcode 7. Je kunt Xcode downloaden van de website van Apple voor ontwikkelaars.

1. Projectinstelling

Open Xcode en selecteer Nieuw> Project ...  van de het dossier menu. Ga naar watchOS> Toepassing, selecteer de iOS-app met WatchKit-app projectsjabloon en klik volgende. Geef uw app een naam SendMessageWatch, reeks Taal naar Snel, en apparaten naar iPhone. Haal het vinkje weg Inclusief meldingencene en zorg ervoor dat elk selectievakje onderin niet is aangevinkt. Raken volgende en kies een locatie om uw project op te slaan.

2. De gebruikersinterface maken

In deze stap zullen we een label en een knop aan beide apps toevoegen. Het label wordt gebruikt om de berichten weer te geven die we verzenden terwijl de knop het bericht verzendt naar de tegenpartij, de iOS-app of de watchOS 2-app.

We beginnen met de iOS-app. Open Main.storyboard en voeg een label en een knop toe. Maak vervolgens een stopcontact voor beide elementen van de gebruikersinterface en voeg een actie toe voor de knop. De screenshot hieronder toont het resultaat.

Laten we ons nu concentreren op de watchOS 2-app. Open Interface.storyboard en voeg een label en een knop toe aan de scène. Open vervolgens InterfaceController.swift in de Assistent redacteur en maak een uitweg voor het label en de knop en voeg een actie toe voor de knop.

Met de gebruikersinterface op zijn plaats, is het tijd om in te zoomen op het hoofdonderwerp van deze tutorial, het verzenden van berichten van de iOS-app naar de watchOS 2-app en vice versa.

3. Gebruik van het Watch Connectivity Framework

Als u het kader Watch Connectivity gebruikt om berichten uit te wisselen, moet u de WCSession klasse. Om dit te laten werken, moeten zowel de iOS-app als de watchOS 2-app een maken en configureren WCSession aanleg. Wanneer de sessie is geconfigureerd, kunnen we onmiddellijk heen en weer communiceren.

class InterfaceController: WKInterfaceController, WCSessionDelegate var session: WCSession! ...

We krijgen een exemplaar van de WCSession klasse door het defaultSession klassemethode. Hiermee wordt het singleton-sessieobject voor het apparaat geretourneerd. Vervolgens moeten we de gedelegeerde van de sessie instellen en de sessie activeren.

Voordat we het. Configureren en gebruiken WCSession object, moeten we verifiëren dat de WCSession klasse wordt ondersteund op het apparaat. We doen dit door het wordt ondersteund klassenmethode op de WCSession klasse. We doen dit allemaal in de willActivate methode van de InterfaceController klasse. Let daar op activateSession gooit een uitzondering als de gedelegeerde van de sessie is nul. Met andere woorden, de volgorde van de onderstaande uitspraken is belangrijk.

override func willActivate () super.willActivate () if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self session.activateSession ()

De watchOS 2-app kan nu berichten verzenden en ontvangen. Als de sessie is geactiveerd, hoeven we alleen de sendMessage (_: replyHandler: errorHandler :) methode om berichten te verzenden. Het eerste argument moet een woordenboek van het type zijn [String: AnyObject] en dat zou niet zo moeten zijn nul.

De replyHandler is een sluiting die een woordenboek van hetzelfde type accepteert. Dit woordenboek is het antwoord van de tegenpartij. De errorHandler is ook een afsluiting, wat kan zijn nul als u geen fouten hoeft te ontdekken.

Als we op de knop verzenden op de Apple Watch drukken, wordt deze onmiddellijk verzonden Hallo iPhone bericht en de iPhone antwoordt met een Hallo kijken bericht. Nadat je op de verzendknop op de iPhone hebt gedrukt, wordt er een vraag verzonden Hallo kijk, kun je met me praten? en de Apple Watch zal antwoorden Ja.

Dit is wat de implementatie van de bericht versturen methode zou eruit moeten zien als in InterfaceController.swift.

@IBAction func sendMessage () let messageToSend = ["Waarde": "Hello iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage in // handle en presenteer het bericht op het scherm laat value = replyMessage ["Waarde"] als ? String self.messageLabel.setText (value), errorHandler: error in // vang hier eventuele fouten op print (error))

Om het bericht op het iOS-apparaat af te handelen, moeten we het sessie (_: didReceiveMessage :) gedelegeerde methode van de WCSessionDelegate protocol, dat wordt aangeroepen wanneer een bericht wordt ontvangen door de tegenpartij. Dit is hoe de implementatie eruit ziet InterfaceController.snel.

func sessie (sessie: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // handle ontvangen bericht laat waarde = bericht ["Waarde"] als? String // gebruik dit om onmiddellijk op het scherm dispatch_async te presenteren (dispatch_get_main_queue ()) self.messageLabel.setText (value) // stuur antwoord AntwoordHandler (["Waarde": "Ja"])

De implementatie van beide methoden lijkt erg op de iOS-app. Met de bovenstaande implementaties, probeer het eens door het bericht versturen en sessie (_: didReceiveMessage: replyHandler :) methoden. Dit is wat de implementatie van de ViewController klasse zou eruit moeten zien.

import UIKit import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate var session: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (afzender: AnyObject) // Stuur bericht naar WatchKit laat messageToSend = ["Waarde": "Hallo kijken, kunt u met mij praten?"] Session.sendMessage (messageToSend, replyHandler: replyMessage in // handle het antwoord laat value = replyMessage ["Waarde"] als? String // gebruik dispatch_asynch om onmiddellijk te presenteren op scherm dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value, errorHandler: error in // vang eventuele fouten hier print (fout)) overschrijven func viewDidLoad () super.viewDidLoad () // Voer een extra setup uit nadat de weergave is geladen, meestal vanaf een punt. if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () overschrijven func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Beschikken over bronnen die kunnen worden nagebootst.  // Swift-func-sessie (sessie: WCSession, didReceiveMessage-bericht: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // greep ontvangen bericht laat waarde = bericht ["Waarde"] als? String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value // stuur antwoord AntwoordHandler (["Waarde": "Hello Watch"])

Bouw en voer de apps uit om het eindresultaat te zien. Wanneer u op de knop op Apple Watch tikt, verschijnt er een bericht op de gekoppelde iPhone waarop de iOS-app wordt uitgevoerd. Wanneer u op de knop van de iOS-app tikt, verschijnt er een bericht op Apple Watch waarop de watchOS 2-app wordt uitgevoerd.

4. Het verkennen van de WCSessionDelegate Protocol

De gedelegeerde methode die we hebben geïmplementeerd om het bericht te ontvangen, heeft een eenvoudiger broer of zus, sessie (_: didReceiveMessage :). Deze methode wordt genoemd wanneer sendMessage (_: replyHandler: errorHandler :) wordt aangeroepen zonder een antwoordbehandelaar. Dit geeft eenvoudig aan dat de app die het bericht verzendt, geen reactie verwacht.

Naast het verzenden van een woordenboek naar een tegenpartij, is het ook mogelijk om een NSData object met behulp van de sendMessageData (_: replyHandler: errorHandler :) methode. De tegenpartij ontvangt het bericht via de sessie (_: didReceiveMessageData :) en sessie (_: didReceiveMessageData: replyHandler :) delegeren methoden van de WCSessionDelegate protocol.

Conclusie

Als u onmiddellijk met een tegenpartij wilt communiceren, is het raamwerk voor Watch Connectivity de beste keuze op watchOS 2. De berichten worden in de wachtrij geplaatst en afgeleverd in dezelfde volgorde waarin ze zijn verzonden.

Het Watch Connectivity-framework heeft veel meer te bieden dan wat in deze tutorial aan bod komt. In toekomstige zelfstudies zullen we dieper ingaan op dit nieuwe kader om de functies en mogelijkheden ervan verder te verkennen.