Předání v Xamarin.iOS

Tento článek popisuje práci s handoffem v aplikaci Xamarin.iOS na přenosu aktivit uživatelů mezi aplikacemi spuštěných na jiných zařízeních uživatele.

Apple představil Handoff v iOSu 8 a OS X Yosemite (10.10), aby uživatelům poskytoval společný mechanismus pro přenos aktivit spuštěných na jednom ze svých zařízení do jiného zařízení, na které běží stejná aplikace, nebo do jiné aplikace, která podporuje stejnou aktivitu.

Příklad provedení operace předání

V tomto článku se rychle podíváme na povolení sdílení aktivit v aplikaci Xamarin.iOS a podrobně se podíváme na rozhraní Handoff:

Informace o předání

Společnost Apple zavedla předání (označované také jako kontinuita) v iOSu 8 a OS X Yosemite (10.10) jako způsob, jak může uživatel spustit aktivitu na jednom ze svých zařízení (iOS nebo Mac) a pokračovat v této aktivitě na jiném ze svých zařízení (jak ho identifikoval uživatelský účet iCloudu).

Handoff byl v iOSu 9 rozšířen o podporu nových vylepšených možností vyhledávání. Další informace najdete v naší dokumentaci k vylepšením vyhledávání.

Uživatel může například na svém počítači iPhone spustit e-mail a bez problémů pokračovat v e-mailu na svém počítači Mac se všemi vyplněnými stejnými informacemi o zprávě a kurzorem na stejném místě, kde ho opustil v iOSu.

Každá z vašich aplikací, které sdílejí stejné ID týmu, má nárok na používání Handoff k pokračování aktivit uživatelů napříč aplikacemi, pokud jsou tyto aplikace doručeny prostřednictvím iTunes App Store nebo podepsány registrovaným vývojářem (pro Mac, Enterprise nebo ad hoc aplikace).

Všechny aplikace nebo mají automaticky integrovanou podporu Handoff a vyžadují minimální změny, NSDocumentUIDocument aby se předání podporovalo.

Pokračování aktivit uživatelů

Třída (spolu s některými malými změnami v a ) poskytuje podporu pro definování aktivity uživatele, kterou je možné potenciálně pokračovat na jiném NSUserActivityUIKit zařízení AppKit uživatele.

Aby byla aktivita předána jinému ze zařízení uživatele, musí být zapouzdřena v instanci , která je označená jako aktuální aktivita, mít sadu datové části (data použitá k provedení pokračování) a aktivita se pak musí na toto zařízení NSUserActivity přeposílat. NSUserActivity

Handoff předává hojně minimální množství informací a definuje aktivitu, která se má pokračovat, a větší datové pakety se synchronizují přes iCloud.

Na přijímajícím zařízení obdrží uživatel oznámení, že je k dispozici aktivita pro pokračování. Pokud se uživatel rozhodne pokračovat v aktivitě na novém zařízení, spustí se zadaná aplikace (pokud ještě není spuštěná) a datová část z se použije k restartování NSUserActivity aktivity.

Přehled pokračujících aktivit uživatelů

K pokračování mají nárok pouze aplikace, které sdílejí stejné ID vývojářského týmu a reagují na daný typ aktivity. Aplikace definuje typy aktivit, které podporuje, v NSUserActivityTypes klíči svého souboru NSUserActivityTypes Vzhledem k tomu zařízení, které pokračuje, zvolí aplikaci, aby pokračovala, na základě ID týmu, typu aktivity a volitelně názvu aktivity.

Přijímající aplikace používá informace ze slovníku ke konfiguraci uživatelského rozhraní a obnovení stavu dané aktivity tak, aby se přechod pro NSUserActivityUserInfo koncového uživatele zdál bezproblémový.

Pokud pokračování vyžaduje více informací, než je možné odeslat efektivně prostřednictvím , může obnovení aplikace odeslat volání do původní aplikace a vytvořit jeden nebo více datových proudů pro přenos NSUserActivity požadovaných dat. Pokud například aktivita upravuje velký textový dokument s více obrázky, streamování by vyžadovalo přenos informací potřebných k pokračování aktivity na přijímajícím zařízení. Další informace najdete v části Podpora pokračování Toky níže.

Jak je uvedeno výše, NSDocument nebo mají aplikace založené automaticky UIDocument integrovanou podporu předání. Další informace najdete níže v části Podpora předání Document-Based aplikacích.

Třída NSUserActivity

Třída je primárním objektem v výměně Handoff a slouží k zapouzdření stavu aktivity uživatele, která je k dispozici NSUserActivity pro pokračování. Aplikace vytvoří instanci kopie pro všechny aktivity, které podporuje, a NSUserActivity chce pokračovat na jiném zařízení. Editor dokumentů například vytvoří aktivitu pro každý aktuálně otevřený dokument. Aktuální aktivita je ale jenom první dokument (zobrazený v okně nejvíce na frontmě nebo na kartě) a pro pokračování je k dispozici.

