Vad är nytt i watchOS 3 Bakgrundsuppgifter

Introduktion

Med den kommande watchOS 3 uppdateringen till alla Apple Watch-enheter, kommer prestanda för många klockprogram att förbättra sig avsevärt. Detta beror främst på de nya formerna av bakgrundsutförande som watchOS-appar kan dra nytta av för att uppdatera innehållet regelbundet och alltid ha den senaste informationen klar att ses av användaren.

I denna handledning ska jag visa dig hur du kan använda de nya WatchKit API-erna i watchOS 3 för att få din egen applikation att använda dessa nya bakgrundsuppgifter. Det är viktigt att notera att även om din app är korrekt konfigurerad för att stödja bakgrunden uppdateras, kan det hända att systemet inte låter din app springa i bakgrunden beroende på användarens konfiguration.

Denna handledning kräver att du kör Xcode 8 på OS X El Capitan eller senare.

1. Bakgrundsuppgifter

Den första viktiga nya klassen i watchOS 3 är WKRefreshBackgroundTask klass. Detta är en abstrakt klass som du inte bör subklassera eller skapa instanser av dig själv. Det definierar endast en egendom, användarinformation, som kan lagra extra information om bakgrundsuppgiften. Det definierar också en enda metod, setTaskCompleted (), som du måste kalla dig själv för att berätta för systemet att uppgiften är klar. Om du inte ringer det här kommer systemet att spendera den maximala tiden som är budgetad för att din app försöker slutföra uppgiften, som i sin tur slösar batteriet och gör ont i andra apps prestanda.

När din ansökan ska hantera en bakgrundsuppgift som slutförs, kommer systemet att ringa din watchOS-extensionsdelegator hantera(_:) metod. Denna metods enda parameter är en uppsättning av WKRefreshBackgroundTask objekt som du behöver slinga igenom och bearbeta i enlighet därmed. 

Inom WatchKit-ramen tillhandahåller Apple följande fyra konkreta underklasser; watchOS kommer att vidarebefordra din förlängningsdelegator till en förekomst av lämplig klass beroende på uppgiften.

  • WKApplicationRefreshBackgroundTask är en allmän bakgrundsuppgiftstyp som inte är specialiserad för en viss uppdateringstyp. Det vanligaste användningsfallet för denna typ är att schemalägga andra uppgifter. Du kan till exempel schemalägga en bakgrundsuppdatering för din app på en viss tid på dagen varje dag. När motsvarande WKApplicationRefreshBackgroundTask objektet överförs sedan till din tilläggsdelegates hantera(_:) metod kan du skapa en bakgrundsnätverksuppgift för att ladda ner data för att uppdatera appens innehåll.
  • WKSnapshotRefreshBackgroundTask är en uppgiftstyp speciellt för när din app behöver uppdatera sin stillbild. Vi kommer att diskutera snapshots senare i denna handledning. Allt du behöver veta för tillfället är att en apps ögonblicksbild används som startbild och kan också visas i användarens docka (tillgänglig genom att trycka på sidoknappen). Observera att denna typ av bakgrundsuppgift har en unik uppgiftsmetod som vi också kommer att diskutera senare.
  • WKWatchConnectivityRefreshBackgroundTask är en uppgiftstyp för när du har överfört data från din iPhone till din klocka via WatchConnectivity-ramen. Eftersom denna ram tillhandahåller en metod för att överföra komplikationsdata direkt till klockan används denna motsvarande bakgrundsuppgiftstyp huvudsakligen för att schemalägga ögonblicksuppdateringar som svar på data som tas emot från iPhone.
  • WKURLSessionRefreshBackgroundTask är en uppgiftstyp som ges till din förlängningsdelegate när en bakgrundsverksuppgift har slutförts. I det här scenariiet ska de delegerade metoderna du skapade för URLSession Objekt kallas fortfarande, och det är här där du behöver arbeta med data på lämpligt sätt. De hantera(_:) Metoden för din förlängningsdelegator kallas bara så att din ansökan kan svara på att nätverksoperationen är klar. De WKURLSessionRefreshBackgroundTask ger dig inte tillgång till URLSession objekt eller data som överfördes. Den enda extra egenskapen som definieras är en sträng som heter sessionIdentifier som du kan använda för att bestämma vilken nätverksprocess som har slutförts.

