Udostępnij za pośrednictwem


Linki aplikacji dla systemu Android

Często pożądane jest połączenie witryny internetowej i aplikacji mobilnej, aby linki w witrynie internetowej uruchamiały aplikację mobilną i wyświetlały zawartość w aplikacji mobilnej. Łączenie aplikacji, nazywane również łączeniem głębokim, jest techniką umożliwiającą urządzeniu przenośnemu odpowiadanie na identyfikator URI i uruchamianie zawartości w aplikacji mobilnej reprezentowanej przez identyfikator URI.

System Android obsługuje linki aplikacji za pośrednictwem systemu intencji. Po naciśnięciu linku w przeglądarce mobilnej przeglądarka wyśle intencję, którą system Android deleguje do zarejestrowanej aplikacji. Te linki mogą być oparte na schemacie niestandardowym, takim jak myappname://, lub mogą używać schematu HTTP lub HTTPS. Na przykład kliknięcie linku w witrynie internetowej przepis spowoduje otwarcie aplikacji mobilnej skojarzonej z tą witryną internetową, a następnie wyświetlenie określonego przepisu dla użytkownika. Jeśli istnieje więcej niż jedna aplikacja zarejestrowana do obsługi intencji, w systemie Android zostanie wyświetlone okno dialogowe uściślania, które prosi użytkownika o wybranie aplikacji w celu obsługi intencji. Użytkownicy, którzy nie mają zainstalowanej aplikacji, zostaną przekierowani do zawartości w witrynie internetowej.

System Android klasyfikuje linki aplikacji do trzech kategorii:

  • Linki szczegółowe to identyfikatory URI dowolnego schematu, który zabiera użytkowników do określonej zawartości w aplikacji. Po kliknięciu linku głębokiego może pojawić się okno dialogowe uściślania, które prosi użytkownika o wybranie aplikacji w celu obsługi linku głębokiego.
  • Linki internetowe to linki głębokie korzystające ze schematu HTTP lub HTTPS. W systemie Android 12 lub nowszym link internetowy zawsze wyświetla zawartość w przeglądarce internetowej. Jeśli w poprzednich wersjach systemu Android aplikacja może obsłużyć link internetowy, zostanie wyświetlone okno dialogowe uściślania, które poprosi użytkownika o wybranie aplikacji do obsługi linku internetowego.
  • Linki aplikacji systemu Android, które są dostępne w interfejsie API 23 lub nowszym, to linki internetowe korzystające ze schematu autoVerify HTTP lub HTTPS i zawierają atrybut . Ten atrybut umożliwia aplikacji stanie się domyślną procedurą obsługi linku aplikacji. W związku z tym po kliknięciu linku aplikacji aplikacja zostanie otwarta bez wyświetlania okna dialogowego uściślania.

Aplikacje .NET MAUI dla systemu Android mogą obsługiwać wszystkie trzy kategorie linków aplikacji. Jednak ten artykuł koncentruje się na linkach aplikacji dla systemu Android. Wymaga to udowodnienia własności domeny, a także hostowania pliku JSON pliku JSON w domenie, który opisuje relację z aplikacją. Dzięki temu system Android może sprawdzić, czy aplikacja próbująca obsłużyć identyfikator URI ma własność domeny identyfikatorów URI, aby zapobiec przechwyceniu linków do aplikacji przez złośliwe aplikacje.

Proces obsługi linków aplikacji systemu Android w aplikacji .NET MAUI dla systemu Android jest następujący:

  1. Weryfikowanie własności domeny. Aby uzyskać więcej informacji, zobacz Weryfikowanie własności domeny.
  2. Utwórz i hostuj plik linków do zasobów cyfrowych w witrynie internetowej. Aby uzyskać więcej informacji, zobacz Tworzenie i hostowanie pliku linków do zasobów cyfrowych.
  3. Skonfiguruj filtr intencji w aplikacji dla identyfikatorów URI witryny internetowej. Aby uzyskać więcej informacji, zobacz Konfigurowanie filtru intencji.
  4. Odczytywanie danych z intencji przychodzącej. Aby uzyskać więcej informacji, zobacz Odczytywanie danych z intencji przychodzącej.

Ważne

Aby użyć linków aplikacji systemu Android:

  • Wersja aplikacji musi być aktywna w sklepie Google Play.
  • Witryna internetowa towarzysza musi być zarejestrowana w aplikacji w konsoli deweloperów firmy Google. Po skojarzeniu aplikacji z witryną internetową identyfikatory URI mogą być indeksowane, które działają zarówno dla witryny internetowej, jak i aplikacji, która może być następnie obsługiwana w wynikach wyszukiwania. Aby uzyskać więcej informacji, zobacz Indeksowanie aplikacji w usłudze Google Search w support.google.com.

Aby uzyskać więcej informacji na temat linków aplikacji systemu Android, zobacz Obsługa linków aplikacji systemu Android.

Zweryfikuj prawo własności do domeny