Instance je NSUserActivity identifikována podle vlastností ActivityType i Title . Vlastnost UserInfo dictionary slouží k přenosu informací o stavu aktivity. Pokud chcete NeedsSavetrue opožděně načíst informace o stavu prostřednictvím delegáta , nastavte vlastnost NSUserActivity na . Pomocí metody můžete sloučit nová data z jiných klientů do slovníku podle potřeby, aby se zachoval AddUserInfoEntriesUserInfo stav aktivity.

Třída NSUserActivityDelegate

Slouží k tomu, aby informace ve slovníku byla aktuální a synchronizovaná s aktuálním NSUserActivityDelegateNSUserActivityUserInfo stavem aktivity. Když systém potřebuje aktualizovat informace v aktivitě (například před pokračováním na jiném zařízení), volá UserActivityWillSave metodu delegáta.

Budete muset implementovat metodu a provést jakékoli změny v UserActivityWillSaveNSUserActivity (například UserInfo , Title atd.). a ujistěte se, že stále odráží stav aktuální aktivity. Když systém zavolá UserActivityWillSave metodu , NeedsSave příznak se vyjme. Pokud upravíte vlastnosti dat aktivity, budete muset nastavit na NeedsSavetrue hodnotu znovu.

Místo výše uvedené metody můžete volitelně nastavit nebo spravovat UserActivityWillSaveUIKitAppKit aktivitu uživatele automaticky. Provedete to tak, že nastavíte vlastnost objektu respondéru a UserActivity implementujete UpdateUserActivityState metodu . Další informace najdete níže v části Podpora předání v respondérech.

Podpora architektury App Framework

Systémy (iOS) i (OS X) poskytují integrovanou podporu handoffu ve třídách UIKitAppKit , NSDocument Responder ( ) UIResponder/NSResponderAppDelegate a . I když každý operační systém implementuje Předání trochu jinak, základní mechanismus a rozhraní API jsou stejné.

Aktivity uživatelů v Document-Based aplikacích

Document-based iOS and OS X apps automatically have Handoff support built-in. Pokud chcete tuto podporu aktivovat, musíte pro každou položku v souboru NSUbiquitousDocumentUserActivityTypeCFBundleDocumentTypesNSUbiquitousDocumentUserActivityType aplikace přidat klíč a hodnotu.

Pokud je tento klíč k dispozici, a automaticky vytváří instance pro dokumenty založené na NSDocumentUIDocumentNSUserActivity iCloudu zadaného typu. Budete muset zadat typ aktivity pro každý typ dokumentu, který aplikace podporuje, a více typů dokumentů může používat stejný typ aktivity. I NSDocumentUIDocument automaticky naplní vlastnost UserInfoNSUserActivity hodnotou FileURL jejich vlastnosti.

V OS X se spravovaná a přidružená k respondérům automaticky stane aktuální aktivitou, když se okno dokumentu stane NSUserActivityAppKit hlavním oknem. V iOSu musíte pro objekty spravované pomocí volat buď explicitně metodu , nebo mít vlastnost dokumentu nastavenou na , když aplikace přichází do NSUserActivityUIKitBecomeCurrentUserActivityUIViewController popředí.

AppKit automaticky obnoví libovolnou UserActivity vlastnost vytvořenou tímto způsobem v OS X. K tomu dochází ContinueUserActivity v případě, false že metoda vrátí nebo je neimplementovaná. V této situaci se dokument otevře pomocí metody a OpenDocumentNSDocumentController pak obdrží volání RestoreUserActivityState metody.

Další informace najdete v části Podpora předání Document-Based aplikacích níže.

Aktivity uživatelů a respondéři

I UIKitAppKit mohou automaticky spravovat aktivitu uživatele, pokud ji nastavíte jako vlastnost objektu UserActivity respondéru. Pokud se stav změnil, budete muset nastavit NeedsSave vlastnost respondéru UserActivity na true . Systém v případě potřeby automaticky uloží , jakmile dáte respondérovi čas na aktualizaci UserActivity stavu voláním jeho UpdateUserActivityState metody.

Pokud několik respondérů sdílí jednu instanci, obdrží zpětné volání, když systém aktualizuje NSUserActivityUpdateUserActivityState objekt aktivity uživatele. Respondér musí zavolat metodu a aktualizovat slovník , aby odrážel AddUserInfoEntries aktuální stav aktivity v tomto NSUserActivityUserInfo okamžiku. Slovník UserInfo je před každým voláním UpdateUserActivityState vymazán.

Pokud chcete zrušit přidružení k aktivitě, může respondér nastavit jeho UserActivity vlastnost na null . Pokud spravovaná instance architektury aplikace nemá žádné další přidružené respondéry nebo NSUserActivity dokumenty, automaticky se zneplatní.