Planera en uppdatering

Det finns ett antal sätt att du kan schemalägga en bakgrundsuppdatering i watchOS 3. För en enkel applikation eller en stillbildsuppdatering kan du använda följande två metoder på alla WKExtension objekt. 

scheduleBackgroundRefresh (withPreferredDate: Userinfo: scheduledCompletion :)

När den är klar kommer den här metoden att returnera a WKApplicationRefreshBackgroundTask motsätta dig förlängningsdelegatet. WatchOS-systemet kommer att försöka väcka förlängningen i bakgrunden vid den tidpunkt som anges av Datum parameter. 

Observera att det inte är garanterat att din ansökan kommer att vakna i bakgrunden vid denna exakta tidpunkt. På grund av andra omständigheter (som återstående batteri, andra program som körs och i minnet etc.) kan systemet besluta att väcka din app vid en senare tidpunkt. 

De användarinformation parametern kommer att vara tillgänglig via någon av de bakgrundsobjektobjekt som skickas till din distributionsdelegate. Detta kan vara särskilt användbart om du behöver skicka information som endast gäller den aktuella uppdateringen. Slutligen, den scheduledCompletion parametern kan ge ett kodblock som kommer att köras när din uppdatering har planerats eller har misslyckats på grund av ett visst fel.

scheduleSnapshotRefresh (withPreferredDate: Userinfo: scheduledCompletion :) 

Denna metod kommer att returnera a WKSnapshotRefreshBackgroundTask motsätta dig förlängningsdelegatet. Parametrarna för denna metod är identiska med när schemaläggning av en vanlig programuppdatering. Den enda skillnaden med den här metoden är den typ av uppdatering som du planerar.

Följande är ett exempel kodstycke som kan användas var som helst i ditt watchOS-program för att schemalägga en bakgrundsuppdatering:

WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil) (fel: Fel?) I om låta fel = fel print ("Fel uppstod vid schemaläggning av bakgrundsuppdatering: \ .localizedDescription) ")

Skapa andra bakgrundsuppgifter

Som tidigare nämnts a WKWatchConnectivityRefreshBackgroundTask skapas som svar på att du skickar data till klockan från sin parade iPhone via WatchConnectivity API. 

Den sista typen av bakgrundsuppgift, WKURLSessionRefreshBackgroundTask, Planeras automatiskt av systemet när du skapar en URLSession objekt med en bakgrundskonfiguration. Om du gör det från var som helst i din klockapp kan systemet automatiskt schemalägga förfrågan för dig och ringa tilläggets delegatets hantera(_:) metod när det är klart. Följande exempelkod innehåller två funktioner inom en exempelklass. Den första funktionen konfigurerar och startar en bakgrundsladdningsuppgift. Den andra är en delegatmetod som deklareras i URLSessionDelegate protokoll.

klass SomeClass: URLSessionDelegate func startDownloadTask () let config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") låt session = URLSession (konfiguration: config, delegate: self, delegateQueue: nil) låt task = session.downloadTask (med: URL (sträng: "http://www.example.com/data")!) task.resume () func urlSession (_ session: URLSession, uppgift: URLSessionTask, didCompleteWithError fel: Error?) print ")

2. Se App Snapshots

I watchOS 3 har appskärmen tagits bort helt från Apple Watch och har istället ersatts av docka. Den här dockan öppnas genom att trycka på sidoknappen på klockan och innehåller ett antal appar som användaren kan konfigurera:

Om din app har placerats i en användares dock är du ansvarig för att hålla den synliga "ögonblicksbilden" som visas i dockan uppdaterad. 