Konieczne będzie zweryfikowanie własności domeny, z której są używane linki aplikacji w konsoli wyszukiwania Google. Weryfikacja własności oznacza potwierdzenie, że jesteś właścicielem określonej witryny internetowej. Konsola wyszukiwania Google obsługuje wiele metod weryfikacji. Aby uzyskać więcej informacji, zobacz Weryfikowanie własności witryny w support.google.com.

Linki aplikacji systemu Android wymagają, aby system Android zweryfikował skojarzenie między aplikacją a witryną internetową przed ustawieniem aplikacji jako domyślnej procedury obsługi identyfikatora URI. Ta weryfikacja zostanie wykonana po pierwszym zainstalowaniu aplikacji. Plik łączy zasobów cyfrowych jest plikiem JSON, który musi być hostowany przez odpowiednią domenę internetową w następującej lokalizacji: https://domain.name/.well-known/assetlinks.json.

Plik zasobu cyfrowego zawiera metadane niezbędne dla systemu Android do zweryfikowania skojarzenia. Plik wymaga następujących par klucz-wartość:

  • namespace — przestrzeń nazw aplikacji systemu Android.
  • package_name — nazwa pakietu aplikacji dla systemu Android.
  • sha256_cert_fingerprints — odciski palców SHA256 podpisanej aplikacji uzyskane z pliku .keystore . Aby uzyskać informacje na temat znajdowania podpisu magazynu kluczy, zobacz Znajdowanie podpisu magazynu kluczy.

W poniższym przykładzie assetlinks.json plik przyznaje prawa do otwierania linków do aplikacji systemu 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"
         ]
      }
   }
]

Istnieje możliwość zarejestrowania więcej niż jednego odcisku palca SHA256 w celu obsługi różnych wersji lub kompilacji aplikacji. Poniższy plik assetlinks.json przyznaje prawa do otwierania linków com.companyname.myrecipeapp do aplikacji systemu Android i com.companyname.mycookingapp :

[
   {
      "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"
         ]
      }
   }
]

Napiwek

Użyj narzędzia Generator listy instrukcji i testera, aby ułatwić wygenerowanie poprawnego kodu JSON i zweryfikowanie go.

Podczas publikowania pliku weryfikacji JSON w usłudze https://domain.name/.well-known/assetlinks.jsonnależy upewnić się, że:

  • Plik jest obsługiwany z typem application/jsonzawartości .
  • Plik musi być dostępny za pośrednictwem protokołu HTTPS, niezależnie od tego, czy aplikacja używa protokołu HTTPS jako schematu.
  • Plik musi być dostępny bez przekierowań.
  • Jeśli linki aplikacji obsługują wiele domen, musisz opublikować plik assetlinks.json w każdej domenie.

Możesz potwierdzić, że plik zasobów cyfrowych jest poprawnie sformatowany i hostowany przy użyciu interfejsu API linków do zasobów cyfrowych firmy Google:

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

Aby uzyskać więcej informacji, zobacz Deklarowanie skojarzeń witryn internetowych w developer.android.com.

Konfigurowanie filtru intencji

Należy skonfigurować filtr intencji, który mapuje identyfikator URI lub zestaw identyfikatorów URI z witryny internetowej na działanie w aplikacji systemu Android. W programie .NET MAUI można to osiągnąć, dodając element IntentFilterAttribute do działania. Filtr intencji musi zadeklarować następujące informacje:

  • ActionView — spowoduje to zarejestrowanie filtru intencji w celu odpowiadania na żądania wyświetlania informacji.
  • Categories — filtr intencji powinien rejestrować zarówno, CategoryDefault jak i CategoryBrowsable mieć możliwość poprawnego obsługi identyfikatora URI sieci Web.
  • DataScheme - filtr intencji musi zadeklarować schemat niestandardowy i/lub HTTPS i/lub HTTPS.
  • DataHost — jest to domena, z której pochodzą identyfikatory URI.
  • DataPathPrefix— jest to opcjonalna ścieżka do zasobów w witrynie internetowej, która musi zaczynać się od ./
  • AutoVerify — informuje system Android o zweryfikowaniu relacji między aplikacją a witryną internetową. W true przeciwnym razie system Android nie zweryfikuje skojarzenia między aplikacją a witryną internetową, dlatego nie ustawi aplikacji jako domyślnej procedury obsługi identyfikatora URI.

W poniższym przykładzie pokazano, jak używać elementu IntentFilterAttribute do obsługi linków z pliku 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
{
}

Uwaga

W filtrze intencji można określić wiele schematów i hostów. Aby uzyskać więcej informacji, zobacz Tworzenie linków bezpośrednich do zawartości aplikacji w developer.android.com.

System Android zweryfikuje każdy host zidentyfikowany w filtrach intencji względem pliku zasobów cyfrowych w witrynie internetowej przed zarejestrowaniem aplikacji jako domyślnej procedury obsługi identyfikatora URI. Wszystkie filtry intencji muszą przejść weryfikację, zanim system Android będzie mógł ustanowić aplikację jako domyślną procedurę obsługi. Po dodaniu filtru intencji z identyfikatorem URI zawartości działania system Android może kierować dowolną intencję, która ma pasujące identyfikatory URI do aplikacji w czasie wykonywania.

