Share via


Android uygulama bağlantıları

Web sitesindeki bağlantıların mobil uygulamayı başlatması ve içeriği mobil uygulamada görüntülemesi için bir web sitesi ve mobil uygulama arasında bağlantı kurmak genellikle tercih edilir. Derin bağlantı olarak da bilinen uygulama bağlama, mobil cihazın URI'ye yanıt vermesini ve URI ile temsil edilen bir mobil uygulamada içerik başlatmasını sağlayan bir tekniktir.

Android, uygulama bağlantılarını amaç sistemi üzerinden işler. Mobil tarayıcıdaki bir bağlantıya dokunduğunuzda, tarayıcı Android'in kayıtlı bir uygulamaya temsilci olarak göndereceği bir amaç gönderecektir. Bu bağlantılar gibi myappname://özel bir düzeni temel alabilir veya HTTP veya HTTPS düzenini kullanabilir. Örneğin, tarif web sitesindeki bir bağlantıya tıklanması, bu web sitesiyle ilişkili bir mobil uygulama açar ve kullanıcıya belirli bir tarif görüntüler. Amacı işlemek için kayıtlı birden fazla uygulama varsa Android, kullanıcıya amacı işlemek için hangi uygulamayı seçeceğini soran bir kesinleştirme iletişim kutusu görüntüler. Uygulamanızın yüklü olmadığı kullanıcılar web sitenizdeki içeriğe yönlendirilir.

Android, uygulama bağlantılarını üç kategoride sınıflandırır:

  • Ayrıntılı bağlantılar , kullanıcıları uygulamanızdaki belirli içeriğe götüren herhangi bir şemanın URI'leridir. Derin bir bağlantıya tıklandığında, kullanıcıdan ayrıntılı bağlantıyı işlemek için bir uygulama seçmesini isteyen bir kesinleştirme iletişim kutusu görüntülenebilir.
  • Web bağlantıları , HTTP veya HTTPS düzenini kullanan derin bağlantılardır. Android 12 ve üzeri sürümlerde, web bağlantısı her zaman bir web tarayıcısında içerik gösterir. Android'in önceki sürümlerinde, bir uygulama web bağlantısını işleyebilirse, kullanıcıdan web bağlantısını işlemek için bir uygulama seçmesini isteyen bir kesinleştirme iletişim kutusu görüntülenir.
  • API 23+ üzerinde kullanılabilen Android uygulama bağlantıları, HTTP veya HTTPS düzenini kullanan ve özniteliğini autoVerify içeren web bağlantılarıdır. Bu öznitelik, uygulamanızın bir uygulama bağlantısı için varsayılan işleyici olmasını sağlar. Bu nedenle, bir uygulama bağlantısına tıklandığında, uygulamanız bir kesinleştirme iletişim kutusu görüntülemeden açılır.

.NET MAUI Android uygulamaları, uygulama bağlantılarının üç kategorisini de destekleyebilir. Ancak, bu makale Android uygulama bağlantılarına odaklanır. Bu, bir etki alanının sahipliğini kanıtlamanın yanı sıra etki alanında bir dijital varlık bağlantıları dosyası JSON dosyası barındırmayı gerektirir ve bu da uygulamanızla ilişkiyi açıklar. Bu, Android'in kötü amaçlı uygulamaların uygulama bağlantılarınızı kesmesini önlemek için URI'leri işlemeye çalışan uygulamanın URI'ler etki alanının sahipliğine sahip olduğunu doğrulamasını sağlar.

.NET MAUI Android uygulamasında Android uygulama bağlantılarını işleme işlemi aşağıdaki gibidir:

  1. Etki alanı sahipliğini doğrulayın. Daha fazla bilgi için bkz . Etki alanı sahipliğini doğrulama.
  2. Web sitenizde bir dijital varlık bağlantıları dosyası oluşturun ve barındırabilirsiniz. Daha fazla bilgi için bkz . Dijital varlık bağlantıları dosyası oluşturma ve barındırma.
  3. Web sitesi URI'leri için uygulamanızda bir amaç filtresi yapılandırın. Daha fazla bilgi için bkz . Amaç filtresini yapılandırma.
  4. Gelen amaçtaki verileri okuyun. Daha fazla bilgi için bkz . Gelen amaçtaki verileri okuma.

Önemli

Android uygulama bağlantılarını kullanmak için:

  • Uygulamanızın bir sürümü Google Play'de canlı olmalıdır.
  • Google'ın Geliştirici Konsolu'nda bir yardımcı web sitesi uygulamaya kayıtlı olmalıdır. Uygulama bir web sitesiyle ilişkilendirildikten sonra, hem web sitesi hem de uygulama için çalışan URI'ler dizine eklenebilir ve bu dizinler arama sonuçlarında sunulabilir. Daha fazla bilgi için bkz . support.google.com'da Google Search'te Uygulama Dizini Oluşturma.

Android uygulama bağlantıları hakkında daha fazla bilgi için bkz . Android Uygulama Bağlantılarını İşleme.

Etki alanı sahipliğini doğrulama

