watchOS 2 Bakgrunnsoverføringer og køer

Introduksjon

Watch Connectivity er et nytt kommunikasjonsramme utgitt sammen med iOS 9 og watchOS 2. Hovedformålet er å enkelt og sømløst overføre informasjon mellom et Apple Watch-program og dets overordnede iOS-program.

Rammen gir mange forskjellige funksjoner. For noen uker siden skrev Jorge Costa om muligheten til å sende meldinger mellom en IOS og en Apple Watch-applikasjon. I denne veiledningen vil vi zoome inn på overføring av data i bakgrunnen.

Evnen til å sende meldinger er laget for data som trengs umiddelbart av den andre enheten. I kontrast er bakgrunnsoverføringene best egnet for større biter av data som ikke er nødvendig umiddelbart av motparten. Et unntak fra dette er med komplikasjonsinformasjon, som vi diskuterer senere i denne opplæringen.

Forutsetninger

Denne opplæringen krever at du kjører Xcode 7 på OS X 10.10 eller senere. Du må også laste ned startprosjektet fra GitHub.

1. Rammeoppsett

For å kunne bruke Watch Connectivity-rammen, må både din iOS og watchOS-app ha en klasse som samsvarer med WCSessionDelegate protokollen og som riktig konfigurerer standardinnstillingen WCSession. Metodene til WCSessionDelegate protokollen håndterer mottak av alle data via Watch Connectivity-rammen og lar deg ta kontroll over de nye dataene i søknaden din.

Åpne startprosjektet i Xcode og rediger AppDelegate.swift. På toppen, legg til følgende importere uttalelse:

importere WatchConnectivity

Deretter oppdaterer du klassens definisjon av AppDelegate klasse for å gjøre det i overensstemmelse med WCSessionDelegate protokollen.

klasse AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

Vi erklærer også en eiendom av typen WCSession! i AppDelegate klasse for å lagre en referanse til standard WCSession gjenstand.

var økt: WCSession!

Endelig oppdaterer du applikasjons (_: didFinishLaunchingWithOptions :) metode som vist nedenfor.

