Odkazy na aplikace pro Android

Často je žádoucí připojit web a mobilní aplikaci, aby odkazy na webu spustily mobilní aplikaci a zobrazovaly obsah v mobilní aplikaci. Propojení aplikací, které se také označuje jako hluboké propojení, je technika, která mobilnímu zařízení umožňuje reagovat na identifikátor URI a spustit obsah v mobilní aplikaci reprezentované identifikátorem URI.

Android zpracovává odkazy aplikací prostřednictvím systému záměrů. Když klepnete na odkaz v mobilním prohlížeči, prohlížeč odešle záměr, který Bude Android delegovat na registrovanou aplikaci. Tyto odkazy můžou být založené na vlastním schématu, jako myappname://je například , nebo můžou používat schéma HTTP nebo HTTPS. Když například kliknete na odkaz na webu s receptem, otevře se mobilní aplikace přidružená k danému webu a pak se uživateli zobrazí konkrétní recept. Pokud je pro zpracování záměru zaregistrovaných více než jedna aplikace, Zobrazí Se v Androidu dialogové okno nejednoznačnosti, ve kterém uživateli se zobrazí dotaz, kterou aplikaci má vybrat, aby tento záměr zpracovala. Uživatelé, kteří vaši aplikaci nemají nainstalovanou, se převedou na obsah na vašem webu.

Android klasifikuje odkazy na aplikace do tří kategorií:

  • Přímé odkazy jsou identifikátory URI jakéhokoli schématu, které uživatele přebírají na konkrétní obsah ve vaší aplikaci. Když kliknete na přímý odkaz, může se zobrazit dialogové okno nejednoznačnosti, které uživatele požádá o výběr aplikace, která bude zpracovávat přímý odkaz.
  • Webové odkazy jsou přímé odkazy , které používají schéma HTTP nebo HTTPS. Na Androidu 12 a vyšších webových odkazech vždy zobrazuje obsah ve webovém prohlížeči. Pokud aplikace v předchozích verzích Androidu dokáže zpracovat webový odkaz, zobrazí se dialogové okno nejednoznačnosti, které uživatele požádá o výběr aplikace, která bude zpracovávat webový odkaz.
  • Odkazy na aplikace pro Android, které jsou k dispozici v rozhraní API 23 nebo novější, jsou webové odkazy, které používají schéma HTTP nebo HTTPS a obsahují autoVerify atribut. Tento atribut umožňuje aplikaci stát se výchozí obslužnou rutinou odkazu na aplikaci. Proto se po kliknutí na odkaz aplikace otevře aplikace bez zobrazení dialogového okna nejednoznačnosti.

Aplikace .NET MAUI pro Android můžou podporovat všechny tři kategorie odkazů na aplikace. Tento článek se ale zaměřuje na odkazy na aplikace pro Android. To vyžaduje prokázání vlastnictví domény a také hostování souboru JSON s odkazy na digitální prostředky v doméně, který popisuje vztah s vaší aplikací. Díky tomu může Android ověřit, že aplikace, která se pokouší zpracovat identifikátor URI, má vlastnictví domény identifikátorů URI, aby zabránila zachycování odkazů aplikace se zlými úmysly.

Proces zpracování odkazů na aplikace pro Android v aplikaci .NET MAUI pro Android je následující:

  1. Ověřte vlastnictví domény. Další informace najdete v tématu Ověření vlastnictví domény.
  2. Vytvořte a hostujte soubor odkazů na digitální prostředky na vašem webu. Další informace najdete v tématu Vytvoření a hostování souboru odkazů na digitální prostředky.
  3. Nakonfigurujte filtr záměru v aplikaci pro identifikátory URI webu. Další informace najdete v tématu Konfigurace filtru záměru.
  4. Čtení dat z příchozího záměru Další informace najdete v tématu Čtení dat z příchozího záměru.

Důležité

