Med den kommende watchOS 3 oppdateringen til alle Apple Watch-enheter, vil ytelsen til mange watch-applikasjoner bli betydelig bedre. Dette skyldes hovedsakelig de nye former for bakgrunnsutførelse som watchOS-apper kan benytte seg av for å oppdatere innholdet med jevne mellomrom og alltid ha den nyeste informasjonen klar til å bli sett av brukeren.
I denne opplæringen skal jeg vise deg hvordan du kan bruke de nye WatchKit-APIene i watchOS 3 for å få ditt eget program til å bruke disse nye bakgrunnsoppgaver. Det er viktig å merke seg at selv om appen din er konfigurert riktig for å støtte denne bakgrunnen, oppdateres, kan det hende at systemet ikke lar appen kjøre i bakgrunnen avhengig av en bestemt brukers konfigurasjon..
Denne opplæringen krever at du kjører Xcode 8 på OS X El Capitan eller senere.
Den første viktige nye klassen i watchOS 3 er WKRefreshBackgroundTask
klasse. Dette er en abstrakt klasse som du ikke bør underklasse eller skape forekomster av deg selv. Det definerer bare en eiendom, brukerinformasjon
, som kan lagre ekstra informasjon knyttet til bakgrunnsoppgaven. Det definerer også en enkelt metode, setTaskCompleted ()
, som du må ringe deg selv for å fortelle systemet at oppgaven er fullført. Hvis du ikke ringer til dette, vil systemet bruke maksimal tid på budsjettert til appen din, og prøver å fullføre oppgaven, som i sin tur kaster bort batteriet og gjør vondt til andre apper.
Når søknaden din skal håndtere en bakgrunnsoppgave som er fullført, vil systemet ringe til din watchOS-utvidelsesdelegate håndtak(_:)
metode. Denne metodenes enkeltparameter er et sett av WKRefreshBackgroundTask
objekter som du trenger å løse gjennom og behandle tilsvarende.
Innenfor WatchKit-rammen gir Apple følgende fire konkrete underklasser; watchOS vil passere din utvidelsesdelegate en forekomst av riktig klasse avhengig av oppgaven.
WKApplicationRefreshBackgroundTask
er en generell bakgrunnsoppgave type som ikke er spesialisert for en bestemt oppdateringstype. Det vanligste brukssaken til denne typen er å planlegge andre oppgaver. For eksempel kan du planlegge en bakgrunnsoppdatering for appen din på en bestemt tid på dagen hver dag. Når den tilsvarende WKApplicationRefreshBackgroundTask
Objektet sendes deretter inn i din utvidelsesdelegates håndtak(_:)
Metode, du kan opprette en bakgrunnsnettverksoppgave for å laste ned noen data for å oppdatere appens innhold.WKSnapshotRefreshBackgroundTask
er en oppgave type spesielt for når appen din må oppdatere øyeblikksbilde. Vi vil diskutere øyeblikksbilder senere i denne opplæringen. Alt du trenger å vite for øyeblikket er at et apps øyeblikksbilde brukes som startbilde og kan også vises i brukerens dock (tilgjengelig ved å trykke på sideknappen). Vær oppmerksom på at denne typen bakgrunnsoppgave har en unik oppgavebeskrivelse som vi også vil diskutere senere.WKWatchConnectivityRefreshBackgroundTask
er en oppgave type for når du har overført data fra iPhone til klokken din via WatchConnectivity-rammeverket. Siden dette rammeverket gir en metode for å overføre komplikasjonsdata direkte til klokken, er denne tilsvarende bakgrunnsoppgavestypen hovedsakelig brukt til å planlegge øyeblikksoppdateringer som svar på data mottatt fra iPhone.WKURLSessionRefreshBackgroundTask
er en oppgavestype gitt til utvidelsesdelegatet når en bakgrunnsverksoppgave har fullført. I dette scenariet, delegatemetodene du satte opp for URLSession
objekt kalles fortsatt, og det er her hvor du må jobbe med dataene på riktig måte. De håndtak(_:)
Metoden til din utvidelsesdelegator blir bare kalt, slik at søknaden din kan svare på nettverksoperasjonen som er fullført. De WKURLSessionRefreshBackgroundTask
gir deg ikke tilgang til URLSession
objekt eller dataene som ble overført. Den eneste ekstra eiendommen den definerer er en streng som kalles sessionIdentifier
som du kan bruke til å avgjøre hvilken nettverksprosess som er fullført.Det finnes en rekke måter du kan planlegge en bakgrunnsoppdatering i watchOS 3. For en enkel applikasjon eller øyeblikksoppdatering, kan du bruke følgende to metoder på noen WKExtension
gjenstand.
scheduleBackgroundRefresh (withPreferredDate: Userinfo: scheduledCompletion :)
Når du er ferdig, returnerer denne metoden a WKApplicationRefreshBackgroundTask
motsette seg utvidelsesdelegatet ditt. WatchOS-systemet vil forsøke å vekke forlengelsen din i bakgrunnen på den tiden som er spesifisert av Dato
parameter.
Vær oppmerksom på at det ikke er garantert at søknaden din vil bli vekket i bakgrunnen på denne presise tiden. På grunn av andre omstendigheter (som gjenværende batteri, andre programmer som kjører og i minnet osv.), Kan systemet bestemme å våkne appen din senere..
De brukerinformasjon
parameteren vil være tilgjengelig via noen av bakgrunnsobjektobjektene som sendes til utvidelsesdelegatet. Dette kan være spesielt nyttig hvis du trenger å sende informasjon relatert til den nåværende oppdateringen. Til slutt, scheduledCompletion
parameteren kan gi en kodeblokk som vil bli kjørt når oppdateringen har blitt planlagt eller har feilet på grunn av en feil.
scheduleSnapshotRefresh (withPreferredDate: Userinfo: scheduledCompletion :)
Denne metoden vil returnere a WKSnapshotRefreshBackgroundTask
motsette seg utvidelsesdelegatet ditt. Parametrene for denne metoden er identiske med når du planlegger en vanlig programoppdatering. Den eneste forskjellen med denne metoden er den typen oppdatering du planlegger.
Følgende er et eksempel stykke kode som kan brukes hvor som helst i ditt watchOS-program for å planlegge en bakgrunnsoppdatering:
WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Dato (timeIntervalSinceNow: 60 * 60), userInfo: null) (feil: Feil?) I hvis la feil = feil print ("Feil oppstod under planlegging av bakgrunnsoppdatering: \ .localizedDescription) ")
Som nevnt tidligere, a WKWatchConnectivityRefreshBackgroundTask
er opprettet som svar på at du sender data til klokken fra sin sammenkoblede iPhone via WatchConnectivity-APIene.
Den siste typen bakgrunnsoppgave, WKURLSessionRefreshBackgroundTask
, Planlegges automatisk av systemet når du lager en URLSession
objekt med en bakgrunnskonfigurasjon. Hvis du gjør dette fra hvor som helst i watch-appen din, vil systemet automatisk planlegge forespørselen for deg og ringe til utvidelsesdelegatet håndtak(_:)
metode når du er ferdig. Følgende eksempelkode inneholder to funksjoner i et eksempelklasse. Den første funksjonen konfigurerer og starter en bakgrunnsopplastingsoppgave. Den andre er en delegatemetode som er erklært i URLSessionDelegate
protokollen.
klassen SomeClass: URLSessionDelegate func startDownloadTask () la config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") la session = URLSession (konfigurasjon: config, delegere: self, delegateQueue: null) la task = session.downloadTask (med: URL (streng: "http://www.example.com/data")!) task.resume () func urlSession (_ økt: URLSession, oppgave: URLSessionTask, didCompleteWithError feil: Feil?) print ")
I watchOS 3 har app-blikk blitt fjernet helt fra Apple Watch og i stedet blitt erstattet av Brygge. Denne docken er tilgjengelig ved å trykke på sideknappen på klokken og inneholder et antall apper som brukeren kan konfigurere:
Hvis appen din er plassert i en brukers dock, er du ansvarlig for å holde det synlige "øyeblikksbilde" vist i dokken oppdatert.
Appen din blir varslet når du må oppdatere øyeblikksbildet ditt med en WKSnapshotBackgroundRefreshTask
blir sendt inn i din utvidelsesdelegates håndtak(_:)
metode. Når du mottar dette varselet, i tillegg til at WatchKit-utvidelsen din blir vekket i bakgrunnen, blir også appens rotgrensesnittkontroller våknet i bakgrunnen og av skjermbildet. I denne prosessen kalles følgende metoder i denne rekkefølgen:
våken (withContext :)
metodewillActivate ()
metodehåndtak(_:)
metodePå et hvilket som helst tidspunkt i disse tre metodene kan du tilpasse utseendet på appens grensesnitt for å lage stillbildet som vises i kaien.
Det siste trinnet for å forfriske øyeblikksbildet skjer i utvidelsesdelegatets håndtak(_:)
metode. Som med de andre bakgrunnsoppgaver, må du fortelle systemet at oppgaven er fullført. For øyeblikksoppdateringer gjøres dette imidlertid ved å ringe setTaskCompleted (restoredDefaultState: estimatedSnapshotExpiration: Userinfo :)
metode på WKSnapshotBackgroundRefreshTask
gjenstand. Så snart du ringer denne metoden, tar watchOS bildet av appens nåværende grensesnitt og holder det i minnet til neste oppdatering. For å bedre forstå denne metoden, la oss gå gjennom alle parametrene:
restoredDefaultState
er bare en boolesk verdi som angir hvorvidt stillbildet ditt er av den første grensesnittkontrolleren til appen din. Hvis du har overgått til et annet grensesnitt, så pass inn falsk
for denne verdien. estimatedSnapshotExpiration
er en Dato
objekt som angir når systemet skal neste prøve å oppdatere appens øyeblikksbilde. Hvis du ikke trenger å planlegge en annen oppdatering umiddelbart, kan du passere i det nye Date.distantFuture
klasse eiendom.brukerinformasjon
er en samling av egendefinerte data og vil bli sendt videre til neste WKSnapshotBackgroundRefreshTask
objekt hvis du planlegger en annen oppdatering med en gang.WatchConnectivity-rammen som ble introdusert i watchOS 2 og iOS 9, får også ny funksjonalitet med watchOS 3 og iOS 10.
Hvis en bruker har lagt appens komplikasjon på sitt ansikt, kan du overføre data fra telefonen til klokken opptil 50 ganger på en enkelt dag. Dette er gjort, som i iOS 9 og watchOS 2, via WCSession
transferCurrentComplication (Userinfo :)
eksempelmetode. Nytt i watchOS 3 og iOS 10 er WCSession
remainingComplicationUserInfoTransfers
eiendom, som vil fortelle deg hvor mange overføringer som gjenstår for den dagen.
En annen ny WCSession
eiendom lagt med årets plattform oppdateringer er hasContentPending
eiendom, som bare er en boolsk verdi som indikerer om det ennå ikke er data som skal overføres mellom iPhone og Apple Watch.
Hvis du vil lære mer om WatchConnectivity og hvordan det fungerer, kan du sjekke ut våre tidligere opplæringsprogrammer som dekker rammen.
Samlet sett gir de nye API-ene i watchOS 3 deg muligheten til raskt og effektivt å oppdatere innholdet i Apple Watch-appen din i bakgrunnen. Som flere apper vedtar disse nye APIene, vil ytelsen til watchOS-apper generelt forbedre seg og skape en mye bedre brukeropplevelse.
Den koblede GitHub-repo inneholder et watchOS 3 Xcode-prosjekt med noen eksempler som viser hvordan du kan planlegge og svare på bakgrunnsoppdateringer i dine egne apper.
Som alltid, vær så snill å legge igjen dine kommentarer og tilbakemeldinger i kommentarene nedenfor.