Uygulama bağlantılarını sunduğunuz etki alanının sahipliğini Google Search Konsolu'nda doğrulamanız gerekir. Sahiplik doğrulaması, belirli bir web sitesine sahip olduğunuzu kanıtlamak anlamına gelir. Google Search Konsolu birden çok doğrulama yaklaşımını destekler. Daha fazla bilgi için bkz . support.google.com'da site sahipliğinizi doğrulama.

Android uygulama bağlantıları, Android'in uygulamayı URI için varsayılan işleyici olarak ayarlamadan önce uygulama ile web sitesi arasındaki ilişkiyi doğrulamasını gerektirir. Bu doğrulama, uygulama ilk yüklendiğinde gerçekleşir. Dijital varlıklar bağlantıları dosyası, ilgili web etki alanı tarafından şu konumda barındırılması gereken bir JSON dosyasıdır: https://domain.name/.well-known/assetlinks.json.

Dijital varlık dosyası, Android'in ilişkilendirmeyi doğrulaması için gereken meta verileri içerir. Dosya aşağıdaki anahtar-değer çiftlerini gerektirir:

  • namespace - Android uygulamasının ad alanı.
  • package_name - Android uygulamasının paket adı.
  • sha256_cert_fingerprints - dosyanızdan .keystore alınan imzalı uygulamanın SHA256 parmak izleri. Anahtar deponuzun imzasını bulma hakkında bilgi için bkz . Anahtar deponuzun imzasını bulma.

Aşağıdaki örnek assetlinks.json dosyası bir com.companyname.myrecipeapp Android uygulamasına bağlantı açma hakları verir:

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

Uygulamanızın farklı sürümlerini veya derlemelerini desteklemek için birden fazla SHA256 parmak izi kaydedebilirsiniz. Aşağıdaki assetlinks.json dosyası hem hem com.companyname.mycookingapp de com.companyname.myrecipeapp Android uygulamalarına bağlantı açma hakları verir:

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

JSON doğrulama dosyanızı 'de https://domain.name/.well-known/assetlinks.jsonyayımlarken şunları sağlamanız gerekir:

  • Dosya içerik türüyle application/jsonsunulur.
  • Uygulamanızın şema olarak HTTPS kullanıp kullanmadığına bakılmaksızın dosyaya HTTPS üzerinden erişilebilir olmalıdır.
  • Dosyaya yeniden yönlendirme olmadan erişilebilir olmalıdır.
  • Uygulama bağlantılarınız birden çok etki alanını destekliyorsa, assetlinks.json dosyasını her etki alanında yayımlamanız gerekir.

Google'ın dijital varlık bağlantıları API'sini kullanarak dijital varlıklar dosyasının düzgün biçimlendirildiğini ve barındırıldığını onaylayabilirsiniz:

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

Daha fazla bilgi için bkz . developer.android.com'da web sitesi ilişkilendirmelerini bildirme.

Amaç filtresini yapılandırma

Bir web sitesinden Android uygulamanızdaki bir etkinliğe bir URI'yi veya URI kümesini eşleyen bir amaç filtresi yapılandırılmalıdır. .NET MAUI'de bu, etkinliğinize ekleyerek IntentFilterAttribute elde edilebilir. Amaç filtresi aşağıdaki bilgileri bildirmelidir:

  • ActionView - bu, bilgileri görüntüleme isteklerine yanıt vermek için amaç filtresini kaydeder.
  • Categories - amaç filtresinin hem hem de CategoryDefaultCategoryBrowsable web URI'sini doğru işleyebilmesi için kaydolması gerekir.
  • DataScheme - amaç filtresi özel bir düzen ve/veya HTTPS ve/veya HTTPS bildirmelidir.
  • DataHost - bu, URI'lerin kaynaklanacağı etki alanıdır.
  • DataPathPrefix - bu, web sitesindeki kaynaklara yönelik isteğe bağlı bir yoldur ve ile /başlaması gerekir.
  • AutoVerify - Bu, Android'e uygulama ile web sitesi arasındaki ilişkiyi doğrulamasını söyler. Olarak ayarlanmalıdır true , aksi takdirde Android uygulama ve web sitesi arasındaki ilişkiyi doğrulamaz ve bu nedenle uygulamanızı bir URI için varsayılan işleyici olarak ayarlamaz.

Aşağıdaki örnekte, bağlantılarını işlemek için komutunun nasıl kullanılacağı IntentFilterAttribute gösterilmektedir 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
{
}

Not

Amaç filtrenizde birden çok düzen ve konak belirtilebilir. Daha fazla bilgi için bkz . developer.android.com'da Uygulama İçeriğine Ayrıntılı Bağlantılar Oluşturma.

Android, uygulamayı bir URI için varsayılan işleyici olarak kaydetmeden önce amaç filtrelerinde tanımlanan her konağı web sitesindeki dijital varlıklar dosyasına göre doğrular. Android'in uygulamayı varsayılan işleyici olarak oluşturabilmesi için önce tüm amaç filtrelerinin doğrulamayı geçirmesi gerekir. Etkinlik içeriği için URI'ye sahip bir amaç filtresi ekledikten sonra Android, eşleşen URI'leri olan herhangi bir amacı çalışma zamanında uygulamanıza yönlendirebilir.