func application (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = selv hvis WCSession.isSupported () session.activateSession () returnerer sann

applikasjons (_: didFinishLaunchingWithOptions :), Vi får en referanse til standard WCSession objekt, sett inn øktens delegat til appen din AppDelegate forekomst og, hvis støttet, aktivere økten. De isSupported klassemetoden sjekker for å se om motparten watchOS-appen for iOS-appen din er installert på en parret Apple Watch og kan sende data.

Oppsettet for watchOS-siden er veldig lik. Åpen ExtensionDelegate.swift og erstatt innholdet med følgende:

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

Du vil merke at vi ikke ringer isSupported på WCSession klasse før du aktiverer økten. Dette skyldes at denne metoden alltid vender tilbake ekte på watchOS side.

For å kontrollere at alt fungerer som det skal, kjør Apple Watch-appen på en av de to simulatorene som vist nedenfor.

Deretter kjører du iOS-appen på samme iPhone-simulatortype du valgte når du kjører watch-appen.

Når iOS-appen din har lansert, bør Apple Watch-simulatoren bare gå tilbake til klokkeoverflaten som vist på skjermbildet nedenfor.

2. Sende data

Med standard WCSession objektet er riktig konfigurert, er det på tide å sende noen data mellom iOS og Apple Watch-applikasjonen.

Åpen TableViewController.swift og legg til følgende linje av kode på slutten av createNewItem (_ :) metode:

WCSession.defaultSession (). TransferUserInfo (pos)

De transferUserInfo (_ :) Metoden aksepterer en ordbok som sin eneste parameter. Når denne metoden er blitt kalt, legges brukerinformasjonsordlisten du har lagt til i køen av informasjonen som skal overføres.

Både iOS og watchOS jobber sammen med hverandre for å overføre informasjonen til en passende tid. Det kombinerte systemet ser på ting som appbruk, batterilevetid, om den andre enheten er i bruk eller ikke. Når systemet har overført informasjonen, vil appen på den andre enheten utføre en tilbakekallingsmetode for delegert neste gang det er lansert.

Nå er det på tide for oss å implementere mottakersiden på Apple Watch. Åpen ExtensionDelegate.swift og legg til følgende metode til ExtensionDelegate klasse:

func session (session: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> Ugyldig hvis la ting = NSUserDefaults.standardUserDefaults (). objectForKey ("items") som? [NSDictionary] var newItems = items newItems.append (userInfo) NSUserDefaults.standardUserDefaults (). SetObject (newItems as AnyObject, forKey: "items") ellers NSUserDefaults.standardUserDefaults (). SetObject ([userInfo] som AnyObject, forKey : "elementer")

Denne metoden vil bli kalt så snart vi kjører Apple Watch-programmet, og når informasjonen er overført, vellykket.

Vær oppmerksom på at mens denne opplæringen bare viser et eksempel på overføring av informasjon fra iOS til watchOS, vil WCSession og WCSessionDelegate metoder oppfører seg nøyaktig det samme på begge plattformene for bakgrunnsoverføringer.

Med denne koden implementert, kjør Apple Watch-appen din i simulatoren. Deretter kjører du iPhone-appen igjen og trykker på knappen for å opprette et nytt element.

Gå nå tilbake til Apple Watch-simulatoren og trykk Kommando-Skift-H to ganger for å gå tilbake til den nyeste appen. Du ser at elementet du nettopp har opprettet, vises på Apple Watch.

Merk at mens informasjonsoverføringen skjedde umiddelbart mellom simulatorene, i en ekte situasjon med fysiske enheter, vil dette ikke alltid være tilfelle.

3. Få tilgang til den ventende overføringskøen

Når iOS-appen din fortsatt kjører, avslutter du Apple Watch-simulatoren fra menylinjen, eller ved å trykke Kommando-Q. Etter å ha gjort dette, trykker du på knappen i iOS-appen din for å lage noen flere elementer som vist nedenfor.

Når du forsøker å overføre informasjon ved hjelp av Watch Connectivity-rammen, blir den lagt til i en kø som gradvis slettes når informasjon overføres. Denne køen er tilgjengelig, og også overføringene i køen kan nås.

Dette er nyttig, fordi du kan se hvor mange elementer som fortsatt er ventende, og du kan til og med avbryte bestemte overføringer hvis du trenger det. Elementene du nettopp har opprettet, holdes for øyeblikket i brukerinformasjonskøen, fordi Apple Watch er for øyeblikket frakoblet foreldreenheten, noe som gjør det umulig å overføre.

Åpen AppDelegate.swift og legg til følgende kode på slutten av applikasjons (_: didFinishLaunchingWithOptions :):

la overføringer = session.outstandingUserInfoTransfers hvis transfers.count> 0 la transfer = transfers.first! transfer.cancel ()

Med denne koden får vi tilgang til de utestående brukeropplysningene, og hvis det er minst én, avbryter den første overføringen. De WCSessionUserInfoTransfer gjenstander returnert fra outstandingUserInfoTransfers Egenskapen har også to skrivebeskyttede egenskaper som du kan få tilgang til:

  • brukerinformasjon: Denne egenskapen lagrer ordboken du overfører.
  • overføre: Denne egenskapen lagrer en boolsk verdi og indikerer om brukerinformasjonen for tiden overføres.

Det er ikke mye funksjonalitet tilgjengelig med utestående informasjonsoverføringer i Watch Connectivity-rammen, men avhengig av søknaden din, kan noen av disse funksjonene være svært nyttige.

4. Andre overføringsmetoder

I denne opplæringen har vi bare dekket brukerinformasjon bakgrunnsoverføringer, men det er noen andre måter å overføre data mellom enheter på. Hver av disse metodene er designet for et bestemt formål når det kommuniseres mellom en iPhone og en Apple Watch.

Søknadskontekst

Det er her du må overføre informasjon mellom enheter der bare den nyeste informasjonen er relevant. Du overfører en enkelt ordbok ved å ringe updateApplicationContext (_: feil :) metode. De feil parameter i denne metoden er en peker til en NSError objekt, som vil bli fylt med informasjon hvis det oppstår et problem med overføringen.

På mottakersiden kan du implementere session (_: didReceiveApplicationContext :) metode eller alternativt få tilgang til applikasjonskonteksten via standardinnstillingen WCSession objektets receivedApplicationContext eiendom.

Komplikasjonsinformasjon

Det er her du må overføre en enkelt bruker info ordbok spesielt for appens tilpassede komplikasjon. Du kan bare sende informasjon fra iOS-siden, og dette gjøres med transferCurrentComplicationUserInfo (_ :) metode.

Hovedforskjellen mellom dette og transferUserInfo (_ :) Metoden som ble brukt tidligere i denne opplæringen er at når du oppdaterer en komplikasjon, forsøker systemet alltid å overføre informasjonen umiddelbart.

Vær oppmerksom på at en overføring ikke garanteres fordi enhetene kan kobles fra eller komplikasjonen din kan ha overskredet budsjettet for bakgrunnsutførelse. Hvis en komplisert informasjonsoverføring ikke kan fullføres, legges den til outstandingUserInfoTransfers kø hvor den kan sees og kanselleres om nødvendig.

Vær også oppmerksom på at hvis en komplikasjonsinfooverføring er i køen, og du ringer til transferCurrentComplicationUserInfo (_ :) metode igjen vil den eksisterende overføringen i køen bli ugyldiggjort og kansellert.

filer

Du kan til og med bruke Watch Connectivity-rammen for å overføre filer mellom enheter. Dette gjøres via transferFile (_: Metadata :) metode der den første parameteren er lokal NSURL til filen og den andre er en valgfri ordbok, som inneholder tilleggsdata knyttet til den filen.

Som du forventer, blir mottak av denne filen håndtert av en metode av WCSessionDelegate protokoll, den session (_: didReceiveFile :) metode for å være presis. I denne metoden får du en enkelt WCSessionFile objekt som inneholder en ny lokal nettadresse til selve filen, samt metadataene du overførte.

Som med overføringer av brukerinfo, kan du også se på ventende eller filoverføringer som er i gang via standardinnstillingen WCSession objektets outstandingFileTransfers eiendom.

Konklusjon

Samlet sett gir Watch Connectivity-rammen et veldig enkelt og brukervennlig grensesnitt for å overføre data mellom en tilkoblet iPhone og en Apple Watch. Rammen gjør det mulig å overføre brukerinformasjon, applikasjonskontekst og komplikasjonsinformasjon ordbøker samt filer.

Du bør nå være komfortabel med både å sende og motta informasjon ved hjelp av Watch Connectivity-rammen, samt hvordan du kan samhandle med eventuelle utestående overføringer.

Som alltid, vær så snill å legge igjen dine kommentarer og tilbakemeldinger i kommentarene nedenfor.