Použití odkazů na aplikace pro Android:

  • Ve službě Google Play musí být aktivní verze vaší aplikace.
  • Doprovodný web musí být zaregistrovaný v aplikaci v konzole pro vývojáře Google. Po přidružení aplikace k webu je možné indexovat identifikátory URI, které fungují pro web i aplikaci, které se pak dají obsloužit ve výsledcích hledání. Další informace najdete v tématu Indexování aplikací ve službě Google Search na support.google.com.

Další informace o odkazech na aplikace pro Android najdete v tématu Zpracování odkazů na aplikace pro Android.

Ověření vlastnictví domény

Budete muset ověřit vlastnictví domény, ze které obsluhujete odkazy aplikací v konzole Google Search Console. Ověření vlastnictví znamená prokázání, že vlastníte konkrétní web. Google Search Console podporuje více přístupů k ověření. Další informace najdete v tématu Ověření vlastnictví webu na support.google.com.

Odkazy na aplikace pro Android vyžadují, aby Android před nastavením aplikace jako výchozí obslužné rutiny identifikátoru URI ověřil přidružení mezi aplikací a webem. K tomuto ověření dojde při první instalaci aplikace. Soubor odkazů digitálních prostředků je soubor JSON, který musí být hostován příslušnou webovou doménou v následujícím umístění: https://domain.name/.well-known/assetlinks.json.

Soubor digitálního assetu obsahuje metadata potřebná k ověření přidružení androidem. Soubor vyžaduje následující páry klíč-hodnota:

  • namespace – obor názvů aplikace pro Android.
  • package_name – název balíčku aplikace pro Android.
  • sha256_cert_fingerprints – otisky prstů SHA256 podepsané aplikace získané z vašeho .keystore souboru. Informace o vyhledání podpisu úložiště klíčů najdete v tématu Vyhledání podpisu úložiště klíčů.

Následující příklad assetlinks.json souboru uděluje oprávnění pro otevření odkazu aplikaci pro com.companyname.myrecipeapp Android:

[
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.companyname.myrecipeapp",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   }
]

Pro podporu různých verzí nebo sestavení aplikace je možné zaregistrovat více než jeden otisk prstu SHA256. Následující soubor assetlinks.json uděluje oprávnění pro otevírání odkazů aplikacím i com.companyname.mycookingapp aplikacím com.companyname.myrecipeapp pro Android:

[
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.companyname.myrecipeapp",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   },
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.companyname.mycookingapp",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   }
]

Tip

Použijte nástroj Generátor seznamů příkazů a tester, který vám pomůže vygenerovat správný kód JSON a ověřit ho.

Při publikování ověřovacího souboru JSON do https://domain.name/.well-known/assetlinks.json, musíte zajistit, aby:

  • Soubor se obsluhuje s obsahem application/json.
  • Soubor musí být přístupný přes PROTOKOL HTTPS bez ohledu na to, jestli vaše aplikace jako schéma používá HTTPS.
  • Soubor musí být přístupný bez přesměrování.
  • Pokud odkazy aplikace podporují více domén, musíte publikovat soubor assetlinks.json v každé doméně.

Pomocí rozhraní API pro odkazy na digitální prostředky společnosti Google můžete ověřit, že je soubor digitálních prostředků správně naformátovaný a hostovaný:

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=
  https://<WEB SITE ADDRESS>:&relation=delegate_permission/common.handle_all_urls

Další informace naleznete v tématu Deklarování přidružení webů na developer.android.com.

Konfigurace filtru záměru