Další informace najdete níže v části Podpora předání v respondérech.

Aktivity uživatelů a AppDelegate

Aplikace je jejím AppDelegate primárním vstupním bodem při zpracování pokračování Handoff. Když uživatel odpoví na oznámení Předání, spustí se příslušná aplikace (pokud ještě není spuštěná) a bude WillContinueUserActivityWithTypeAppDelegate volána metoda . V tomto okamžiku by aplikace měla informovat uživatele o tom, že se pokračování spouští.

Instance NSUserActivity se doručí při AppDelegate volání metody ContinueUserActivity . V tuto chvíli byste měli nakonfigurovat uživatelské rozhraní aplikace a pokračovat v dané aktivitě.

Další informace najdete níže v části Implementace předání.

Povolení předání v aplikaci Xamarin

Z důvodu požadavků na zabezpečení stanovených handoffem musí být aplikace Xamarin.iOS, která používá rozhraní Handoff, správně nakonfigurovaná jak na portálu pro vývojáře Apple, tak v souboru projektu Xamarin.iOS.

Postupujte následovně:

  1. Přihlaste se k portálu Apple Developer Portal.

  2. Klikněte na Certifikáty, Profily identifikátorů.

  3. Pokud jste to ještě neudělali, klikněte na Identifikátory a vytvořte ID aplikace (např. ), jinak upravte stávající ID.

  4. Ujistěte se, že je ve službě iCloud zaškrtnuté dané ID:

    Povolení služby iCloud pro dané ID

  5. Uložte provedené změny.

  6. Klikněte na Vývoj zřizovacíchprofilů a vytvořte pro aplikaci nový profil zřizování vývoje:

    Vytvoření nového vývojového zřizovacího profilu pro aplikaci

  7. Stáhněte a nainstalujte nový profil zřizování nebo ho stáhněte a nainstalujte pomocí Xcode.

  8. Upravte možnosti projektu Xamarin.iOS a ujistěte se, že používáte zřizovací profil, který jste právě vytvořili:

    Vyberte právě vytvořený zřizovací profil.

  9. Dále upravte soubor Info.plist a ujistěte se, že používáte ID aplikace použité k vytvoření zřizovacího profilu:

    Nastavení ID aplikace

  10. Posuňte se do části Režimy pozadí a zkontrolujte následující položky:

    Povolení požadovaných režimů pozadí

  11. Uložte změny všech souborů.

Díky těmto nastavením je teď aplikace připravená přistupovat k rozhraním HANDOFF Framework API. Podrobné informace o zřizování najdete v našich zřizováních zařízení a zřizování vašich průvodců aplikací.

Implementace předání

Aktivity uživatelů můžou pokračovat mezi aplikacemi, které jsou podepsané stejným vývojářským ID týmu a podporují stejný typ aktivity. Implementace převzetí do aplikace Xamarin. iOS vyžaduje vytvoření objektu aktivity uživatele (v UIKit nebo AppKit ), aktualizaci stavu objektu pro sledování aktivity a pokračování aktivity na přijímajícím zařízení.

Identifikace aktivit uživatelů

Prvním krokem při implementaci přeložení je určit typy aktivit uživatelů, které vaše aplikace podporuje, a zjistit, které z těchto aktivit jsou dobrými kandidáty na pokračování na jiném zařízení. Například: aplikace ToDo může podporovat úpravu položek jako jeden typ aktivity uživatelea podpora procházení seznamu položek k dispozici jako jiné.

Aplikace může vytvořit tolik typů aktivit uživatelů, kolik je potřeba, jednu pro jakoukoliv funkci, kterou aplikace poskytuje. Pro každý typ aktivity uživatele bude aplikace muset sledovat, kdy aktivita typu začíná a končí, a musí udržovat aktuální informace o stavu, aby bylo možné pokračovat v provádění této úlohy na jiném zařízení.

Aktivity uživatelů mohou pokračovat na libovolné aplikaci podepsané se stejným ID týmu bez jakéhokoli mapování 1:1 mezi odesílajícím a přijímajícím aplikacím. Například daná aplikace může vytvořit čtyři různé typy aktivit, které jsou spotřebovány různými aplikacemi na jiném zařízení. Jedná se o běžný výskyt mezi verzí Mac aplikace (který může mít mnoho funkcí a funkcí) a aplikací pro iOS, kde je každá aplikace menší a zaměřená na konkrétní úkol.

Vytváření identifikátorů typu aktivity

