Úlohy watchOS na pozadí v Xamarinu
S watchOS 3 existují tři hlavní způsoby, jak může aplikace watch udržovat své informace v aktualizovaném stavu:
- Použití některého z několika nových úloh na pozadí
- Má jednu z jejích komplikací na ciferníku (což jí dává další čas na aktualizaci).
- Uživatel se připne k aplikaci do nového Docku (kde se uchovává v paměti a často se aktualizuje).
Udržování aplikace v aktualizovaném stavu
Než probereme všechny způsoby, jak může vývojář udržovat data a uživatelské rozhraní aplikace watchOS aktuální a aktualizované, v této části se podíváme na typickou sadu vzorů použití a na to, jak se uživatel může pohybovat mezi svými i Telefon a apple Watch po celý den na základě denní doby a aktivity, kterou právě dělají (například řízení).
Podívejte se na následující příklad:
- Ráno uživatel při čekání na kávu prochází aktuální zprávy na svém i Telefon několik minut.
- Než opustí kávu, rychle zkontrolují počasí s komplikacemi na tváři hodinky.
- Před obědem používají aplikaci Mapy na i Telefon najít poblíž restauraci a rezervovat rezervaci, aby se seznámili s klientem.
- Při cestě do restaurace dostanou oznámení na apple Watch a rychlým přehledem vědí, že jejich obědová schůzka běží pozdě.
- Večer používají aplikaci Mapy na i Telefon ke kontrole provozu před jízdou domů.
- Na cestě domů obdrží oznámení iMessage na apple Watch, které je žádá, aby si vyzvednout nějaké mléko a oni pomocí funkce Rychlá odpověď odeslat odpověď "OK".
Vzhledem k "rychlému přehledu" (méně než tři sekundy) způsobu, jakým chce uživatel používat aplikaci Apple Watch, obvykle není dostatek času, aby aplikace načítá požadované informace a aktualizovala jeho uživatelské rozhraní před zobrazením uživateli.
Pomocí nových rozhraní API, která apple zahrnula do watchOS 3, může aplikace naplánovat aktualizaci na pozadí a mít připravené požadované informace, než si ho uživatel vyžádá. Podívejte se na příklad komplikace počasí probírané výše:
- Plány aplikací se v určitém okamžiku probudí systémem.
- Aplikace načte informace, které bude vyžadovat k vygenerování aktualizace.
- Aplikace znovu vygeneruje své uživatelské rozhraní, aby odrážela nová data.
- Když uživatel nahlédne na komplikaci aplikace, bude mít aktuální informace, aniž by uživatel musel čekat na aktualizaci.
Jak je vidět výše, systém watchOS aplikaci probudí pomocí jednoho nebo více úkolů, z nichž má k dispozici velmi omezený fond:
Apple navrhuje, aby byl tento úkol na maximum (protože se jedná o takový omezený prostředek pro aplikaci), a to tak, že ho podrží, dokud aplikace nedokončí proces aktualizace samotné.
Systém tyto úkoly doručí voláním nové HandleBackgroundTasks
metody delegáta WKExtensionDelegate
. Příklad:
using System;
using Foundation;
using WatchKit;
namespace MonkeyWatch.MonkeySeeExtension
{
public class ExtensionDelegate : WKExtensionDelegate
{
#region Constructors
public ExtensionDelegate ()
{
}
#endregion
#region Override Methods
public override void HandleBackgroundTasks (NSSet<WKRefreshBackgroundTask> backgroundTasks)
{
// Handle background request here
...
}
#endregion
}
}
Jakmile aplikace dokončí danou úlohu, vrátí ji do systému tím, že ji označíte jako dokončenou:
Nové úlohy na pozadí
watchOS 3 zavádí několik úloh na pozadí, které může aplikace použít k aktualizaci informací, aby před otevřením aplikace získala obsah, který uživatel potřebuje, například:
- Aktualizace aplikace na pozadí – úloha WKApplicationRefreshBackgroundTask umožňuje aplikaci aktualizovat její stav na pozadí. Obvykle to bude zahrnovat další úlohu, například stažení nového obsahu z internetu pomocí NSUrlSession.
- Aktualizace snímku na pozadí – úloha WKSnapshotRefreshBackgroundTask umožňuje aplikaci aktualizovat jeho obsah i uživatelské rozhraní předtím, než systém pořídí snímek, který se použije k naplnění Docku.
- Sledování na pozadí Připojení ivity – úloha WKWatch Připojení ivityRefreshBackgroundTask se spustí pro aplikaci, když přijímá data na pozadí z spárovaného i Telefon.
- Relace adresy URL na pozadí – Úloha WKURLSessionRefreshBackgroundTask se spustí pro aplikaci, když přenos na pozadí vyžaduje autorizaci nebo dokončení (úspěšně nebo omylem).
Tyto úkoly jsou podrobně popsané v následujících částech.
WKApplicationRefreshBackgroundTask
Jedná se WKApplicationRefreshBackgroundTask
o obecnou úlohu, kterou je možné naplánovat tak, aby se aplikace v budoucnu probudila:
V rámci modulu runtime úlohy může aplikace provádět jakýkoli druh místního zpracování, například aktualizovat časovou osu komplikací nebo načíst některá požadovaná data pomocí NSUrlSession
.
WKURLSessionRefreshBackgroundTask
Systém odešle WKURLSessionRefreshBackgroundTask
po dokončení stahování dat a jeho zpracování aplikací:
Aplikace není spuštěná, když se data stahují na pozadí. Místo toho aplikace naplánuje žádost o data, pak se pozastaví a systém zpracuje stahování dat. Aplikace se znovu spustí až po dokončení stahování.
WKSnapshotRefreshBackgroundTask
Ve watchOS 3 přidal Apple Dock, kde si uživatelé můžou připnout své oblíbené aplikace a rychle k nim přistupovat. Když uživatel stiskne tlačítko Bok na Apple Watch, zobrazí se galerie připnutých snímků aplikace. Uživatel může požadovanou aplikaci najít potažením prstem doleva nebo doprava a potom ji klepnutím spustit a nahradit snímek rozhraním spuštěné aplikace.
Systém pravidelně pořizuje snímky uživatelského rozhraní aplikace (odesláním WKSnapshotRefreshBackgroundTask
) a tyto snímky použije k naplnění Docku. watchOS dává aplikaci příležitost aktualizovat svůj obsah a uživatelské rozhraní před pořízením tohoto snímku.
Snímky jsou ve watchOS 3 velmi důležité, protože fungují jako náhled i spouštěcí obrázky pro aplikaci. Pokud se uživatel v Docku vypořádá s aplikací, rozbalí se na celou obrazovku, přejde do popředí a začne běžet, takže je nezbytné, aby snímek byl aktuální:
Systém znovu vydá WKSnapshotRefreshBackgroundTask
, aby se aplikace před pořízením snímku připravila (aktualizací dat a uživatelského rozhraní):
Po označení dokončené WKSnapshotRefreshBackgroundTask
aplikace systém automaticky pořídí snímek uživatelského rozhraní aplikace.
Důležité
Je důležité vždy naplánovat WKSnapshotRefreshBackgroundTask
, až aplikace obdrží nová data a aktualizuje jeho uživatelské rozhraní nebo uživatel neuvidí změněné informace.
Když uživatel navíc obdrží oznámení z aplikace a klepne na ni, aby se aplikace přenesla do popředí, musí být snímek aktuální, protože funguje také jako spouštěcí obrazovka:
Pokud uživatel pracoval s aplikací watchOS více než hodinu, bude se moct vrátit do výchozího stavu. Výchozí stav může znamenat různé věci pro různé aplikace a na základě návrhu aplikace nemusí mít vůbec výchozí stav.
WKWatch Připojení ivityRefreshBackgroundTask
Ve watchOS 3 má Apple integrované připojení ke kukátkám s rozhraním API pro aktualizaci na pozadí prostřednictvím nového WKWatchConnectivityRefreshBackgroundTask
rozhraní . Pomocí této nové funkce může aplikace i Telefon doručovat nová data svému protějšku aplikace watch, zatímco aplikace watchOS běží na pozadí:
Iniciace nabízení komplikací, kontext aplikace, odeslání souboru nebo aktualizace informací o uživateli z aplikace i Telefon se aplikace Apple Watch probudí na pozadí.
Když se aplikace kukátku probouzí přes aplikaciWKWatchConnectivityRefreshBackgroundTask
, bude muset k příjmu dat z aplikace i Telefon použít standardní metody rozhraní API.
- Ujistěte se, že je relace aktivovaná.
- Monitorujte novou
HasContentPending
vlastnost, pokud jetrue
hodnota , aplikace má stále data ke zpracování. Stejně jako předtím by se aplikace měla držet úlohy, dokud nedokončí zpracování všech dat. - Pokud není k dispozici žádná další data ke zpracování (
HasContentPending = false
), označte úkol dokončený a vraťte je do systému. Pokud to neuděláte, vyčerpá se modul runtime přiděleného na pozadí aplikace, což vede k chybovému ukončení.
Životní cyklus rozhraní API na pozadí
Umístění všech částí nového rozhraní API úloh na pozadí dohromady, typická sada interakcí by vypadala takto:
- Nejprve aplikace watchOS naplánuje úlohu na pozadí, která se v budoucnu probouzela.
- Aplikace je probuzena systémem a odeslala úkol.
- Aplikace zpracuje úkol tak, aby dokončil jakoukoli práci, která byla požadována.
- V důsledku zpracování úlohy může aplikace potřebovat naplánovat další úlohy na pozadí, aby v budoucnu dokončila více práce, například stažení dalšího obsahu pomocí
NSUrlSession
. - Aplikace označí dokončenou úlohu a vrátí ji do systému.
Zodpovědné používání prostředků
Je důležité, aby se aplikace watchOS v tomto ekosystému chovala zodpovědně tím, že omezuje její odtok na sdílené prostředky systému.
Podívejte se na následující scénář:
- Uživatel spustí aplikaci watchOS v 13:00.
- Aplikace naplánuje úkol, který se má probudit a stáhnout nový obsah za hodinu v 23:00.
- V 13:50 uživatel znovu otevře aplikaci, která jí umožní aktualizovat data a uživatelské rozhraní v tuto chvíli.
- Místo toho, aby se úloha znovu probudila během 10 minut, měla by aplikace přeplánovat úkol tak, aby běžela o hodinu později v 2:50.
I když se každá aplikace liší, Apple navrhuje najít vzory použití, jako jsou výše uvedené, a pomáhá tak šetřit systémové prostředky.
Implementace úloh na pozadí
V zájmu příkladu bude tento dokument používat falešnou sportovní aplikaci MonkeySoccer, která hlásí uživateli skóre fotbalu.
Podívejte se na následující typický scénář použití:
Oblíbený fotbalový tým uživatele hraje velký zápas od 17:00 do 19:00, takže aplikace by měla očekávat, že uživatel bude pravidelně kontrolovat skóre a rozhodne o 30minutovém intervalu aktualizace.
- Uživatel aplikaci otevře a naplánuje úlohu na aktualizaci na pozadí o 30 minut později. Rozhraní API na pozadí umožňuje, aby v daném okamžiku běžel pouze jeden typ úlohy na pozadí.
- Aplikace obdrží úkol a aktualizuje svá data a uživatelské rozhraní a pak naplánuje další úlohu na pozadí o 30 minut později. Je důležité, aby si vývojář vzpomněl na naplánování jiné úlohy na pozadí, nebo se aplikace nebude nikdy znovu budit, aby získal další aktualizace.
- Aplikace znovu obdrží úkol a aktualizuje svá data, aktualizuje uživatelské rozhraní a naplánuje další úlohu na pozadí o 30 minut později.
- Stejný proces se opakuje znovu.
- Poslední úloha na pozadí se přijímá a aplikace znovu aktualizuje data a uživatelské rozhraní. Vzhledem k tomu, že se jedná o konečné skóre, neplánuje novou aktualizaci na pozadí.
Plánování aktualizace na pozadí
Vzhledem k výše uvedenému scénáři může aplikace MonkeySoccer naplánovat aktualizaci na pozadí pomocí následujícího kódu:
private void ScheduleNextBackgroundUpdate ()
{
// Create a fire date 30 minutes into the future
var fireDate = NSDate.FromTimeIntervalSinceNow (30 * 60);
// Create
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("LastActiveDate"), NSDate.FromTimeIntervalSinceNow(0));
userInfo.Add (new NSString ("Reason"), new NSString ("UpdateScore"));
// Schedule for update
WKExtension.SharedExtension.ScheduleBackgroundRefresh (fireDate, userInfo, (error) => {
// Was the Task successfully scheduled?
if (error == null) {
// Yes, handle if needed
} else {
// No, report error
}
});
}
V budoucnu vytvoří nové NSDate
30 minut, když bude aplikace chtít býtwoken a vytvoří NSMutableDictionary
podrobnosti požadované úlohy. Metoda ScheduleBackgroundRefresh
SharedExtension
se používá k vyžádání naplánované úlohy.
Systém vrátí NSError
, pokud nemohl naplánovat požadovaný úkol.
Zpracování aktualizace
V dalším kroku se podívejte blíže na 5minutové okno s kroky potřebnými k aktualizaci skóre:
- V 7:30:02 se aplikace probouzí systémem a vzhledem k úloze na pozadí aktualizace. Jeho první prioritou je získat nejnovější skóre ze serveru. Viz Plánování NSUrlSession níže.
- V 7:30:05 aplikace dokončí původní úkol, systém umístí aplikaci do režimu spánku a pokračuje ve stahování požadovaných dat na pozadí.
- Jakmile systém dokončí stahování, vytvoří novou úlohu pro probuzení aplikace, aby mohl zpracovávat stažené informace. Viz Zpracování úloh na pozadí a zpracování stahování níže .
- Aplikace uloží aktualizované informace a označí dokončený úkol. Vývojář může být v tuto chvíli lákavý aktualizovat uživatelské rozhraní aplikace, ale Apple navrhuje naplánovat úlohu snímku pro zpracování tohoto procesu. Viz Plánování aktualizace snímků níže.
- Aplikace obdrží úlohu snímku, aktualizuje své uživatelské rozhraní a označí dokončenou úlohu. Viz Zpracování aktualizace snímku níže.
Plánování NSUrlSession
K naplánování stahování nejnovějších skóre je možné použít následující kód:
private void ScheduleURLUpdateSession ()
{
// Create new configuration
var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration ("com.example.urlsession");
// Create new session
var backgroundSession = NSUrlSession.FromConfiguration (configuration);
// Create and start download task
var downloadTask = backgroundSession.CreateDownloadTask (new NSUrl ("https://example.com/gamexxx/currentScores.json"));
downloadTask.Resume ();
}
Konfiguruje a vytvoří novou NSUrlSession
a pak pomocí této relace vytvoří novou úlohu stahování pomocí CreateDownloadTask
metody. Volá Resume
metodu úlohy stahování ke spuštění relace.
Zpracování úloh na pozadí
Přepsáním HandleBackgroundTasks
metody WKExtensionDelegate
aplikace dokáže zpracovat příchozí úlohy na pozadí:
using System;
using System.Collections.Generic;
using Foundation;
using WatchKit;
namespace MonkeySoccer.MonkeySoccerExtension
{
public class ExtensionDelegate : WKExtensionDelegate
{
#region Computed Properties
public List<WKRefreshBackgroundTask> PendingTasks { get; set; } = new List<WKRefreshBackgroundTask> ();
#endregion
...
#region Public Methods
public void CompleteTask (WKRefreshBackgroundTask task)
{
// Mark the task completed and remove from the collection
task.SetTaskCompleted ();
PendingTasks.Remove (task);
}
#endregion
#region Override Methods
public override void HandleBackgroundTasks (NSSet<WKRefreshBackgroundTask> backgroundTasks)
{
// Handle background request
foreach (WKRefreshBackgroundTask task in backgroundTasks) {
// Is this a background session task?
var urlTask = task as WKUrlSessionRefreshBackgroundTask;
if (urlTask != null) {
// Create new configuration
var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration (urlTask.SessionIdentifier);
// Create new session
var backgroundSession = NSUrlSession.FromConfiguration (configuration, new BackgroundSessionDelegate (this, task), null);
// Keep track of all pending tasks
PendingTasks.Add (task);
} else {
// Ensure that all tasks are completed
task.SetTaskCompleted ();
}
}
}
#endregion
...
}
}
Metoda HandleBackgroundTasks
prochází všemi úkoly, které systém odeslala aplikaci (v backgroundTasks
) hledání .WKUrlSessionRefreshBackgroundTask
Pokud se najde, znovu se připojí k relaci a připojí NSUrlSessionDownloadDelegate
ji ke zpracování dokončení stahování (viz Zpracování dokončení stahování níže):
// Create new session
var backgroundSession = NSUrlSession.FromConfiguration (configuration, new BackgroundSessionDelegate (this, task), null);
Zůstane popisovač u úlohy, dokud ho nedokončí, a to tak, že ho přidá do kolekce:
public List<WKRefreshBackgroundTask> PendingTasks { get; set; } = new List<WKRefreshBackgroundTask> ();
...
// Keep track of all pending tasks
PendingTasks.Add (task);
Všechny úkoly odeslané do aplikace musí být dokončeny, pro všechny úkoly, které se aktuálně nezpracovávají, označte je jako dokončené:
if (urlTask != null) {
...
} else {
// Ensure that all tasks are completed
task.SetTaskCompleted ();
}
Zpracování dokončení stahování
Aplikace MonkeySoccer používá k zpracování dokončení stahování a zpracování požadovaných dat následující NSUrlSessionDownloadDelegate
delegát:
using System;
using Foundation;
using WatchKit;
namespace MonkeySoccer.MonkeySoccerExtension
{
public class BackgroundSessionDelegate : NSUrlSessionDownloadDelegate
{
#region Computed Properties
public ExtensionDelegate WatchExtensionDelegate { get; set; }
public WKRefreshBackgroundTask Task { get; set; }
#endregion
#region Constructors
public BackgroundSessionDelegate (ExtensionDelegate extensionDelegate, WKRefreshBackgroundTask task)
{
// Initialize
this.WatchExtensionDelegate = extensionDelegate;
this.Task = task;
}
#endregion
#region Override Methods
public override void DidFinishDownloading (NSUrlSession session, NSUrlSessionDownloadTask downloadTask, NSUrl location)
{
// Handle the downloaded data
...
// Mark the task completed
WatchExtensionDelegate.CompleteTask (Task);
}
#endregion
}
}
Při inicializaci zachová popisovač jak pro, ExtensionDelegate
tak i pro ten, který ho WKRefreshBackgroundTask
vznikl. Přepíše metodu pro DidFinishDownloading
zpracování dokončení stahování. Pak pomocí CompleteTask
metody ExtensionDelegate
informovat úkol, že byl dokončen a odebrán z kolekce čekajících úkolů. Viz Zpracování úloh na pozadí výše.
Plánování aktualizace snímků
Následující kód lze použít k naplánování úlohy snímku k aktualizaci uživatelského rozhraní s nejnovějšími skóre:
private void ScheduleSnapshotUpdate ()
{
// Create a fire date of now
var fireDate = NSDate.FromTimeIntervalSinceNow (0);
// Create user info dictionary
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("lastActiveDate"), NSDate.FromTimeIntervalSinceNow (0));
userInfo.Add (new NSString ("reason"), new NSString ("UpdateScore"));
// Schedule for update
WKExtension.SharedExtension.ScheduleSnapshotRefresh (fireDate, userInfo, (error) => {
// Was the Task successfully scheduled?
if (error == null) {
// Yes, handle if needed
} else {
// No, report error
}
});
}
Stejně jako ScheduleURLUpdateSession
výše uvedená metoda vytvoří novou NSDate
, když aplikace chce býtwoken a vytvoří NSMutableDictionary
pro uložení podrobností požadované úlohy. Metoda ScheduleSnapshotRefresh
SharedExtension
se používá k vyžádání naplánované úlohy.
Systém vrátí NSError
, pokud nemohl naplánovat požadovaný úkol.
Zpracování aktualizace snímku
Pro zpracování úlohy snímku je metoda (viz Zpracování úloh na pozadí výše) upravena tak, HandleBackgroundTasks
aby vypadala takto:
public override void HandleBackgroundTasks (NSSet<WKRefreshBackgroundTask> backgroundTasks)
{
// Handle background request
foreach (WKRefreshBackgroundTask task in backgroundTasks) {
// Take action based on task type
if (task is WKUrlSessionRefreshBackgroundTask) {
var urlTask = task as WKUrlSessionRefreshBackgroundTask;
// Create new configuration
var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration (urlTask.SessionIdentifier);
// Create new session
var backgroundSession = NSUrlSession.FromConfiguration (configuration, new BackgroundSessionDelegate (this, task), null);
// Keep track of all pending tasks
PendingTasks.Add (task);
} else if (task is WKSnapshotRefreshBackgroundTask) {
var snapshotTask = task as WKSnapshotRefreshBackgroundTask;
// Update UI
...
// Create a expiration date 30 minutes into the future
var expirationDate = NSDate.FromTimeIntervalSinceNow (30 * 60);
// Create user info dictionary
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("lastActiveDate"), NSDate.FromTimeIntervalSinceNow (0));
userInfo.Add (new NSString ("reason"), new NSString ("UpdateScore"));
// Mark task complete
snapshotTask.SetTaskCompleted (false, expirationDate, userInfo);
} else {
// Ensure that all tasks are completed
task.SetTaskCompleted ();
}
}
}
Metoda testuje typ zpracovávané úlohy. Pokud se jedná o WKSnapshotRefreshBackgroundTask
přístup k úkolu:
var snapshotTask = task as WKSnapshotRefreshBackgroundTask;
Metoda aktualizuje uživatelské rozhraní a pak vytvoří NSDate
systém, když bude snímek zastaralý. NSMutableDictionary
Vytvoří s informacemi o uživateli popis nového snímku a označí úlohu snímku dokončenou pomocí těchto informací:
// Mark task complete
snapshotTask.SetTaskCompleted (false, expirationDate, userInfo);
Kromě toho také informuje úlohu snímku, že se aplikace nevrátí do výchozího stavu (v prvním parametru). Aplikace, které nemají žádný koncept výchozího stavu by vždy měly tuto vlastnost nastavit na true
.
Efektivní práce
Jak je vidět ve výše uvedeném příkladu pětiminutového okna, které aplikace MonkeySoccer vzala k aktualizaci svých skóre efektivním fungováním a používáním nových úkolů na pozadí watchOS 3, byla aplikace aktivní pouze po dobu celkem 15 sekund:
To snižuje dopad, který aplikace bude mít na dostupné prostředky Apple Watch a životnost baterie, a také umožňuje aplikaci pracovat lépe s jinými aplikacemi běžícími na hodinkách.
Jak funguje plánování
Zatímco aplikace watchOS 3 je v popředí, je vždy naplánovaná na spuštění a může provádět jakýkoli typ zpracování, například aktualizovat data nebo překreslit jeho uživatelské rozhraní. Když se aplikace přesune na pozadí, systém ji obvykle pozastaví a všechny operace za běhu se zastaví.
Zatímco je aplikace na pozadí, může být cílem systému rychle spustit konkrétní úlohu. Takže ve watchOS 2 může systém dočasně probudit aplikaci na pozadí, aby mohl dělat věci, jako je zpracování dlouhého oznámení nebo aktualizace komplikace aplikace. Ve watchOS 3 existuje několik nových způsobů, jak lze aplikaci spustit na pozadí.
Zatímco je aplikace na pozadí, systém na něm ukládá několik omezení:
- Dokončení každého daného úkolu je dáno jen několik sekund. Systém bere v úvahu nejen dobu, po kterou uplynula, ale také to, kolik výkonu procesoru aplikace spotřebovávají k odvození tohoto limitu.
- Každá aplikace, která překračuje limity, se ukončí s následujícími kódy chyb:
- CPU – 0xc51bad01
- Čas – 0xc51bad02
- Systém bude uplatňovat různá omezení na základě typu úlohy na pozadí, o kterou aplikace požádala. Například
WKApplicationRefreshBackgroundTask
úkolyWKURLSessionRefreshBackgroundTask
mají mírně delší moduly runtime oproti jiným typům úloh na pozadí.
Komplikace a Aktualizace aplikací
Kromě nových úloh na pozadí, které Apple přidal do watchOS 3, můžou mít komplikace aplikace watchOS vliv na to, jak a kdy aplikace přijímá aktualizace na pozadí.
Komplikace jsou malé vizuální prvky, které poskytují užitečné informace na první pohled. V závislosti na vybraném ciferníku má uživatel možnost přizpůsobit ciferník s jednou nebo více komplikacemi, které může aplikace kukátek v watchOS 3 dodat.
Pokud uživatel na obličeji hodinek zahrne jednu z komplikací aplikace, poskytne aplikaci následující aktualizované výhody:
- Způsobuje, že systém udržuje aplikaci ve stavu připraveného ke spuštění, kde se pokusí spustit aplikaci na pozadí, udržuje ji v paměti a poskytuje další čas na aktualizaci.
- Komplikace jsou garantované alespoň 50 nabízených aktualizací za den.
Vývojář by se měl vždy snažit vytvářet poutavé komplikace pro své aplikace, aby uživatele přinutil přidat do ciferníku z výše uvedených důvodů.
Ve watchOS 2 byly komplikace primárním způsobem, jakým aplikace přijala modul runtime na pozadí. Ve watchOS 3 bude aplikace komplikace stále zajištěna, aby dostávala více aktualizací za hodinu, ale může použít WKExtensions
k vyžádání dalšího modulu runtime, aby aktualizovala své komplikace.
Podívejte se na následující kód použitý k aktualizaci komplikace z připojené aplikace i Telefon:
using System;
using WatchConnectivity;
using UIKit;
using Foundation;
using System.Collections.Generic;
using System.Linq;
...
private void UpdateComplication ()
{
// Get session and the number of remaining transfers
var session = WCSession.DefaultSession;
var transfers = session.RemainingComplicationUserInfoTransfers;
// Create user info dictionary
var iconattrs = new Dictionary<NSString, NSObject>
{
{new NSString ("lastActiveDate"), NSDate.FromTimeIntervalSinceNow (0)},
{new NSString ("reason"), new NSString ("UpdateScore")}
};
var userInfo = NSDictionary<NSString, NSObject>.FromObjectsAndKeys (iconattrs.Values.ToArray (), iconattrs.Keys.ToArray ());
// Take action based on the number of transfers left
if (transfers < 1) {
// No transfers left, either attempt to send or inform
// user of situation.
...
} else if (transfers < 11) {
// Running low on transfers, only send on important updates
// else conserve for a significant change.
...
} else {
// Send data
session.TransferCurrentComplicationUserInfo (userInfo);
}
}
Pomocí RemainingComplicationUserInfoTransfers
vlastnosti aplikace WCSession
zjistí, kolik přenosů s vysokou prioritou aplikace zbývá na den, a pak provede akci na základě tohoto čísla. Pokud aplikace začne s nízkými nároky na přenosy, může oddržet odesílání dílčích aktualizací a odesílat informace jenom v případě významné změny.
Plánování a dock
Ve watchOS 3 přidal Apple Dock, kde si uživatelé můžou připnout své oblíbené aplikace a rychle k nim přistupovat. Když uživatel stiskne tlačítko Bok na Apple Watch, zobrazí se galerie připnutých snímků aplikace. Uživatel může požadovanou aplikaci najít potažením prstem doleva nebo doprava a klepnutím na aplikaci ji spusťte a nahraďte snímek rozhraním spuštěné aplikace.
Systém pravidelně pořizuje snímky uživatelského rozhraní aplikace a tyto snímky používá k naplnění Dokumentace. watchOS dává aplikaci příležitost aktualizovat svůj obsah a uživatelské rozhraní před pořízením tohoto snímku.
Aplikace, které byly připnuté do docku, mohou očekávat následující:
- Obdrží minimálně jednu aktualizaci za hodinu. To zahrnuje úlohu aktualizace aplikace i úlohu snímku.
- Rozpočet aktualizací se distribuuje mezi všechny aplikace v Docku. Čím méně aplikací uživatel připnul, tím více potenciálních aktualizací každá aplikace obdrží.
- Aplikace se bude uchovávat v paměti, aby se aplikace po výběru z Docku rychle obnovila.
Poslední spuštěná aplikace se považuje za naposledy použitou aplikaci a bude zabírat poslední slot v Docku. Tam se uživatel může rozhodnout, že ho trvale připne do Docku. Naposledy použité bude považováno za jakoukoli jinou oblíbenou aplikaci, která už uživatel připnul do Docku.
Důležité
Aplikace, které byly přidány pouze na domovskou obrazovku, nebudou mít žádné pravidelné plánování. Pokud chcete dostávat pravidelné plánování a aktualizace na pozadí, musí být aplikace přidána do Docku.
Jak jsme uvedli dříve v tomto dokumentu, snímky jsou ve watchOS 3 velmi důležité, protože fungují jako náhled i spouštěcí obrázky pro aplikaci. Pokud se uživatel v Docku vypořádá s aplikací, rozbalí se na celou obrazovku, přejde do popředí a začne běžet, takže je nezbytné, aby snímek byl aktuální.
Někdy se může stát, že systém rozhodne, že potřebuje nový snímek uživatelského rozhraní aplikace. V těchto situacích se požadavek na snímek nezapočítá do rozpočtu aplikace za běhu. Následující příkaz aktivuje požadavek na snímek systému:
- Aktualizace časové osy komplikací
- Interakce uživatele s oznámením aplikace
- Přechod z popředí na stav Pozadí
- Po jedné hodině, kdy se nacházíte ve stavu Pozadí, se aplikace může vrátit do výchozího stavu.
- Při prvním spuštění watchOS.
Osvědčené postupy
Apple navrhuje následující osvědčené postupy při práci s úlohami na pozadí:
- Naplánujte tak často, jak často je potřeba aplikaci aktualizovat. Pokaždé, když aplikace spustí, by měla znovu vyhodnotit své budoucí potřeby a podle potřeby tento plán upravit.
- Pokud systém odešle úlohu aktualizace na pozadí a aplikace nevyžaduje aktualizaci, odložte práci, dokud se aktualizace skutečně nevyžaduje.
- Vezměte v úvahu všechny příležitosti modulu runtime dostupné pro aplikaci:
- Aktivace ukotvení a popředí
- Oznámení.
- Aktualizace komplikací.
- Aktualizuje se pozadí.
- Používá se
ScheduleBackgroundRefresh
pro modul runtime pro obecné účely na pozadí, například:- Dotazování systému na informace
- Naplánujte budoucí
NSURLSessions
žádost o data na pozadí. - Známé časové přechody.
- Aktivace aktualizací komplikací
Osvědčené postupy pro snímky
Při práci s aktualizacemi snímků apple nabídne následující návrhy:
- Zneplatnit snímky pouze v případě, že se vyžaduje, například když dojde k významné změně obsahu.
- Vyhněte se zneplatnění snímků s vysokou frekvencí. Aplikace časovače by například neměla každou sekundu aktualizovat snímek, měla by se provést pouze po ukončení časovače.
Tok dat aplikací
Apple navrhuje následující možnosti pro práci s tokem dat:
Externí událost (například Watch Připojení ivity) aplikaci probudí. Tím vynutíte, aby aplikace aktualizovala svůj datový model (který představuje aktuální stav aplikací). V důsledku změny datového modelu bude aplikace muset aktualizovat své komplikace, požádat o nový snímek, případně spustit pozadí NSURLSession
pro načtení dalších dat a naplánovat další aktualizace na pozadí.
Životní cyklus aplikace
Vzhledem k doku a možnosti připnout k němu oblíbené aplikace, Apple si myslí, že uživatelé budou přesouvat mezi mnohem více aplikacemi, mnohem častěji, pak udělali s watchOS 2. Aplikace by proto měla být připravená na zpracování této změny a rychle přecházet mezi stavy popředí a pozadí.
Apple nabízí následující návrhy:
- Při zadávání aktivace na popředí se ujistěte, že aplikace co nejdříve dokončí jakoukoli úlohu na pozadí.
- Před vstupem na pozadí nezapomeňte dokončit veškerou práci na popředí voláním
NSProcessInfo.PerformExpiringActivity
. - Při testování aplikace v simulátoru watchOS se nevynutí žádné rozpočty úkolů, aby se aplikace mohl aktualizovat podle potřeby, aby správně otestování funkce.
- Před publikováním do iTunes Připojení vždy testujte na skutečném hardwaru Apple Watch a ujistěte se, že aplikace neběží po rozpočtech.
- Apple navrhuje zachovat Apple Watch na nabíječkě při testování a ladění.
- Ujistěte se, že se důkladně testují jak studené spouštění, tak obnovení aplikace.
- Ověřte, že jsou dokončené všechny úkoly aplikace.
- Liší se počet aplikací připnutých v Docku a otestujte nejlepší i nejhorší scénáře.
Shrnutí
Tento článek se zabývá vylepšeními, která společnost Apple provedla pro watchOS a jak je lze použít k udržování aktuální aplikace pro kukátky. Nejprve jsme probrali všechny nové úlohy na pozadí, které apple přidal do watchOS 3. Pak se věnovali životnímu cyklu rozhraní API na pozadí a způsobu implementace úloh na pozadí v aplikaci Xamarin watchOS. Nakonec se zabývala fungováním plánování a poskytla několik osvědčených postupů.