Met de aanstaande watchOS 3-update voor alle Apple Watch-apparaten gaat de prestatie van veel horlogetoepassingen aanzienlijk verbeteren. Dit komt vooral door de nieuwe vormen van achtergronduitvoering waar watchOS-apps van kunnen profiteren om hun inhoud regelmatig te vernieuwen en altijd de nieuwste informatie klaar te hebben om door de gebruiker te worden bekeken.
In deze tutorial ga ik je laten zien hoe je de nieuwe WatchKit API's in watchOS 3 kunt gebruiken om je eigen applicatie deze nieuwe achtergrondtaken te laten gebruiken. Het is belangrijk om te weten dat, zelfs als uw app correct is ingesteld om deze achtergrondvernieuwingen te ondersteunen, afhankelijk van de configuratie van een specifieke gebruiker, uw systeem mogelijk niet op de achtergrond wordt uitgevoerd.
Deze tutorial vereist dat je Xcode 8 draait op OS X El Capitan of hoger.
De eerste belangrijke nieuwe klasse in watchOS 3 is de WKRefreshBackgroundTask
klasse. Dit is een abstracte klasse die u niet moet subclass of voorbeelden van uzelf moet maken. Het definieert slechts één eigenschap, gebruikers informatie
, welke extra informatie kan opslaan met betrekking tot de achtergrondtaak. Het definieert ook een enkele methode, setTaskCompleted ()
, die je jezelf moet noemen om het systeem te vertellen dat de taak voltooid is. Als u dit niet belt, besteedt het systeem de maximale hoeveelheid tijd die is gebudgetteerd aan uw app om de taak te voltooien, wat op zijn beurt de batterij verspilt en de prestaties van andere apps schaadt.
Wanneer uw toepassing een achtergrondtaak moet afhandelen, belt het systeem uw watchOS-uitbreidingsdeelnemers handvat(_:)
methode. De enkele parameter van deze methode is een set van WKRefreshBackgroundTask
objecten die u nodig hebt om door te lussen en dienovereenkomstig te verwerken.
Binnen het WatchKit-framework biedt Apple de volgende vier concrete subklassen; watchOS zal uw extensiedelegant een instantie van de juiste klasse geven, afhankelijk van de taak.
WKApplicationRefreshBackgroundTask
is een algemeen achtergrondtaaktype dat niet gespecialiseerd is voor een bepaald verversingstype. De meest voorkomende gebruiksgeval voor dit type is voor het plannen van andere taken. U kunt bijvoorbeeld elke dag een achtergrondvernieuwing voor uw app plannen op een specifiek tijdstip van de dag. Wanneer de overeenkomstige WKApplicationRefreshBackgroundTask
object wordt vervolgens doorgegeven aan de leden van uw extensiedelegate handvat(_:)
methode, kunt u een achtergrondnetwerktaak maken om enkele gegevens te downloaden om de inhoud van uw app te vernieuwen.WKSnapshotRefreshBackgroundTask
is een taaktype speciaal voor wanneer uw app de momentopname moet bijwerken. We zullen later in deze tutorial snapshots bespreken. Het enige dat u nu nog moet weten, is dat de momentopname van een app wordt gebruikt als startafbeelding en ook kan worden weergegeven in het dock van de gebruiker (toegankelijk door op de knop aan de zijkant te drukken). Houd er rekening mee dat dit type achtergrondtaak een unieke taakindelingsmethode heeft, die we later ook zullen bespreken.WKWatchConnectivityRefreshBackgroundTask
is een taaktype voor wanneer u gegevens van uw iPhone naar uw horloge hebt overgebracht via het WatchConnectivity-framework. Aangezien dit framework een methode biedt om complicatiegegevens rechtstreeks naar het horloge over te dragen, wordt dit overeenkomstige achtergrondtaaktype hoofdzakelijk gebruikt om momentopnamesupdates te plannen als reactie op gegevens die van de iPhone worden ontvangen.WKURLSessionRefreshBackgroundTask
is een taaktype dat aan uw extensiedelegate wordt gegeven wanneer een achtergrondnetwerktaaktaak is voltooid. In dit scenario zijn de gedelegeerde methoden die u hebt ingesteld voor de URLSession
objecten worden nog steeds gebeld, en hier moet u met de gegevens werken. De handvat(_:)
methode van uw extensiedelegate wordt alleen opgeroepen, zodat uw applicatie kan reageren op de netwerkbewerking die wordt voltooid. De WKURLSessionRefreshBackgroundTask
geeft je geen toegang tot de URLSession
object, noch de gegevens die zijn overgedragen. De enige extra eigenschap die het definieert is een string genaamd sessionIdentifier
die u kunt gebruiken om te bepalen welk netwerkproces is voltooid.Er zijn een aantal manieren waarop u een achtergrondvernieuwing in watchOS 3 kunt plannen. Voor een eenvoudige toepassing resp. Snapshotverversing kunt u de volgende twee methoden gebruiken voor elke WKExtension
voorwerp.
scheduleBackgroundRefresh (withPreferredDate: UserInfo: scheduledCompletion :)
Wanneer deze is voltooid, retourneert deze methode a WKApplicationRefreshBackgroundTask
bezwaar maken tegen uw afgevaardigde. Het watchOS-systeem zal proberen uw extensie op de achtergrond te activeren op het tijdstip dat is opgegeven door de Datum
parameter.
Houd er rekening mee dat het niet gegarandeerd is dat uw toepassing op dit moment op de achtergrond wordt gewekt. Vanwege andere omstandigheden (zoals resterende batterij, andere apps die worden uitgevoerd en in het geheugen, enzovoort), kan het systeem besluiten om uw app op een later tijdstip te activeren.
De gebruikers informatie
parameter is toegankelijk via een van de achtergrondtaakobjecten die zijn doorgegeven aan uw extensiedeelder. Dit kan met name handig zijn als u informatie wilt verzenden die alleen betrekking heeft op de huidige vernieuwing. Ten slotte, de scheduledCompletion
parameter kan een codeblok bieden dat wordt uitgevoerd zodra uw vernieuwing is gepland of is mislukt vanwege een fout.
scheduleSnapshotRefresh (withPreferredDate: UserInfo: scheduledCompletion :)
Deze methode retourneert a WKSnapshotRefreshBackgroundTask
bezwaar maken tegen uw afgevaardigde. De parameters voor deze methode zijn identiek aan die voor het plannen van een normale toepassingsvernieuwing. Het enige verschil met deze methode is het type verversing dat u plant.
Het volgende is een voorbeeld van een code die overal in uw watchOS-toepassing kan worden gebruikt om een achtergrondvernieuwing in te plannen:
WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil) (error: Error?) In if let error = error print ("Fout opgetreden tijdens het plannen van achtergrondvernieuwing: \ (error .localizedDescription) ")
Zoals eerder vermeld, WKWatchConnectivityRefreshBackgroundTask
is gemaakt als reactie op het verzenden van gegevens naar het horloge vanaf de gekoppelde iPhone via de WatchConnectivity-API's.
Het laatste type achtergrondtaak, WKURLSessionRefreshBackgroundTask
, wordt automatisch door het systeem gepland wanneer u een maakt URLSession
object met een achtergrondconfiguratie. Als u dit vanaf elke locatie in uw watch-app doet, zal het systeem de aanvraag automatisch voor u plannen en uw extensiedeelnemers bellen handvat(_:)
methode wanneer voltooid. De volgende voorbeeldcode bevat twee functies binnen een voorbeeldklasse. De eerste functie configureert en start een achtergronddownloadtaak. De tweede is een gedelegeerde methode die is gedeclareerd in de URLSessionDelegate
protocol.
class SomeClass: URLSessionDelegate func beginDownloadTask () let config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") let session = URLSession (configuratie: config, delegate: self, delegateQueue: nil) laat task = session.downloadTask (met: URL (string: "http://www.example.com/data")!) task.resume () func urlSession (_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) print ("Sessie is voltooid ")
In watchOS 3 zijn app-blikken volledig van de Apple Watch verwijderd en vervangen door de dok. Dit dock is toegankelijk door op de knop aan de zijkant van het horloge te drukken en bevat een onbeperkt aantal apps die de gebruiker kan configureren:
Als uw app in het dock van een gebruiker is geplaatst, bent u verantwoordelijk voor het up-to-date houden van de zichtbare "snapshot" in het dock.
Uw app ontvangt een melding wanneer u uw momentopname moet bijwerken met een WKSnapshotBackgroundRefreshTask
wordt doorgegeven aan de leden van uw verlengingsdelegator handvat(_:)
methode. Wanneer u deze melding ontvangt, wordt naast de WatchKit-extensie op de achtergrond gewekt, de rootinterfacecontroller van uw app ook op de achtergrond en buiten het scherm gewekt. In dit proces worden de volgende methoden in deze volgorde aangeroepen:
wakker (withContext :)
methodewillActivate ()
methodehandvat(_:)
methodeOp elk willekeurig punt in deze drie methoden kunt u het uiterlijk van de interface van uw app aanpassen om de momentopname te maken die in het dock wordt weergegeven.
De laatste stap van het vernieuwen van de momentopname gebeurt in de afgevaardigde van de extensie handvat(_:)
methode. Net als bij de andere achtergrondtaaktypen, moet u het systeem vertellen dat de taak is voltooid. Voor het vernieuwen van momentopnamen wordt dit echter gedaan door de setTaskCompleted (restoredDefaultState: estimatedSnapshotExpiration: userinfo :)
methode op de WKSnapshotBackgroundRefreshTask
voorwerp. Zodra u deze methode aanroept, neemt watchOS de momentopname van de huidige interface van uw app op en bewaart deze in het geheugen tot de volgende vernieuwing. Voor een beter begrip van deze methode, gaan we door alle parameters:
restoredDefaultState
is slechts een booleaanse waarde die aangeeft of uw momentopname de eerste interfacecontroller van uw app is. Als u bent overgeschakeld naar een andere interface, meldt u zich aan vals
voor deze waarde. estimatedSnapshotExpiration
is een Datum
object dat aangeeft wanneer het systeem de volgende keer de momentopname van uw app moet proberen te vernieuwen. Als u niet meteen een nieuwe verversing hoeft in te plannen, kunt u het nieuwe doorgeven Date.distantFuture
eigendom van de klas.gebruikers informatie
is een verzameling aangepaste gegevens en wordt doorgegeven aan de volgende WKSnapshotBackgroundRefreshTask
object als u meteen een nieuwe verversing plant.Het WatchConnectivity-framework dat is geïntroduceerd in watchOS 2 en iOS 9 krijgt ook wat nieuwe functionaliteit met watchOS 3 en iOS 10.
Als een gebruiker de complicatie van uw app op de wijzerplaat van het horloge heeft geplaatst, kunt u maximaal 50 keer per dag gegevens van de telefoon naar het horloge overbrengen. Dit is gedaan, zoals in iOS 9 en watchOS 2, via de WCSession
transferCurrentComplication (userinfo :)
instantie methode. Nieuw in watchOS 3 en iOS 10 is het WCSession
remainingComplicationUserInfoTransfers
eigendom, dat u vertelt hoeveel overboekingen er nog resten voor die dag.
Nog een nieuw WCSession
property toegevoegd met de platformupdates van dit jaar is het hasContentPending
eigenschap, wat slechts een booleaanse waarde is die aangeeft of er al dan niet gegevens moeten worden overgedragen tussen de iPhone en Apple Watch.
Als u meer wilt weten over WatchConnectivity en hoe het werkt, kunt u onze vorige tutorials over het framework bekijken.
Over het algemeen kunt u met de nieuwe API's in watchOS 3 snel en efficiënt de inhoud van uw Apple Watch-app op de achtergrond vernieuwen. Naarmate meer apps deze nieuwe API's gebruiken, zullen de prestaties van watchOS-apps over het algemeen enorm verbeteren en een veel betere gebruikerservaring creëren.
De gekoppelde GitHub-repo bevat een watchOS 3 Xcode-project met een voorbeeldcode die laat zien hoe u in uw eigen apps achtergrondvernieuwingen kunt plannen en erop kunt reageren.
Laat zoals altijd uw opmerkingen en feedback achter in de opmerkingen hieronder.