Identifikátor typu aktivity je krátký řetězec přidaný do pole souboru info. plist aplikace, který slouží k jednoznačné identifikaci daného typu aktivity uživatele. V poli bude jedna položka pro každou aktivitu, kterou aplikace podporuje. Společnost Apple navrhuje pro identifikátor typu aktivity pomocí zápisu ve stylu reverzního DNS, aby se předešlo kolizím. Například: com.company-name.appname.activity pro konkrétní aktivity založené na aplikaci nebo com.company-name.activity pro aktivity, které mohou běžet napříč více aplikacemi.

Identifikátor typu aktivity se používá při vytváření NSUserActivity instance k identifikaci typu aktivity. Když aktivita pokračuje na jiném zařízení, typ aktivity (společně s ID týmu aplikace) určí, která aplikace se má spustit, aby pokračovala v aktivitě.

Jako příklad si vytvoříme ukázkovou aplikaci s názvem MonkeyBrowser (Stáhnout sem). Tato aplikace bude prezentovat čtyři karty, každá s jinou adresou URL otevřenou v zobrazení webového prohlížeče. Uživatel bude moct pokračovat na jakékoli kartě na jiném zařízení s iOS, na kterém je spuštěná aplikace.

Chcete-li vytvořit požadované identifikátory typu aktivity pro podporu tohoto chování, upravte soubor info. plist a přepněte do zobrazení zdroje . Přidejte NSUserActivityTypes klíč a vytvořte následující identifikátory:

Klíč NSUserActivityTypes a požadované identifikátory v editoru plist

Vytvořili jsme čtyři identifikátory typu nové aktivity, jednu pro každou kartu v ukázkové aplikaci MonkeyBrowser . Když vytváříte vlastní aplikace, nahraďte obsah NSUserActivityTypes pole identifikátory typu aktivity, které jsou specifické pro aktivity, které vaše aplikace podporuje.

Sledování změn aktivit uživatelů

Když vytvoříme novou instanci NSUserActivity třídy, určíme NSUserActivityDelegate instanci, která bude sledovat změny stavu aktivity. Například kód následného kódu lze použít ke sledování změn stavu:

using System;
using CoreGraphics;
using Foundation;
using UIKit;

namespace MonkeyBrowse
{
    public class UserActivityDelegate : NSUserActivityDelegate
    {
        #region Constructors
        public UserActivityDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void UserActivityReceivedData (NSUserActivity userActivity, NSInputStream inputStream, NSOutputStream outputStream)
        {
            // Log
            Console.WriteLine ("User Activity Received Data: {0}", userActivity.Title);
        }

        public override void UserActivityWasContinued (NSUserActivity userActivity)
        {
            Console.WriteLine ("User Activity Was Continued: {0}", userActivity.Title);
        }

        public override void UserActivityWillSave (NSUserActivity userActivity)
        {
            Console.WriteLine ("User Activity will be Saved: {0}", userActivity.Title);
        }
        #endregion
    }
}

UserActivityReceivedDataMetoda je volána, když datový proud pokračování přijal data z odesílajícího zařízení. další informace najdete níže v části podpora Toky pokračování .

Tato UserActivityWasContinued metoda se volá, když se v rámci aktivity z aktuálního zařízení převezme jiné zařízení. V závislosti na typu aktivity, například přidání nové položky do seznamu úkolů, může aplikace tuto činnost na odesílajícím zařízení přerušit.

UserActivityWillSaveMetoda je volána před tím, než se všechny změny aktivity uloží a synchronizují napříč místně dostupnými zařízeními. Tuto metodu lze použít k provedení všech posledních minut změn UserInfo vlastnosti NSUserActivity instance před jejich odesláním.

Vytvoření instance NSUserActivity

Každá aktivita, kterou si vaše aplikace chce poskytnout možnost pokračovat na jiném zařízení, musí být zapouzdřovaná v NSUserActivity instanci. Aplikace může vytvořit tolik aktivit podle potřeby a povaha těchto aktivit závisí na funkcích a funkcích příslušné aplikace. Například e-mailová aplikace může vytvořit jednu aktivitu pro vytvoření nové zprávy a druhou pro čtení zprávy.

Pro naši ukázkovou aplikaci se vytvoří nová aplikace NSUserActivity pokaždé, když uživatel zadá novou adresu URL v jednom ze zobrazení webového prohlížeče s kartami. Následující kód ukládá stav dané karty:

public NSString UserActivityTab1 = new NSString ("com.xamarin.monkeybrowser.tab1");
public NSUserActivity UserActivity { get; set; }
...

UserActivity = new NSUserActivity (UserActivityTab1);
UserActivity.Title = "Weather Tab";
UserActivity.Delegate = new UserActivityDelegate ();

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

// Inform Activity that it has been updated
UserActivity.BecomeCurrent ();

Vytvoří nový NSUserActivity pomocí jednoho z typů aktivity uživatele vytvořeného výše a poskytuje pro aktivitu čitelný název pro člověka. Připojí se k instanci NSUserActivityDelegate vytvořené výše a sledujte změny stavu a informují iOS, že tato aktivita uživatele je aktuální aktivitou.

