watchOS 2 Kommunisere med en motpart

Helt siden utgivelsen av Apple Watch har utviklere diskutert og presentert teknikker for å overvinne begrensningene til watchOS 1. Utviklere har lurt på, for eksempel, hvordan man pålitelig kommuniserer mellom en watchOS-app og dens overordnede iOS-app og omvendt.

En rekke løsninger har vært tilgjengelig for å løse dette problemet, som for eksempel MMWormhole. Selvfølgelig har Apple vært godt klar over begrensningene til watchOS 1 og utgivelsen av watchOS 2 løser en rekke begrensninger av watchOS 1. Kommunikasjon mellom en watchOS 2 app og dens forelder iOS-app, for eksempel, har blitt mye enklere takk til introduksjonen av Watch Connectivity-rammen.

Se tilkobling

Watch Connectivity Framework gir flere måter å kommunisere mellom en iOS og en WatchOS 2 app. Med Watch Connectivity-rammen kan du oppdatere informasjon på en motpart, sende meldinger, overføre data i bakgrunnen, og til og med overføre filer. For å lære mer om alle rammeverkets funksjoner og evner, anbefaler jeg at du leser Apples dokumentasjon for rammevilkårene for Watch Connectivity.

I denne veiledningen vil jeg vise deg hvordan du utveksler data mellom en watchOS 2-app og dens overordnede iOS-app, og omvendt. APIen vi skal bruke for å oppnå dette er Sendmessage (_: replyHandler: Errorhandler :). Denne metoden lar utviklere overføre data mellom watchOS 2-appen og dens overordnede iOS-app.

Det er viktig å merke seg at iOS og watchOS 2-appen reagerer annerledes når Sendmessage (_: replyHandler: Errorhandler :) er påkalt. Hvis denne metoden påberopes av watchOS 2-appen, blir iOS-appen woken opp av operativsystemet. Hvis du sender data fra den overordnede iOS-appen til watchOS 2-appen, vil den sistnevnte ikke våkne opp. Dette er en viktig detalj å huske på.

Forutsetninger

Siden denne opplæringen handler om Apple Watch-utvikling, antar jeg at du allerede er kjent med iOS-utviklingen og Swift-programmeringsspråket. Watch Connectivity Framework er bare tilgjengelig på WatchOS 2, noe som betyr at du må ha den nyeste versjonen av Xcode installert, Xcode 7. Du kan laste ned Xcode fra Apples utvikler nettsted.

1. Prosjektoppsett

Åpen Xcode og velg Nytt> Prosjekt ...  fra Fil Meny. Gå til watchOS> Søknad, velg IOS App med WatchKit App prosjektmal og klikk neste. Gi navn på appen din SendMessageWatch, sett Språk til Fort, og enheter til iPhone. Fjern merkingen Inkluder varslingsscene og sørg for at hver avkrysningsboks nederst er avkrysset. Truffet neste og velg et sted for å lagre prosjektet ditt.

2. Opprette brukergrensesnittet

I dette trinnet legger vi til en etikett og en knapp i begge appene. Etiketten vil bli brukt til å vise meldingene vi sender mens knappen vil sende meldingen til motparten, iOS-appen eller watchOS 2-appen.

Vi starter med iOS-appen. Åpen Main.storyboard og legg til en etikett og en knapp. Deretter lager du et uttak for begge brukergrensesnittelementene, og legger til en handling for knappen. Nedenfor skjermbildet viser resultatet.

La oss nå fokusere på watchOS 2 app. Åpen Interface.storyboard og legg til en etikett og en knapp til scenen. Deretter åpne InterfaceController.swiftAssistent Editor og lag et uttak for etiketten og knappen, og legg til en handling for knappen.

Med brukergrensesnittet på plass, er det på tide å zoome inn på hovedemnet i denne opplæringen, sende meldinger fra iOS-appen til watchOS 2-appen, og omvendt.

3. Bruke Watch Connectivity Framework

Ved hjelp av Watch Connectivity-rammen for å utveksle meldinger, krever bruk av WCSession klasse. For at dette skal fungere, må både iOS-appen og watchOS 2-appen opprette og konfigurere en WCSession forekomst. Når sesjonen er konfigurert, kan vi kommunisere umiddelbart frem og tilbake.

klasse InterfaceController: WKInterfaceController, WCSessionDelegate var økt: WCSession! ...

Vi får en forekomst av WCSession klasse ved å ringe defaultSession klassemetode. Dette returnerer singleton-sesjonsobjektet for enheten. Vi må da sette sessionsdelegatet og aktivere økten.

Før vi konfigurerer og bruker WCSession objekt, vi må verifisere at WCSession klassen støttes på enheten. Vi gjør dette ved å ringe isSupported klassemetode på WCSession klasse. Vi gjør alt dette i willActivate metode av InterfaceController klasse. Noter det activateSession vil kaste et unntak dersom øktens delegat er nil. Med andre ord, rekkefølgen på de følgende utsagnene er viktig.