Może być również konieczne oznaczenie działania jako możliwego do wyeksportowania, aby działanie mogło zostać uruchomione przez inne aplikacje. Można to osiągnąć przez dodanie Exported = true do istniejącego ActivityAttributeelementu . Aby uzyskać więcej informacji, zobacz Element działania w developer.android.com.

Gdy intencja identyfikatora URI sieci Web jest wywoływana, system Android podejmie następujące działania, dopóki żądanie nie powiedzie się:

  1. Otwiera preferowaną aplikację do obsługi identyfikatora URI.
  2. Otwiera jedyną dostępną aplikację do obsługi identyfikatora URI.
  3. Umożliwia użytkownikowi wybranie aplikacji do obsługi identyfikatora URI.

Aby uzyskać więcej informacji na temat intencji i filtrów intencji, zobacz Intencje i filtry intencji w developer.android.com.

Odczytywanie danych z intencji przychodzącej

Gdy system Android uruchamia działanie za pomocą filtru intencji, możesz użyć danych dostarczonych przez intencję, aby określić, co zrobić. Powinno to być wykonywane w delegacie wczesnego cyklu życia, najlepiej OnCreate. Delegat OnCreate jest wywoływany podczas tworzenia działania. Aby uzyskać więcej informacji na temat delegatów cyklu życia, zobacz Zdarzenia cyklu życia platformy.

Aby odpowiedzieć na wywoływany delegat cyklu życia systemu Android, wywołaj ConfigureLifecycleEvents metodę w MauiAppBuilder obiekcie w CreateMauiapp metodzie MauiProgram klasy. Następnie w obiekcie wywołaj ILifecycleBuilder metodę AddAndroid i określ Action program obsługi dla wymaganego delegata:

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);
    }
}

Właściwość Intent.Action pobiera akcję skojarzona z intencją przychodzącą, a Intent.Data właściwość pobiera dane skojarzone z intencją przychodzącą. Jeśli akcja intencji jest ustawiona na ActionView, dane intencji można przekazać do App klasy za pomocą SendOnAppLinkRequestReceived metody .

Ostrzeżenie

Linki aplikacji oferują potencjalny wektor ataku do aplikacji, dlatego upewnij się, że wszystkie parametry identyfikatora URI zostały zweryfikowane i odrzucone źle sformułowane identyfikatory URI.

App W klasie zastąpij metodę OnAppLinkRequestReceived odbierania i przetwarzania danych intencji:

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());
    }
}

W powyższym przykładzie OnAppLinkRequestReceived przesłonięcia wyświetla identyfikator URI linku aplikacji. W praktyce link aplikacji powinien prowadzić użytkowników bezpośrednio do zawartości reprezentowanej przez identyfikator URI bez żadnych monitów, logowań lub innych przerw. W związku z tym przesłonięcia to lokalizacja, OnAppLinkRequestReceived z której ma być wywoływana nawigacja do zawartości reprezentowanej przez identyfikator URI.

Pod warunkiem, że plik zasobu cyfrowego jest poprawnie hostowany, możesz użyć mostka debugowania systemu Android, adbz narzędziem menedżera działań, , w celu symulowania otwierania identyfikatora URI, aby upewnić się, amże linki aplikacji działają poprawnie. Na przykład następujące polecenie próbuje wyświetlić docelowe działanie aplikacji skojarzone z identyfikatorem URI:

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

To polecenie spowoduje wysłanie intencji, którą system Android powinien kierować do aplikacji mobilnej, co powinno spowodować uruchomienie i wyświetlenie działania zarejestrowanego dla identyfikatora URI.

Uwaga

Można uruchomić adb na emulatorze lub urządzeniu.

Ponadto można wyświetlić istniejące zasady obsługi linków dla aplikacji zainstalowanych na urządzeniu:

adb shell dumpsys package domain-preferred-apps

To polecenie wyświetli następujące informacje:

  • Package — nazwa pakietu aplikacji.
  • Domena — domeny oddzielone spacjami, których linki internetowe będą obsługiwane przez aplikację.
  • Stan — bieżący stan obsługi linków dla aplikacji. Wartość always oznacza, że aplikacja ma ustawioną AutoVerifytrue wartość i przeszła weryfikację systemu. Następuje po nim liczba szesnastkowa reprezentująca rekord preferencji.

Aby uzyskać więcej informacji na temat adb polecenia, zobacz Mostek debugowania systemu Android.

Ponadto można zarządzać linkami aplikacji dla systemu Android i weryfikować je za pośrednictwem konsoli odtwarzania. Aby uzyskać więcej informacji, zobacz Zarządzanie linkami aplikacji systemu Android i weryfikowanie ich w developer.android.com.

Aby uzyskać porady dotyczące rozwiązywania problemów, zobacz Naprawianie typowych błędów implementacji w developer.android.com.