Naplnění slovníku UserInfo

Jak jsme viděli výše, UserInfo vlastnost NSUserActivity třídy je NSDictionary dvojice klíč-hodnota, která slouží k definování stavu dané aktivity. Hodnoty uložené v UserInfo musí být jeden z následujících typů: NSArray , NSData , NSDate , NSDictionary , NSNull , NSNumber , NSSet , NSString nebo NSURL . NSURL hodnoty dat, které odkazují na dokumenty iCloud, se automaticky upraví tak, aby odkazovaly na stejné dokumenty na přijímajícím zařízení.

V předchozím příkladu jsme vytvořili objekt a naplnili NSMutableDictionary ho pomocí jediného klíče, který poskytuje adresu URL, kterou uživatel aktuálně prohlížel na dané kartě. AddUserInfoEntries Metoda aktivity uživatele se použila k aktualizaci aktivity daty, která se použije k obnovení aktivity na přijímacím zařízení:

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

Apple navrhne zachování informací odesílaných do barest minima, aby se zajistilo, že se aktivita pošle na přijímací zařízení včas. Pokud je třeba zadat větší informace, například je nutné odeslat obrázek připojený k dokumentu, měli byste použít Toky pokračování. další podrobnosti najdete níže v části podpora Toky pokračování .

Pokračování aktivity

Při předání se automaticky informují místní zařízení s iOS a OS X, která jsou ve fyzické blízkosti původního zařízení, a přihlásí se ke stejnému účtu iCloud, aby bylo možné zajistit kontinuitu aktivit uživatelů. Pokud se uživatel rozhodne pokračovat v aktivitě na novém zařízení, spustí systém příslušnou aplikaci (na základě ID týmu a typu aktivity) a informace o AppDelegate tom, ke kterému pokračování musí dojít.

Nejprve WillContinueUserActivityWithType je volána metoda, takže aplikace může uživatele informovat o zahájení pokračování. Následující kód používáme v souboru AppDelegate. cs naší ukázkové aplikace pro zpracování pokračování od:

public NSString UserActivityTab1 = new NSString ("com.xamarin.monkeybrowser.tab1");
public NSString UserActivityTab2 = new NSString ("com.xamarin.monkeybrowser.tab2");
public NSString UserActivityTab3 = new NSString ("com.xamarin.monkeybrowser.tab3");
public NSString UserActivityTab4 = new NSString ("com.xamarin.monkeybrowser.tab4");
...

public FirstViewController Tab1 { get; set; }
public SecondViewController Tab2 { get; set;}
public ThirdViewController Tab3 { get; set; }
public FourthViewController Tab4 { get; set; }
...

public override bool WillContinueUserActivity (UIApplication application, string userActivityType)
{
    // Report Activity
    Console.WriteLine ("Will Continue Activity: {0}", userActivityType);

    // Take action based on the user activity type
    switch (userActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Inform view that it's going to be modified
        Tab1.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Inform view that it's going to be modified
        Tab2.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Inform view that it's going to be modified
        Tab3.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Inform view that it's going to be modified
        Tab4.PreparingToHandoff ();
        break;
    }

    // Inform system we handled this
    return true;
}

Ve výše uvedeném příkladu každý kontroler zobrazení se registruje s AppDelegate a má veřejnou PreparingToHandoff metodu, která zobrazuje indikátor aktivity a zprávu, která uživateli informuje, že se chystá přesměrovat aktivitu na aktuální zařízení. Příklad:

private void ShowBusy(string reason) {

    // Display reason
    BusyText.Text = reason;

    //Define Animation
    UIView.BeginAnimations("Show");
    UIView.SetAnimationDuration(1.0f);

    Handoff.Alpha = 0.5f;

    //Execute Animation
    UIView.CommitAnimations();
}
...

public void PreparingToHandoff() {
    // Inform caller
    ShowBusy ("Continuing Activity...");
}

ContinueUserActivityAppDelegate Bude volána metoda z, která bude ve skutečnosti pokračovat v dané aktivitě. Znovu z naší ukázkové aplikace:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Report Activity
    Console.WriteLine ("Continuing User Activity: {0}", userActivity.ToString());

    // Get input and output streams from the Activity
    userActivity.GetContinuationStreams ((NSInputStream arg1, NSOutputStream arg2, NSError arg3) => {
        // Send required data via the streams
        // ...
    });

    // Take action based on the Activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Preform handoff
        Tab1.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab1});
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Preform handoff
        Tab2.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab2});
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Preform handoff
        Tab3.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab3});
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Preform handoff
        Tab4.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab4});
        break;
    }

    // Inform system we handled this
    return true;
}