Filtr záměru musí být nakonfigurovaný tak, aby mapoval identifikátor URI nebo sadu identifikátorů URI z webu na aktivitu v aplikaci pro Android. V rozhraní .NET MAUI toho můžete dosáhnout přidáním IntentFilterAttribute aktivity. Filtr záměru musí deklarovat následující informace:

  • ActionView – tím se zaregistruje filtr záměru, který bude odpovídat na žádosti o zobrazení informací.
  • Categories – Filtr záměru by měl zaregistrovat jak CategoryDefault tak CategoryBrowsable , aby byl schopen správně zpracovat identifikátor URI webu.
  • DataScheme – Filtr záměru musí deklarovat vlastní schéma a/nebo HTTPS a/nebo HTTPS.
  • DataHost – jedná se o doménu, ze které budou identifikátory URI pocházet.
  • DataPathPrefix - jedná se o volitelnou cestu k prostředkům na webu, která musí začínat na /.
  • AutoVerify – Tím androidu řeknete, aby ověřil vztah mezi aplikací a webem. Musí být nastavená tak, aby true jinak Android neověřil přidružení mezi aplikací a webem, a proto aplikaci nenastaví jako výchozí obslužnou rutinu identifikátoru URI.

Následující příklad ukazuje, jak použít IntentFilterAttribute pro zpracování odkazů z https://www.recipe-app.com/recipes:

using Android.App;
using Android.Content;
using Android.Content.PM;

namespace MyNamespace;

[Activity(
    Theme = "@style/Maui.SplashTheme",
    MainLauncher = true,
    ConfigurationChanges = ConfigChanges.ScreenSize |
        ConfigChanges.Orientation |
        ConfigChanges.UiMode |
        ConfigChanges.ScreenLayout |
        ConfigChanges.SmallestScreenSize |
        ConfigChanges.KeyboardHidden |
        ConfigChanges.Density)]
[IntentFilter(
    new string[] { Intent.ActionView },
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
    DataScheme = "https",
    DataHost = "recipe-app.com",
    DataPath = "/recipe",
    AutoVerify = true,)]    
public class MainActivity : MauiAppCompatActivity
{
}

Poznámka:

Ve filtru záměru je možné zadat více schémat a hostitelů. Další informace najdete v tématu Vytváření přímých odkazů na obsah aplikace na developer.android.com.

Android před registrací aplikace jako výchozí obslužné rutiny identifikátoru URI ověří, že každý hostitel, který je identifikován ve filtrech záměru, proti souboru digitálních assetů na webu. Všechny filtry záměru musí předávat ověření, aby Android mohl aplikaci vytvořit jako výchozí obslužnou rutinu. Po přidání filtru záměru s identifikátorem URI pro obsah aktivity dokáže Android směrovat jakýkoli záměr, který má odpovídající identifikátory URI do vaší aplikace za běhu.

Může být také nutné označit aktivitu jako exportovatelnou, aby vaše aktivita mohla být spuštěna jinými aplikacemi. Toho lze dosáhnout přidáním Exported = true do existujícího ActivityAttributesouboru . Další informace naleznete v části Activity element on developer.android.com.

Při vyvolání záměru webového identifikátoru URI se Android pokusí provést následující akce, dokud požadavek nebude úspěšný:

  1. Otevře upřednostňovanou aplikaci pro zpracování identifikátoru URI.
  2. Otevře jedinou dostupnou aplikaci pro zpracování identifikátoru URI.
  3. Umožňuje uživateli vybrat aplikaci, která bude zpracovávat identifikátor URI.

Další informace o záměrech a filtrech záměrů najdete v tématu Záměry a filtry záměrů na developer.android.com.

Čtení dat z příchozího záměru

Když Android spustí aktivitu prostřednictvím filtru záměru, můžete pomocí dat poskytovaných záměrem určit, co dělat. To by mělo být provedeno v raném životním cyklu delegát, ideálně OnCreate. Delegát OnCreate se vyvolá při vytvoření aktivity. Další informace o delegátech životního cyklu najdete v tématu Události životního cyklu platformy.

Pokud chcete odpovědět na vyvolání delegáta životního cyklu Androidu, zavolejte ConfigureLifecycleEvents metodu MauiAppBuilder na objektu v CreateMauiapp metodě třídy MauiProgram . Pak v objektu ILifecycleBuilder zavolejte metodu AddAndroid a zadejte Action , která zaregistruje obslužnou rutinu požadovaného delegáta:

using Microsoft.Maui.LifecycleEvents;
using Microsoft.Extensions.Logging;