Din app meddelas när du behöver uppdatera din stillbild av en WKSnapshotBackgroundRefreshTask skickas till din tilläggsdelegates hantera(_:) metod. När du får den här meddelandet, förutom att din WatchKit-förlängning väcktes i bakgrunden, väckas även din apps root-gränssnittsregulator på bakgrunden och avskärmen. I denna process kallas följande metoder i följande ordning:

  1. Rotsgränssnittskontrollerns vaken (withContext :) metod
  2. Rotsgränssnittskontrollerns willActivate () metod
  3. Utvidgningsdelegatets hantera(_:) metod

På något sätt i dessa tre metoder kan du anpassa utseendet på appens gränssnitt för att skapa stillbilden som visas i dockan.

Det slutliga steget att uppdatera ögonblicksbilden händer i förlängningsdelegatets hantera(_:) metod. Som med de andra bakgrundsuppgiftstyperna måste du berätta för systemet att uppgiften är klar. För snapshot-uppdateringar görs dock detta genom att ringa setTaskCompleted (restoredDefaultState: estimatedSnapshotExpiration: Userinfo :) metod på WKSnapshotBackgroundRefreshTask objekt. Så snart du ringer till den här metoden, tar watchOS fångst av din apps nuvarande gränssnitt och håller det i minnet tills nästa uppdatering. För att bättre förstå den här metoden, låt oss gå igenom alla dess parametrar:

  • restoredDefaultState är bara ett booleskt värde som anger huruvida din ögonblicksbild är den första gränssnittsstyrenheten för din app. Om du har övergått till ett annat gränssnitt passerar du sedan in falsk för detta värde. 
  • estimatedSnapshotExpiration är en Datum objekt som anger när systemet ska försöka uppdatera appens ögonblicksbild. Om du inte behöver schemalägga en annan uppdatering omedelbart kan du vidarebefordra den nya Date.distantFuture klass egendom.
  • användarinformation är en samling anpassade data och kommer att vidarebefordras till nästa WKSnapshotBackgroundRefreshTask objekt om du planerar en annan uppdatering direkt.

3. Förbättringar av WatchConnectivity

Den WatchConnectivity-ram som introduceras i watchOS 2 och iOS 9 får också ny funktionalitet med watchOS 3 och iOS 10. 

Om en användare har satt din apps komplikation på sitt klockans ansikte kan du överföra data från telefonen till klockan upp till 50 gånger på en enda dag. Detta görs, som i iOS 9 och watchOS 2, via WCSession transferCurrentComplication (Userinfo :) förekomstmetod. Nytt i watchOS 3 och iOS 10 är WCSession remainingComplicationUserInfoTransfers egendom, som kommer att berätta hur många överföringar som återstår för den dagen.

En annan ny WCSession egendom som läggs till med årets plattformsuppdateringar är hasContentPending egendom, vilket bara är ett booleskt värde som indikerar huruvida det fortfarande finns data som ska överföras mellan iPhone och Apple Watch.

Om du vill lära dig mer om WatchConnectivity och hur det fungerar kan du kolla in våra tidigare handledning som täcker ramen.

  • watchOS 2: Kommunicera med en motpart

    Utgåvan av watchOS 2 ger betydande förändringar med den. En av dessa förändringar är förmågan att enkelt kommunicera med en motpart. Det finns…
    Jorge Costa
    WatchKit
  • watchOS 2: Bakgrundsöverföringar och köer

    Watch Connectivity är en ny kommunikationsram som släpps tillsammans med iOS 9 och watchOS 2. Det är huvudsakliga syftet att enkelt och smidigt överföra ...
    Davis Allie
    WatchKit

Slutsats

Sammantaget låter de nya API: erna i watchOS 3 dig snabbt och effektivt uppdatera din Apple Watch-apps innehåll i bakgrunden. Eftersom fler appar adopterar dessa nya API-skivor, förbättras prestanda för watchOS-appar i stort sett mycket och skapar en mycket bättre användarupplevelse.

Den länkade GitHub repo innehåller ett watchOS 3 Xcode-projekt med några exempelkod som visar hur du kan schemalägga och svara på bakgrundsuppdateringar i dina egna appar.

Som alltid, var noga med att lämna dina kommentarer och feedback i kommentarerna nedan.