Metoda Public PerformHandoff každého kontroleru zobrazení ve skutečnosti předchází předání a obnoví aktivitu na aktuálním zařízení. V případě příkladu se na dané kartě zobrazí stejná adresa URL, kterou uživatel prochází na jiném zařízení. Příklad:

private void HideBusy() {

    //Define Animation
    UIView.BeginAnimations("Hide");
    UIView.SetAnimationDuration(1.0f);

    Handoff.Alpha = 0f;

    //Execute Animation
    UIView.CommitAnimations();
}
...

public void PerformHandoff(NSUserActivity activity) {

    // Hide busy indicator
    HideBusy ();

    // Extract URL from dictionary
    var url = activity.UserInfo ["Url"].ToString ();

    // Display value
    URL.Text = url;

    // Display the give webpage
    WebView.LoadRequest(new NSUrlRequest(NSUrl.FromString(url)));

    // Save activity
    UserActivity = activity;
    UserActivity.BecomeCurrent ();

}

ContinueUserActivityMetoda zahrnuje UIApplicationRestorationHandler , který můžete volat pro obnovení aktivity na základě dokumentu nebo respondéru. Při volání budete muset předat NSArray objekt nebo obnovitelné do obslužné rutiny pro obnovení. Například:

completionHandler (new NSObject[]{Tab4});

Pro každý předaný objekt RestoreUserActivityState bude volána jeho metoda. Každý objekt pak může použít data ve UserInfo slovníku k obnovení vlastního stavu. Například:

public override void RestoreUserActivityState (NSUserActivity activity)
{
    base.RestoreUserActivityState (activity);

    // Log activity
    Console.WriteLine ("Restoring Activity {0}", activity.Title);
}

Pro aplikace založené na dokumentech, pokud neimplementujete ContinueUserActivity metodu, nebo ji vrátí falseUIKit nebo AppKit může automaticky obnovit aktivitu. Další informace najdete v části Podpora přeDocument-Based aplikací níže.

Řádně se nezdařila předání

Vzhledem k tomu, že předání spoléhá na přenos informací mezi kolekcí volně připojených zařízení s iOS a OS X, může proces přenosu někdy selhat. Měli byste navrhnout aplikaci tak, aby tyto chyby řádně zpracovala a informovala uživatele o všech situacích, které vznikají.

V případě selhání bude DidFailToContinueUserActivitiyAppDelegate volána metoda. Například:

public override void DidFailToContinueUserActivitiy (UIApplication application, string userActivityType, NSError error)
{
    // Log information about the failure
    Console.WriteLine ("User Activity {0} failed to continue. Error: {1}", userActivityType, error.LocalizedDescription);
}

K poskytnutí informací o selhání byste měli použít poskytnutý NSError uživatel.

Přeložení nativní aplikace na webový prohlížeč

Uživatel může pokračovat v aktivitě, aniž by byla na požadovaném zařízení nainstalovaná příslušná nativní aplikace. V některých situacích může webové rozhraní poskytovat požadovanou funkci a aktivita může stále pokračovat. Například e-mailový účet uživatele může poskytovat webové uživatelské rozhraní pro vytváření a čtení zpráv.

Pokud původní, nativní aplikace zná adresu URL webového rozhraní (a požadovaná syntaxe pro identifikaci dané položky pokračuje), může tyto informace kódovat ve WebpageURL vlastnosti NSUserActivity instance. Pokud pro přijímací zařízení není nainstalovaná příslušná nativní aplikace pro zpracování pokračování, může se zavolat poskytnuté webové rozhraní.

Webový prohlížeč pro předání nativní aplikace

Pokud uživatel používal webové rozhraní na zdrojovém zařízení a nativní aplikace na přijímacím zařízení bude přihlášena k doméně této WebpageURL vlastnosti, pak systém použije tuto aplikaci, aby zpracovala pokračování. Nové zařízení dostane NSUserActivity instanci, která označuje typ aktivity, BrowsingWeb a WebpageURL bude obsahovat adresu URL, na kterou uživatel navštívil, UserInfo slovník bude prázdný.

Aby se aplikace účastnila tohoto typu předání, musí tuto doménu uplatnit v com.apple.developer.associated-domains nároku ve formátu <service>:<fully qualified domain name> (například: activity continuation:company.com ).

Pokud zadaná doména odpovídá WebpageURL hodnotě vlastnosti, přepošle se na web v této doméně seznam schválených ID aplikací. Web musí obsahovat seznam schválených ID v podepsaném souboru JSON s názvem Apple-App-site-Association (například ).

Tento soubor JSON obsahuje slovník, který určuje seznam ID aplikací ve formuláři <team identifier>.<bundle identifier> . Například:

{
    "activitycontinuation": {
        "apps": [    "YWBN8XTPBJ.com.company.FirstApp",
            "YWBN8XTPBJ.com.company.SecondApp" ]
    }
}

