Proaktivní návrhy watchOS v Xamarinu
Tento článek ukazuje, jak pomocí proaktivních návrhů v aplikaci watchOS 3 řídit zapojení tím, že systému umožníte proaktivně prezentovat uživateli užitečné informace automaticky.
Novinkou ve watchOS 3 jsou proaktivní návrhy, které uživatelům umožňují zapojit se do aplikace Xamarin.iOS proaktivně tím, že uživateli v odpovídající době proaktivně prezentují užitečné informace.
O proaktivních návrzích
Novinkou MapItem
ve watchOS 3 je vlastnost, NSUserActivity
která aplikaci umožňuje poskytovat informace o poloze, které se dají použít v jiných kontextech. Pokud například aplikace zobrazila recenze hotelů a poskytovala MapItem
polohu, pokud uživatel přepnul na aplikaci Mapy, umístění hotelu, který si právě prohlížel, by bylo dostupné.
Aplikace tuto funkci zpřístupní systému pomocí kolekce technologií, jako NSUserActivity
je MapKit, Přehrávač médií a UIKit. Kromě toho tím, že pro aplikaci poskytnete proaktivní podporu návrhů, můžou být integrace Siri zdarma hlubší.
Návrhy založené na poloze
Třída novinkou NSUserActivity
pro watchOS 3 obsahuje MapItem
vlastnost, která vývojáři umožňuje poskytovat informace o poloze, které lze použít v jiných kontextech. Pokud například aplikace zobrazuje recenze restaurace, může vývojář nastavit MapItem
vlastnost na umístění restaurace, kterou uživatel v aplikaci zobrazuje. Pokud uživatel přepne do aplikace Mapy, bude umístění restaurace automaticky dostupné.
Pokud aplikace podporuje vyhledávání aplikací, může pomocí nových komponent CSSearchableItemAttributesSet
adres třídy určit umístění, která může uživatel chtít navštívit. MapItem
Nastavením vlastnosti se ostatní vlastnosti vyplní automaticky.
Kromě nastavení Latitude
vlastností komponenty adresy Longitude
se doporučuje, aby aplikace také doručovat NamedLocation
vlastnosti a PhoneNumbers
vlastnosti, aby Siri mohl zahájit volání do umístění.
Kontextová připomenutí Siri
Umožňuje uživateli používat Siri k rychlému připomenutí k zobrazení obsahu, který si právě prohlíží v aplikaci, a to později. Pokud si například prohlíželi recenzi restaurace v aplikaci, mohli by vyvolat Siri a říct "Připomeňte mi o tom, až se vrátím domů". Siri vygeneruje připomenutí odkazem na recenzi v aplikaci.
Implementace proaktivních návrhů
Přidání podpory proaktivního návrhu do aplikace Xamarin.iOS je obvykle stejně snadné jako implementace několika rozhraní API nebo rozšíření několika rozhraní API, která už může aplikace implementovat.
Proaktivní návrhy pracují s aplikacemi třemi hlavními způsoby:
NSUserActivity
- Pomáhá systému pochopit, s jakými informacemi uživatel aktuálně pracuje na obrazovce.- Návrhy umístění – Pokud aplikace nabízí nebo využívá informace založené na poloze, nabízí toto rozšíření rozhraní API nové způsoby sdílení těchto informací napříč aplikacemi.
A v aplikaci se podporuje implementací následujících:
- Kontextová připomenutí Siri – V iOSu 10 byla rozšířena, aby Siri rychle zobrazila obsah,
NSUserActivity
který si v aplikaci právě prohlíží, později. - Návrhy umístění – iOS 10 vylepšuje
NSUserActivity
zachycení umístění zobrazených uvnitř aplikace a jejich propagaci na mnoha místech v celém systému. - Kontextové žádosti -
NSUserActivity
o Siri poskytují kontext informacím v aplikaci siri, aby uživatel mohl získat navigační pokyny nebo zavolat Siri z aplikace.
Všechny tyto funkce mají jednu věc společné, všechny používají NSUserActivity
v jedné nebo jiné formě k poskytování svých funkcí.
NSUserActivity
Jak je uvedeno výše, pomáhá systému pochopit, NSUserActivity
s jakými informacemi uživatel aktuálně pracuje na obrazovce. NSUserActivity
je lehký mechanismus ukládání stavu do mezipaměti, který zachycuje aktivitu uživatele při procházení aplikace. Například při pohledu na aplikaci restaurace:
Při následujících interakcích:
- Když uživatel pracuje s aplikací,
NSUserActivity
vytvoří se k opětovnému vytvoření stavu aplikace později. - Pokud uživatel hledá restauraci, následuje stejný vzor vytváření aktivit.
- A znovu, když uživatel zobrazí výsledek. V tomto posledním případě si uživatel prohlíží umístění a v iOSu 10 si systém více uvědomuje určité koncepty (například umístění nebo interakce komunikace).
Podívejte se podrobněji na poslední obrazovku:
Tady aplikace vytváří a NSUserActivity
je naplněná informacemi, které později vytvoří znovu. Aplikace také obsahovala určitá metadata, jako je název a adresa umístění. Při vytvoření této aktivity aplikace informuje iOS, že představuje aktuální stav uživatele.
Aplikace se pak rozhodne, jestli se aktivita bude inzerovat za účelem předání, uloží se jako dočasná hodnota pro návrhy polohy nebo se přidá do indexu Spotlight na zařízení pro zobrazení ve výsledcích hledání.
Další informace o hledání Handoff a Spotlight najdete v našich příručkách Úvod k handoff a iOS 9 New Search API.
Vytvoření aktivity
Před vytvořením aktivity bude potřeba vytvořit identifikátor typu aktivity, aby ho identifikoval. Identifikátor typu aktivity je krátký řetězec přidaný do NSUserActivityTypes
pole souboru aplikace Info.plist
sloužícího k jedinečné identifikaci daného typu aktivity uživatele. V poli bude jedna položka pro každou aktivitu, kterou aplikace podporuje a zveřejňuje pro vyhledávání aplikací. Další podrobnosti najdete v referenčních informacích k vytváření identifikátorů typů aktivit.
Podívejte se na příklad aktivity:
// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");
// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));
// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;
// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;
// Inform system of Activity
activity.BecomeCurrent();
Vytvoří se nová aktivita pomocí identifikátoru typu aktivity. Dále se vytvoří některá metadata definující aktivitu, aby se tento stav mohl obnovit později. Potom se aktivita zobrazí smysluplně a připojí se k informacím o uživateli. Nakonec jsou povolené některé funkce a aktivita se odešle do systému.
Výše uvedený kód by mohl být dále rozšířen tak, aby zahrnoval metadata, která poskytují kontext aktivity provedením následujících změn:
...
// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" };
activity.ContentAttributeSet = attributes;
// Inform system of Activity
activity.BecomeCurrent();
Pokud má vývojář web, který dokáže zobrazit stejné informace jako aplikace, může aplikace obsahovat adresu URL a obsah se dá zobrazit na jiných zařízeních, která nemají nainstalovanou aplikaci (prostřednictvím předání):
// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");
Obnovení aktivity
Pokud chcete odpovědět uživateli, který klepne na výsledek hledání (NSUserActivity
) aplikace, upravte soubor AppDelegate.cs a přepište metodu ContinueUserActivity
. Příklad:
public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
// Take action based on the activity type
switch (userActivity.ActivityType) {
case "com.xamarin.platform":
// Restore the state of the app here...
break;
}
return true;
}
Ujistěte se, že se jedná o stejný identifikátor typu aktivity (com.xamarin.platform
) jako aktivita vytvořená výše. Aplikace používá informace uložené v úložišti NSUserActivity
k obnovení stavu zpět do místa, kde uživatel přestal.
Výhody vytvoření aktivity
S minimálním množstvím výše uvedeného kódu teď aplikace dokáže využívat tři nové funkce iOS 10:
- Handoff
- Vyhledávání spotlightů
- Kontextová připomenutí Siri
V následující části se podíváme na povolení dvou dalších nových funkcí iOS 10:
- Návrhy polohy
- Kontextové požadavky Siri
Návrhy založené na poloze
Podívejte se na příklad výše uvedené aplikace pro vyhledávání restaurací. Pokud se implementovala NSUserActivity
a správně naplnila všechna metadata a atributy, uživatel by mohl provést následující akce:
- V aplikaci najděte restauraci, ve které by se chtěli setkat s přítelem.
- Pokud uživatel přepne do aplikace Mapy, adresa restaurace se automaticky navrhne jako cíl.
- To funguje i pro aplikace třetích stran (které podporují
NSUserActivity
), aby uživatel mohl přejít na aplikaci pro sdílení jízdy a adresa restaurace se automaticky navrhne jako cíl i tam. - Poskytuje také kontext pro Siri, takže uživatel může vyvolat Siri v aplikaci restaurace a požádat " Získat navigační pokyny..." a Siri poskytne pokyny k restauraci, která si uživatel prohlíží.
Všechny výše uvedené funkce mají jednu věc společné, všechny označují, odkud návrh původně pochází. V případě výše uvedeného příkladu se jedná o fiktivní aplikaci pro kontrolu restaurace.
WatchOS 3 je vylepšená tak, aby tuto funkci pro aplikaci umožňovala několika drobnými úpravami a doplněními stávajících architektur:
NSUserActivity
obsahuje další pole pro zachytávání informací o poloze, které jsou zobrazeny uvnitř aplikace.- V MapKitu a CoreSpotlightu bylo provedeno několik doplňků pro zachycení umístění.
- Funkce pro sledování polohy byla přidána do Siri, Mapy, multitaskingu a dalších aplikací v systému.
Pokud chcete implementovat návrhy založené na poloze, začněte stejným kódem aktivity uvedeným výše:
// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");
// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));
// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;
// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;
// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" };
activity.ContentAttributeSet = attributes;
// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");
// Inform system of Activity
activity.BecomeCurrent();
Pokud aplikace používá MapKit, stačí k aktivitě přidat aktuální mapu MKMapItem
:
// Save MKMapItem location
activity.MapItem = myMapItem;
Pokud aplikace nepoužívá MapKit, může přijmout Vyhledávání aplikací a zadat následující nové atributy pro umístění:
// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
...
attributes.NamedLocation = "Apple Inc.";
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;
Podrobně se podívejte na výše uvedený kód. Nejprve se v každé instanci vyžaduje název umístění:
attributes.NamedLocation = "Apple Inc.";
Potom textový popis požadovaný pro textové instance (například klávesnici QuickType):
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
Zeměpisná šířka a zeměpisná délka jsou volitelné, ale ujistěte se, že je uživatel směrován na přesné místo, kam je chce aplikace odeslat:
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
Nastavením telefonních čísel může aplikace získat přístup k Siri, aby uživatel mohl vyvolat Siri z aplikace tak, že řekne něco jako "Zavolat na toto místo":
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
Aplikace může nakonec označit, jestli je instance vhodná pro navigaci a telefonní hovory:
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;
Osvědčené postupy pro aktivity
Apple navrhuje následující osvědčené postupy při práci s aktivitami:
- Používá se
NeedsSave
pro opožděné aktualizace datové části. - Ujistěte se, že chcete zachovat silný odkaz na aktuální aktivitu.
- Přeneste jen malé datové části, které obsahují jenom dostatek informací pro obnovení stavu.
- Ujistěte se, že identifikátory typu aktivity jsou jedinečné a popisné pomocí zpětného zápisu DNS k jejich určení.
Využívání návrhů polohy
Tato další část se zabývá používáním návrhů na polohu, které pocházejí z jiných částí systému (například aplikace Mapy) nebo jiných aplikací třetích stran.
Návrhy aplikací a umístění směrování
V této části se podíváme na využívání návrhů polohy přímo ze směrovací aplikace. Aby aplikace směrování přidala tuto funkci, bude vývojář využívat stávající MKDirectionsRequest
architekturu následujícím způsobem:
- Zvýšení úrovně aplikace v multitaskingu
- Pokud chcete aplikaci zaregistrovat jako směrovací aplikaci.
- Zpracování spuštění aplikace pomocí objektu MapKit
MKDirectionsRequest
. - Dejte watchOS možnost učit se navrhovat aplikaci na základě zapojení uživatelů.
Když je aplikace spuštěna s objektem MapKit MKDirectionsRequest
, měla by se automaticky začít směrovat uživatele na požadované místo nebo prezentovat uživatelské rozhraní, které uživateli usnadní zahájení získávání pokynů. Příklad:
using System;
using Foundation;
using UIKit;
using MapKit;
using CoreLocation;
namespace MonkeyChat
{
[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate, IUISplitViewControllerDelegate
{
...
public override bool OpenUrl (UIApplication app, NSUrl url, NSDictionary options)
{
if (MKDirectionsRequest.IsDirectionsRequestUrl (url)) {
var request = new MKDirectionsRequest (url);
var coordinate = request.Destination?.Placemark.Location?.Coordinate;
var address = request.Destination.Placemark.AddressDictionary;
if (coordinate.IsValid()) {
var geocoder = new CLGeocoder ();
geocoder.GeocodeAddress (address, (place, err) => {
// Handle the display of the address
});
}
}
return true;
}
}
}
Podrobně se podívejte na tento kód. Testuje, jestli se jedná o platný cílový požadavek:
if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {
Pokud ano, vytvoří MKDirectionsRequest
z adresy URL:
var request = new MKDirectionsRequest(url);
V watchOS 3 je možné aplikaci odeslat adresu, která nemá geografické souřadnice, protože vývojář potřebuje zakódovat adresu:
var geocoder = new CLGeocoder();
geocoder.GeocodeAddress(address, (place, err)=> {
// Handle the display of the address
});
Shrnutí
Tento článek popisuje proaktivní návrhy a ukázal, jak je vývojář může použít k řízení provozu do aplikace Xamarin.iOS pro watchOS. Tento krok zahrnoval implementaci proaktivních návrhů a prezentovaných pokynů k používání.