Etkinliğinizin diğer uygulamalar tarafından başlatılabilmesi için etkinliğinizi dışarı aktarılabilir olarak işaretlemeniz de gerekebilir. Bu, var olan ActivityAttributeöğesine eklenerek Exported = true elde edilebilir. Daha fazla bilgi için bkz . developer.android.com etkinlik öğesi .

Bir web URI amacı çağrıldığında Android, istek başarılı olana kadar aşağıdaki eylemleri dener:

  1. URI'yi işlemek için tercih edilen uygulamayı açar.
  2. URI'yi işlemek için kullanılabilen tek uygulamayı açar.
  3. Kullanıcının URI'yi işlemek için bir uygulama seçmesine izin verir.

Amaçlar ve amaç filtreleri hakkında daha fazla bilgi için bkz . developer.android.com amaçlar ve amaç filtreleri .

Gelen amaçtaki verileri okuma

Android bir amaç filtresi aracılığıyla etkinliğinizi başlattığında, amaç tarafından sağlanan verileri kullanarak ne yapacağınızı belirleyebilirsiniz. Bu, ideal olarak OnCreatebir erken yaşam döngüsü temsilcisinde gerçekleştirilmelidir. Temsilci OnCreate bir etkinlik oluşturulduğunda çağrılır. Yaşam döngüsü temsilcileri hakkında daha fazla bilgi için bkz . Platform yaşam döngüsü olayları.

Çağrılan bir Android yaşam döngüsü temsilcisine yanıt vermek için sınıfınızın yöntemindeki MauiAppBuilder nesnede CreateMauiapp yöntemini çağırınConfigureLifecycleEvents.MauiProgram Ardından nesnesinde ILifecycleBuilder yöntemini çağırın AddAndroid ve gerekli temsilci için bir işleyici kaydeden öğesini belirtin Action :

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

Intent.Action özelliği, gelen amaçla ilişkili eylemi alır ve Intent.Data özelliği gelen amaçla ilişkili verileri alır. Amaç eylemi olarak ayarlanmışsaActionView, amaç verileri yöntemiyle SendOnAppLinkRequestReceived sınıfınıza App geçirilebilir.

Uyarı

Uygulama bağlantıları, uygulamanıza olası bir saldırı vektörünü sunduğu için tüm URI parametrelerini doğruladığınızdan ve hatalı biçimlendirilmiş URI'leri attığınızdan emin olun.

Sınıfınızda App amaç verilerini almak ve işlemek için yöntemini geçersiz kılın OnAppLinkRequestReceived :

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

Yukarıdaki örnekte geçersiz kılma, OnAppLinkRequestReceived uygulama bağlantısı URI'sini görüntüler. Uygulamada, uygulama bağlantısı herhangi bir istem, oturum açma veya diğer kesintiler olmadan kullanıcıları doğrudan URI tarafından temsil edilen içeriğe götürmelidir. Bu nedenle geçersiz kılma, OnAppLinkRequestReceived URI tarafından temsil edilen içeriğe gezintinin çağrıldığı konumdur.

Dijital varlık dosyasının doğru şekilde barındırılıyor olması koşuluyla, uygulama bağlantılarınızın düzgün çalıştığından emin olmak için bir URI açma benzetimini yapmak için Etkinlik Yöneticisi aracıyla amAndroid Hata Ayıklama Köprüsünü adbkullanabilirsiniz. Örneğin, aşağıdaki komut bir URI ile ilişkili bir hedef uygulama etkinliğini görüntülemeye çalışır:

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

Bu komut, Android'in mobil uygulamanıza yönlendirmesi gereken ve URI için kaydedilen etkinliği başlatması ve görüntülemesi gereken bir amaç gönderecektir.

Not

Öykünücüye veya cihaza karşı çalıştırabilirsiniz adb .

Ayrıca, bir cihazda yüklü uygulamalar için mevcut bağlantı işleme ilkelerini görüntüleyebilirsiniz:

adb shell dumpsys package domain-preferred-apps

Bu komut aşağıdaki bilgileri görüntüler:

  • Paket - uygulamanın paket adı.
  • Etki alanı - web bağlantıları uygulama tarafından işlenecek olan, boşluklarla ayrılmış etki alanları.
  • Durum - uygulamanın geçerli bağlantı işleme durumu. değeri always , uygulamanın olarak ayarlandığı AutoVerifytrue ve sistem doğrulamasını geçtiği anlamına gelir. Ardından, tercihin kaydını temsil eden onaltılık bir sayı izler.

Komut hakkında adb daha fazla bilgi için bkz . Android Hata Ayıklama Köprüsü.

Buna ek olarak, Play Konsolu aracılığıyla Android uygulama bağlantılarını yönetebilir ve doğrulayabilirsiniz. Daha fazla bilgi için bkz . developer.android.com'da Android Uygulama Bağlantılarını yönetme ve doğrulama.

Sorun giderme önerileri için bkz . developer.android.com'da yaygın uygulama hatalarını düzeltme.