Pokud chcete soubor JSON podepsat (takže má správnou hodnotu Content-Typeapplication/pkcs7-mime ), použijte aplikaci Content-Type a openssl příkaz s certifikátem a klíčem vydaným certifikační autoritou, která je důvěryhodná pro iOS (viz https://support.apple.com/kb/ht5012 pro seznam). Například:

echo '{"activitycontinuation":{"apps":["YWBN8XTPBJ.com.company.FirstApp",
"YWBN8XTPBJ.com.company.SecondApp"]}}' > json.txt

cat json.txt | openssl smime -sign -inkey company.com.key
-signer company.com.pem
-certfile intermediate.pem
-noattr -nodetach
-outform DER > apple-app-site-association

opensslPříkaz vypíše podepsaný soubor JSON, který umístíte na svůj web, na adrese URL openssl . Například:

https://example.com/apple-app-site-association.

Aplikace získá všechny aktivity, jejichž WebpageURL doména má své com.apple.developer.associated-domains nároky. Pouze http protokoly a https jsou podporovány, jakýkoli jiný protokol vyvolá výjimku.

Podpora přeložení v Document-Basedch aplikacích

Jak je uvedeno výše, v systémech iOS a OS X budou aplikace založené na dokumentech automaticky podporovat předání dokumentů založených na iCloud, pokud soubor info. plist aplikace obsahuje klíč NSUbiquitousDocumentUserActivityType . Například:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>NSRTFDPboardType</string>
        . . .
        <key>LSItemContentTypes</key>
        <array>
        <string>com.myCompany.rtfd</string>
        </array>
        . . .
        <key>NSUbiquitousDocumentUserActivityType</key>
        <string>com.myCompany.myEditor.editing</string>
    </dict>
</array>

V tomto příkladu je řetězec označení aplikace reverzních DNS s názvem připojené aktivity. Pokud tento parametr zadáte, položky typu aktivity není nutné opakovat v poli NSUserActivityTypes souboru NSUserActivityTypes .

Automaticky vytvořený objekt aktivity uživatele (dostupný prostřednictvím UserActivity Vlastnosti dokumentu) může odkazovat jiné objekty v aplikaci a použít k obnovení stavu při pokračování. Například pro sledování výběru položek a umístění dokumentu. Tuto vlastnost aktivity je nutné nastavit NeedsSave na hodnotu true pokaždé, když se stav změní a aktualizuje UserInfo slovník v UpdateUserActivityState metodě.

UserActivityVlastnost lze použít z libovolného vlákna a odpovídá protokolu KVO (Key-Value pozorovatele), takže jej lze použít k uchování dokumentu v synchronizaci při jeho přesunu do nebo z iCloud. UserActivityPři zavření dokumentu bude vlastnost zrušena.

Další informace najdete v tématu Podpora aktivit uživatelů společnosti Apple v dokumentaci k aplikacím Document-Based.

Podpora předání v případě reakcí

Nastavením vlastností můžete přidružit k aktivitám reakce (zděděné z UIResponder systému iOS nebo NSResponder v OS X) na aktivity UserActivity . Systém automaticky uloží UserActivity vlastnost ve vhodných časech voláním UpdateUserActivityState metody Responder pro přidání aktuálních dat do objektu aktivity uživatele pomocí AddUserInfoEntriesFromDictionary metody.

Podpora Toky pokračování

Může se jednat o situace, kdy množství informací potřebných k pokračování aktivity nelze efektivně přenést počáteční datovou část předání. V těchto situacích může přijímající aplikace vytvořit jeden nebo více datových proudů mezi sebou samými a původní aplikací pro přenos dat.

Původní aplikace nastaví SupportsContinuationStreams vlastnost NSUserActivity instance na true . Například:

// Create a new user Activity to support this tab
UserActivity = new NSUserActivity (ThisApp.UserActivityTab1){
    Title = "Weather Tab",
    SupportsContinuationStreams = true
};
UserActivity.Delegate = new UserActivityDelegate ();

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

// Inform Activity that it has been updated
UserActivity.BecomeCurrent ();

Přijímající aplikace potom může volat GetContinuationStreams metodu NSUserActivity v jejím rámci AppDelegate k vytvoření datového proudu. Například:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Report Activity
    Console.WriteLine ("Continuing User Activity: {0}", userActivity.ToString());

    // Get input and output streams from the Activity
    userActivity.GetContinuationStreams ((NSInputStream arg1, NSOutputStream arg2, NSError arg3) => {
        // Send required data via the streams
        // ...
    });

    // Take action based on the Activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Preform handoff
        Tab1.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab1});
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Preform handoff
        Tab2.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab2});
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Preform handoff
        Tab3.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab3});
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Preform handoff
        Tab4.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab4});
        break;
    }

    // Inform system we handled this
    return true;
}