overstyr func willActivate () super.willActivate () hvis (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self session.activateSession ()

WatchOS 2-appen kan nå sende og motta meldinger. Med økten aktivert, trenger vi bare å påkalle Sendmessage (_: replyHandler: Errorhandler :) metode for å sende meldinger. Det første argumentet må være en ordbok av typen [String: AnyObject] og det burde ikke være nil.

De replyHandler er et lukke som aksepterer en ordbok av samme type. Denne ordlisten er svaret fra motparten. De Errorhandler er også et lukning, som kan være nil hvis du ikke trenger å ta noen feil.

Hvis vi treffer send-knappen på Apple Watch, vil den umiddelbart sende en Hei iPhone melding og iPhone vil svare med a Hei Watch budskap. Etter å ha trykket på send-knappen på iPhone, vil den sende et spørsmål Hei klokka, kan du snakke med meg? og Apple Watch vil svare med Ja.

Dette er hva implementeringen av sende melding Metoden skal se ut i InterfaceController.swift.

@IBAction func sendMessage () la messageToSend = ["Verdi": "Hei iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage // // håndtere og present meldingen på skjermen la verdi = answerMessage ["Value"] som ? String self.messageLabel.setText (verdi), errorHandler: error in // fange eventuelle feil her print (error))

For å håndtere meldingen på iOS-enheten, må vi implementere session (_: didReceiveMessage :) delegere metode for WCSessionDelegate protokoll, som påberopes når en melding mottas av motparten. Dette er hva implementeringen ser ut i InterfaceController.fort.

func session (session: WCSession, didReceiveMessage melding: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Feid) // håndtak mottatt melding la verdi = melding ["Verdi"] som? String // Bruk dette til å presentere umiddelbart på skjermen dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (verdi) // send et svar replyHandler (["Verdi": "Ja"])

Implementeringen av begge metodene ser veldig ut til iOS-appen. Med de ovennevnte implementeringer, prøv det ved å implementere sende melding og session (_: didReceiveMessage: replyHandler :) metoder. Dette er hva implementeringen av ViewController klassen skal se ut.

importere UIKit import WatchConnectivity klasse ViewController: UIViewController, WCSessionDelegate var økt: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (sender: AnyObject) // Send melding til WatchKit la messageToSend = ["Verdi": "Hei klokka, kan du snakke med meg?"] Session.sendMessage (messageToSend, replyHandler: replyMessage // // handle svaret la verdi = answerMessage ["Value"] som? String // bruk dispatch_asynch å presentere umiddelbart på skjermen dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value, errorHandler: feil i // fange eventuelle feil her print (error)) overstyre func viewDidLoad () super.viewDidLoad () // Gjør noe ekstra oppsett etter at du har lastet opp visningen, vanligvis fra en nib. hvis (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () overstyre func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Kast bort eventuelle ressurser som kan gjenopprettes.  // Swift func session (økt: WCSession, didReceiveMessage melding: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Feid) // håndtak mottatt melding la verdi = melding ["Verdi"] som? String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value // send et svar replyHandler (["Verdi": "Hello Watch"])

Bygg og kjør appene for å se det endelige resultatet. Når du trykker på knappen på Apple Watch, bør det vises en melding på den parrede iPhone som kjører iOS-appen. Når du klikker på knappen i iOS-appen, bør det vises en melding på Apple Watch som kjører watchOS 2-appen.

4. Utforsker WCSessionDelegate protokoll

Delegemetoden vi implementerte for å motta meldingen, har en enklere søsken, session (_: didReceiveMessage :). Denne metoden kalles når Sendmessage (_: replyHandler: Errorhandler :) er påkalt uten svarbehandler. Dette indikerer ganske enkelt at appen som sender meldingen, ikke forventer et svar.

I tillegg til å sende en ordbok til en motpart, er det også mulig å sende en NSData objekt ved hjelp av sendMessageData (_: replyHandler: Errorhandler :) metode. Motparten mottar meldingen gjennom session (_: didReceiveMessageData :) og session (_: didReceiveMessageData: replyHandler :) delegere metoder til WCSessionDelegate protokollen.

Konklusjon

Hvis du trenger å kommunisere umiddelbart med en motpart, er Watch Connectivity-rammen det beste valget på watchOS 2. Meldingene er i kø og leveres i samme rekkefølge som de ble sendt inn i.

The Watch Connectivity Framework har mye mer å tilby enn det som er dekket i denne opplæringen. I fremtidige opplæringsprogrammer vil vi dykke dypere inn i dette nye rammeverket for å utforske sine funksjoner og evner videre.