namespace MyNamespace;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            })
            .ConfigureLifecycleEvents(lifecycle =>
            {
#if ANDROID
                lifecycle.AddAndroid(android =>
                {
                    android.OnCreate((activity, bundle) =>
                    {
                        var action = activity.Intent?.Action;
                        var data = activity.Intent?.Data?.ToString();

                        if (action == Android.Content.Intent.ActionView && data is not null)
                        {
                            Task.Run(() => HandleAppLink(data));
                        }
                    });
                });
#endif
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif

        return builder.Build();
    }

    static void HandleAppLink(string url)
    {
        if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out var uri))
            App.Current?.SendOnAppLinkRequestReceived(uri);
    }
}

Vlastnost Intent.Action načte akci přidruženou k příchozímu záměru a Intent.Data vlastnost načte data přidružená k příchozímu záměru. Za předpokladu, že je akce záměru nastavena na ActionView, je možné data záměru SendOnAppLinkRequestReceived předat do vaší App třídy pomocí metody.

Upozorňující

Odkazy na aplikace nabízejí potenciální vektor útoku do vaší aplikace, takže se ujistěte, že ověříte všechny parametry identifikátoru URI a zahodíte všechny poškozené identifikátory URI.

Ve třídě App přepište metodu OnAppLinkRequestReceived pro příjem a zpracování dat záměru:

namespace MyNamespace;

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }

    protected override async void OnAppLinkRequestReceived(Uri uri)
    {
        base.OnAppLinkRequestReceived(uri);

        // Show an alert to test that the app link was received.
        await Dispatcher.DispatchAsync(async () =>
        {
            await Windows[0].Page!.DisplayAlert("App link received", uri.ToString(), "OK");
        });

        Console.WriteLine("App link: " + uri.ToString());
    }
}

V předchozím příkladu OnAppLinkRequestReceived se v přepsání zobrazí identifikátor URI odkazu aplikace. V praxi by odkaz na aplikaci měl uživatele převést přímo na obsah reprezentovaný identifikátorem URI bez jakýchkoli výzev, přihlášení nebo jiných přerušení. Přepsání OnAppLinkRequestReceived je proto umístění, ze kterého se má vyvolat navigace na obsah reprezentovaný identifikátorem URI.

Za předpokladu, že je soubor digitálního assetu správně hostovaný, můžete pomocí nástroje Správce aktivit použít most adbpro ladění Androidu, amkterý simuluje otevření identifikátoru URI, aby se zajistilo, že odkazy aplikace fungují správně. Například následující příkaz se pokusí zobrazit cílovou aktivitu aplikace přidruženou k identifikátoru URI:

adb shell am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d YOUR_URI_HERE

Tento příkaz odešle záměr, který by Android měl nasměrovat do mobilní aplikace, která by měla spustit a zobrazit aktivitu zaregistrovanou pro identifikátor URI.

Poznámka:

Můžete spustit adb na emulátoru nebo zařízení.

Kromě toho můžete zobrazit stávající zásady zpracování odkazů pro aplikace nainstalované na zařízení:

adb shell dumpsys package domain-preferred-apps

Tento příkaz zobrazí následující informace:

  • Balíček – název balíčku aplikace.
  • Doména – domény oddělené mezerami, jejichž webové odkazy bude aplikace zpracovávat.
  • Stav – aktuální stav zpracování odkazů pro aplikaci. Hodnota always znamená, že aplikace je nastavená AutoVerifytrue a prošla ověřením systému. Následuje šestnáctkové číslo představující záznam preference.

Další informace o příkazu naleznete v tématu ladicího mostu adbandroidu.

Kromě toho můžete spravovat a ověřovat odkazy na aplikace pro Android prostřednictvím konzoly Play. Další informace najdete v tématu Správa a ověření odkazů na aplikace pro Android na developer.android.com.

Rady k řešení potíží najdete v tématu Oprava běžných chyb implementace na developer.android.com.