Na zdrojovém zařízení delegát aktivity uživatele obdrží Stream voláním DidReceiveInputStream metody, aby poskytovala data požadovaná k pokračování aktivity uživatele při obnovení zařízení.

Použijete NSInputStream k poskytnutí přístupu k datovým proudům, které jsou jen pro čtení, a k NSOutputStream poskytnutí přístupu jen pro zápis. Datové proudy by měly být použity v žádosti a odpovědi, kde přijímající aplikace požaduje více dat a původní aplikace je poskytuje. To znamená, že data zapsaná do výstupního datového proudu na zdrojovém zařízení jsou čtena ze vstupního datového proudu na pokračování zařízení a naopak.

Dokonce i v situacích, kdy jsou vyžadovány požadavky na pokračování, musí existovat minimální komunikace mezi těmito dvěma aplikacemi.

další informace najdete v dokumentaci k pokračování pomocí Toky v dokumentaci společnosti Apple.

Předání osvědčených postupů

Úspěšná implementace bezproblémového pokračování aktivity uživatele prostřednictvím předání vyžaduje pečlivou návrh z důvodu všech různých součástí. Společnost Apple navrhuje přijmout osvědčené postupy pro vaše aplikace s podporou předávaných aplikací:

  • Navrhněte své uživatelské aktivity tak, aby vyžadovaly nejmenší možnou datovou část, aby se mohla spojit stav aktivity, která bude pokračovat. Čím větší je datová část, tím déle trvá spuštění pokračování.
  • Pokud pro úspěšné pokračování potřebujete přenášet velké objemy dat, vezměte v úvahu náklady spojené s konfigurací a zatížením sítě.
  • Pro velkou aplikaci pro Mac je běžné vytvářet aktivity uživatelů, které jsou na zařízeních s iOS zpracovávány na několika menších aplikacích specifických pro konkrétní úkoly. Různé aplikace a verze operačního systému by měly být navržené tak, aby dobře spolupracovaly nebo nefungovaly správně.
  • Při zadávání typů aktivit použijte zpětný zápis DNS, abyste zabránili kolizím. Pokud je aktivita specifická pro danou aplikaci, její název by měl být zahrnut do definice typu (například com.myCompany.myEditor.editing ). Pokud aktivita může fungovat napříč více aplikacemi, vyřaďte název aplikace z definice (například com.myCompany.editing ).
  • Pokud vaše aplikace potřebuje aktualizovat stav aktivity uživatele ( NSUserActivity ), nastavte NeedsSave vlastnost na hodnotu true . V příslušných časech předáte volání metody delegáta UserActivityWillSave , abyste mohli UserInfo slovník aktualizovat podle potřeby.
  • Vzhledem k tomu, že proces předání se na přijímacím zařízení nemusí okamžitě inicializovat, měli byste implementovat AppDelegateWillContinueUserActivity a informovat uživatele o tom, že se chystá spuštění pokračování.

Ukázka předání aplikace

Jako příklad použití předání v aplikaci Xamarin. iOS jsme do tohoto průvodce zahrnuli ukázkovou aplikaci MonkeyBrowser . Aplikace má čtyři karty, které může uživatel použít k procházení webu, každý s daným typem aktivity: počasí, oblíbené, kávové přerušení a práce.

Pokud uživatel zadá novou adresu URL a klepne na tlačítko Přejít , vytvoří se na libovolné kartě nový, který obsahuje adresu URL, kterou uživatel aktuálně prohlíží:

Ukázka předání aplikace

Pokud je aplikace MonkeyBrowser nainstalovaná na jiném z uživatelských zařízení, je přihlášená do iCloud pomocí stejného uživatelského účtu, je ve stejné síti a v blízké blízkosti výše uvedeného zařízení se předaná aktivita zobrazí na domovské obrazovce (v levém dolním rohu):

Aktivita odevzdání zobrazená na domovské obrazovce v levém dolním rohu

Pokud uživatel přetáhne vzhůru na ikonu pro předání, aplikace se spustí a na novém zařízení bude pokračovat aktivita uživatele zadaná v nástroji NSUserActivity :

Činnost uživatele pokračuje na novém zařízení.

Když se aktivita uživatele úspěšně pošle do jiného zařízení Apple, pošle se odesílajícímu zařízení NSUserActivity volání UserActivityWasContinued metody, NSUserActivityDelegate aby vědělo, že aktivita uživatele se úspěšně přenesla na jiné zařízení.

Souhrn

Tento článek obsahuje úvod k rozhraní předání, které se používá k pokračování aktivity uživatele mezi více zařízeními Apple uživatele. V dalším kroku se ukázalo, jak povolit a implementovat přeložení v aplikaci Xamarin. iOS. Nakonec popisuje různé typy dostupných pokračování a předání osvědčených postupů.