Hva er nytt i watchOS 3 Bakgrunnsoppgaver

Introduksjon

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.

1. Bakgrunnsoppgaver

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.

Planlegger en oppdatering

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) ")

Opprette andre bakgrunnsoppgaver

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 ")

2. Se App Snapshots

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:

  1. Roteringsgrensesnittkontrolleren er våken (withContext :) metode
  2. Roteringsgrensesnittkontrolleren er willActivate () metode
  3. Utvidelsesdelegatet er håndtak(_:) metode

På 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.

3. Forbedringer til WatchConnectivity

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.

  • watchOS 2: Kommunisere med en motpart

    Utgivelsen av watchOS 2 bringer betydelige endringer med det. En av disse endringene er evnen til lett å kommunisere med en motpart. Det er…
    Jorge Costa
    WatchKit
  • watchOS 2: Bakgrunnsoverføringer og køer

    Watch Connectivity er et nytt kommunikasjonsramme utgitt sammen med iOS 9 og watchOS 2. Det er hovedformålet er å enkelt og sømløst overføre ...
    Davis Allie
    WatchKit

Konklusjon

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.