Android Uygulama Bağlantılarını Doğrulama

Android Uygulama Bağlantısı, web sitenizin URL'lerinin ilgili içeriği, kullanıcının uygulamayı seçmesini gerektirmeden Android uygulamanızda hemen açmasına olanak tanıyan özel bir derin bağlantı türüdür. Android Uygulama Bağlantıları, uygulamanızın söz konusu alana yönelik bağlantıları otomatik olarak açmak üzere web sitesi tarafından onaylandığına dair güven oluşturmak için Dijital Öğe Bağlantıları API'sini kullanır. Sistem, URL'lerin sahibi olduğunuzu başarıyla doğrularsa bu URL amaçlarını otomatik olarak uygulamanıza yönlendirir.

Hem uygulamanızın hem de web sitesi URL'lerinin sahibi olduğunuzu doğrulamak için aşağıdaki adımları tamamlayın:

  1. autoVerify özelliğini içeren amaç filtreleri ekleyin. Bu özellik, uygulamanızın intent filtrelerinizde kullanılan URL alanlarına ait olup olmadığını doğrulaması gerektiğini sisteme bildirir.

  2. Aşağıdaki konumda bir Digital Asset Links JSON dosyası barındırarak web siteniz ile amaç filtreleriniz arasındaki ilişkilendirmeyi beyan edin:

    https://domain.name/.well-known/assetlinks.json

İlgili bilgileri aşağıdaki kaynaklarda bulabilirsiniz:

Uygulama bağlantılarını doğrulamak için intent filtreleri ekleme

Uygulamanızda bağlantı işleme doğrulamasını etkinleştirmek için aşağıdaki biçimle eşleşen intent filtreleri ekleyin:

<!-- Make sure you explicitly set android:autoVerify to "true". -->
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <!-- If a user clicks on a shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <data android:scheme="http" />
    <data android:scheme="https" />

    <!-- Include one or more domains that should be verified. -->
    <data android:host="..." />
</intent-filter>

autoVerify ana makinenin her ana makine için yalnızca bir <intent-filter> bildirimine eklenmesi yeterli olsa da, bu ana makine diğer işaretlenmemiş bildirimlerde kullanılıyor olsa bile tutarlılık için her <intent-filter> öğesine autoVerify eklemeniz önerilir. Bu ayrıca, manifest dosyanızdaki öğeleri kaldırdıktan veya yeniden düzenledikten sonra uygulamanızın tanımlamaya devam ettiğiniz tüm alanlarla ilişkili kalmasını sağlar.

Alan doğrulama işlemi internet bağlantısı gerektirir ve biraz zaman alabilir. Sistem, sürecin verimliliğini artırmaya yardımcı olmak amacıyla, Android 12 veya sonraki sürümleri hedefleyen bir uygulamanın alanını yalnızca söz konusu alan, önceki kod snippet'inde belirtilen biçimi içeren bir <intent-filter> öğesinin içindeyse doğrular.

Birden fazla ana makine için uygulama bağlamayı destekleme

Sistem, uygulamanın URL intent filtrelerinin veri öğelerinde belirtilen ana makineyi, söz konusu intent filtresindeki ilgili web alanlarında barındırılan Digital Asset Links dosyalarıyla karşılaştırarak doğrulayabilmelidir. Doğrulama başarısız olursa sistem, Uygulama İçeriğine Derin Bağlantılar Oluşturma bölümünde açıklandığı gibi amacı çözmek için varsayılan olarak standart davranışa ayarlanır. Ancak uygulama, uygulamanın diğer intent filtrelerinde tanımlanan URL kalıpları için yine de varsayılan işleyici olarak doğrulanabilir.

Not: Android 11 (API düzeyi 30) ve önceki sürümlerde sistem, manifest dosyasında tanımladığınız tüm ana makinelerle eşleşen bir Digital Asset Links dosyası bulmadığı sürece uygulamanızı varsayılan işleyici olarak doğrulamaz.

Örneğin, aşağıdaki intent filtrelerine sahip bir uygulama, https://www.example.com/.well-known/assetlinks.json adresinde assetlinks.json dosyası bulunur ancak https://www.example.net/.well-known/assetlinks.json bulunmazsa yalnızca https://www.example.com için doğrulamayı geçer:

<application>

  <activity android:name=”MainActivity”>
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
    </intent-filter>
  </activity>
  <activity android:name=”SecondActivity”>
    <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" />
     <data android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

Not: Aynı intent filtresindeki tüm <data> öğeleri, birleşik özelliklerinin tüm varyasyonlarını hesaba katmak için birleştirilir. Örneğin, yukarıdaki ilk intent filtresi, yalnızca HTTPS şemasını bildiren bir <data> öğesi içerir. Ancak amaç filtresinin hem http://www.example.com hem de https://www.example.com'yi desteklemesi için diğer <data> öğesiyle birleştirilir. Bu nedenle, URI şemaları ve alan adlarının belirli kombinasyonlarını tanımlamak istediğinizde ayrı intent filtreleri oluşturmanız gerekir.

Birden çok alt alan için uygulama bağlamayı destekleme

Digital Asset Links protokolü, intent filtrelerinizdeki alt alan adlarını benzersiz ve ayrı ana makineler olarak ele alır. Bu nedenle, amaç filtrenizde farklı alt alan adlarına sahip birden fazla ana makine listeleniyorsa her alan adında geçerli bir assetlinks.json yayınlamanız gerekir. Örneğin, aşağıdaki intent filtresi, kabul edilen amaç URL'si ana makineleri olarak www.example.com ve mobile.example.com'yi içerir. Dolayısıyla geçerli bir assetlinks.json hem https://www.example.com/.well-known/assetlinks.json hem de https://mobile.example.com/.well-known/assetlinks.json adresinde yayınlanmalıdır.

<application>
  <activity android:name=”MainActivity”>
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
      <data android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

Alternatif olarak, ana makine adınızı joker karakterle (*.example.com gibi) tanımlarsanız assetlinks.json dosyanızı kök ana makine adında (example.com) yayınlamanız gerekir. Örneğin, aşağıdaki amaç filtresine sahip bir uygulama, assetlinks.json dosyası https://example.com/.well-known/assetlinks.json adresinde yayınlandığı sürece example.com alt adı (foo.example.com gibi) için doğrulama işleminden geçer:

<application>
  <activity android:name=”MainActivity”>
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" />
      <data android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

Aynı alanla ilişkilendirilmiş birden fazla uygulama olup olmadığını kontrol edin.

Her biri aynı alanla ilişkilendirilmiş birden fazla uygulama yayınlarsanız bu uygulamaların her biri başarıyla doğrulanabilir. Ancak uygulamalar, bir uygulamanın hafif ve tam sürümlerinde olduğu gibi tam olarak aynı alan barındırıcısını ve yolu çözümleyebiliyorsa yalnızca en son yüklenen uygulama söz konusu alan adı için web intent'lerini çözümleyebilir.

Böyle bir durumda, gerekli paket görünürlüğüne sahip olmanız koşuluyla kullanıcının cihazında çakışan uygulama olup olmadığını kontrol edin. Ardından uygulamanızda, queryIntentActivities() çağrısının sonuçlarını içeren özel bir seçici iletişim kutusu gösterin. Kullanıcı, iletişim kutusunda görünen eşleşen uygulamalar listesinden tercih ettiği uygulamayı seçebilir.

Web sitesi ilişkilendirmelerini bildirin

Web sitesiyle ilişkilendirilen Android uygulamalarını belirtmek ve uygulamanın URL amaçlarını doğrulamak için web sitenizde bir Digital Asset Links JSON dosyası yayınlanmalıdır. JSON dosyası, ilişkili uygulamaları tanımlamak için aşağıdaki alanları kullanır:

  • package_name: Uygulamanın build.gradle dosyasında belirtilen uygulama kimliği.
  • sha256_cert_fingerprints: Uygulamanızın imzalama sertifikasının SHA256 parmak izleri. Java anahtar aracı aracılığıyla dijital parmak izi oluşturmak için aşağıdaki komutu kullanabilirsiniz:
    keytool -list -v -keystore my-release-key.keystore
    
    Bu alan, hata ayıklama ve üretim derlemeleri gibi uygulamanızın farklı sürümlerini desteklemek için kullanılabilecek birden fazla parmak izini destekler.

    Uygulamanız için Play Uygulama İmzalama'yı kullanıyorsanız keytool yerel olarak çalıştırılarak oluşturulan sertifika parmak izi genellikle kullanıcıların cihazlarındaki parmak iziyle eşleşmez. Uygulamanız için Play Uygulama İmzalama'yı kullanıp kullanmadığınızı Play Console geliştirici hesabınızda Release > Setup > App signing adresinden doğrulayabilirsiniz. Kullanırsanız aynı sayfada uygulamanız için doğru Digital Asset Links JSON snippet'ini de bulabilirsiniz.

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

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "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"]
  }
}]

Bir web sitesini birden fazla uygulamayla ilişkilendirme

Bir web sitesi, aynı assetlinks.json dosyası içinde birden fazla uygulamayla ilişkili ilişkilendirmeler bildirebilir. Aşağıdaki dosya listesinde, iki uygulamayla ayrı ayrı ilişkilendirmeyi bildiren ve https://www.example.com/.well-known/assetlinks.json adresinde bulunan bir ifade dosyası örneği gösterilmektedir:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.app",
    "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.example.monkeys.app",
    "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"]
  }
}]

Farklı uygulamalar, aynı web barındırıcısı altındaki farklı kaynakların bağlantılarını işleyebilir. Örneğin, uygulama1 https://example.com/articles için intent filtresi, uygulama2 ise https://example.com/videos için bir amaç filtresi bildirebilir.

Not: Bir alanla ilişkilendirilmiş birden çok uygulama, aynı veya farklı sertifikalarla imzalanabilir.

Tek bir uygulamayla birden fazla web sitesini ilişkilendirme

Birden çok web sitesi, ilgili assetlinks.json dosyalarında aynı uygulamayla ilişkilendirmeleri tanımlayabilir. Aşağıdaki dosya listelerinde, example.com ve example.net ile uygulama1 ilişkilendirmesinin nasıl bildirileceğine dair bir örnek gösterilmektedir. İlk giriş, example.com'un app1 ile ilişkilendirilmesini gösterir:

https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "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"]
  }
}]

Bir sonraki girişte example.net ile app1 ilişkilendirmesi gösterilmektedir. Yalnızca bu dosyaların barındırıldığı konum farklıdır (.com ve .net):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "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 dosyasını yayınlama

JSON doğrulama dosyanızı şu konumda yayınlamalısınız:

https://domain.name/.well-known/assetlinks.json

Aşağıdakilerden emin olun:

  • assetlinks.json dosyası, application/json içerik türüyle yayınlanır.
  • Uygulamanızın intent filtrelerinin HTTPS'yi veri şeması olarak tanımlayıp tanımlamamasından bağımsız olarak assetlinks.json dosyasına HTTPS bağlantısı üzerinden erişilebilmelidir.
  • assetlinks.json dosyasına herhangi bir yönlendirme (301 veya 302 yönlendirmeleri yok) olmadan erişilebilmelidir.
  • Uygulama bağlantılarınız birden fazla ana makine alanını destekliyorsa assetlinks.json dosyasını her alan adında yayınlamanız gerekir. Birden fazla ana makine için uygulama bağlantısını destekleme sayfasına göz atın.
  • Uygulamanızı, herkese açık olmayabilecek geliştirme/test URL'leriyle (yalnızca VPN ile erişilebilenler gibi) yayınlamayın. Bu tür durumlarda geçici bir çözüm, geliştirici derlemeleri için farklı bir manifest dosyası oluşturmak üzere derleme varyantlarının yapılandırılmasını sağlar.

Android Uygulama Bağlantıları doğrulaması

Uygulamanızın amaç filtrelerinden en az birinde android:autoVerify="true" mevcutsa uygulamanızı Android 6.0 (API düzeyi 23) veya daha üstünü çalıştıran bir cihaza yüklemek, sistemin, uygulamanızın intent filtrelerindeki URL'lerle ilişkili ana makineleri otomatik olarak doğrulamasına neden olur. Android 12 ve sonraki sürümlerde doğrulama mantığını test etmek için doğrulama işlemini manuel olarak da başlatabilirsiniz.

Otomatik doğrulama

Sistemin otomatik doğrulaması aşağıdakileri içerir:

  1. Sistem, aşağıdakilerden herhangi birini içeren tüm intent filtrelerini inceler:
    • İşlem: android.intent.action.VIEW
    • Kategoriler: android.intent.category.BROWSABLE ve android.intent.category.DEFAULT
    • Veri şeması: http veya https
  2. Android, yukarıdaki intent filtrelerinde bulunan her benzersiz ana makine adı için Digital Asset Links dosyasının https://hostname/.well-known/assetlinks.json adresindeki ilgili web sitelerini sorgular.

Uygulamanızla ilişkilendirilecek web sitelerinin listesini onayladıktan ve barındırılan JSON dosyasının geçerli olduğunu onayladıktan sonra uygulamayı cihazınıza yükleyin. Eşzamansız doğrulama işleminin tamamlanması için en az 20 saniye bekleyin. Sistemin uygulamanızı doğrulayıp doğrulamadığını kontrol etmek ve doğru bağlantı işleme politikalarını ayarlamak için aşağıdaki komutu kullanın:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

Manuel doğrulama

Android 12 sürümünden itibaren, cihazda yüklü bir uygulama için alan doğrulamasını manuel olarak çağırabilirsiniz. Bu işlemi, uygulamanızın Android 12'yi hedefleyip hedeflemediğinden bağımsız olarak gerçekleştirebilirsiniz.

İnternet bağlantısı kurun

Alan doğrulaması gerçekleştirebilmeniz için test cihazınızın internete bağlı olması gerekir.

Güncellenen alan adı doğrulama sürecini destekleme

Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa sistem, güncellenen alan adı doğrulama işlemini otomatik olarak kullanır.

Aksi takdirde, güncellenen doğrulama işlemini manuel olarak etkinleştirebilirsiniz. Bu işlemi yapmak için bir terminal penceresinde şu komutu çalıştırın:

adb shell am compat enable 175408749 PACKAGE_NAME

Bir cihazdaki Android App Links'in durumunu sıfırlama

Bir cihazda alan doğrulamasını manuel olarak çağırmadan önce test cihazında Android App Links'in durumunu sıfırlamanız gerekir. Bunun için bir terminal penceresinde şu komutu çalıştırın:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

Bu komut, cihazı, kullanıcı herhangi bir alan için varsayılan uygulamaları seçmeden önceki durumuna getirir.

Alan adı doğrulama işlemini çağırma

Bir cihazdaki Android App Links'in durumunu sıfırladıktan sonra doğrulamayı kendiniz gerçekleştirebilirsiniz. Bu işlemi yapmak için bir terminal penceresinde şu komutu çalıştırın:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

Doğrulama sonuçlarını inceleme

Doğrulama temsilcisinin isteklerini tamamlaması için biraz zaman tanıdıktan sonra doğrulama sonuçlarını inceleyin. Bu işlemi yapmak için aşağıdaki komutu çalıştırın:

adb shell pm get-app-links PACKAGE_NAME

Bu komutun çıktısı aşağıdakine benzer:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

Doğrulamayı başarıyla geçen alanların alan doğrulama durumu verified. Diğer herhangi bir durum, alan doğrulamasının gerçekleştirilemediğini gösterir. Özellikle none durumu, doğrulama temsilcisinin doğrulama sürecini henüz tamamlamamış olabileceğini belirtir.

Aşağıdaki listede, alan doğrulamasının belirli bir alan için döndürebileceği olası dönüş değerleri gösterilmektedir:

none
Bu alan için hiçbir şey kaydedilmedi. Doğrulama aracısının alan doğrulamasıyla ilgili istekleri tamamlaması için birkaç dakika daha bekleyin, ardından alan doğrulama işlemini tekrar başlatın.
verified
Alan, beyan eden uygulama için başarıyla doğrulandı.
approved
Alan, genellikle bir kabuk komutu yürütülerek zorunlu olarak onaylandı.
denied
Alan adı, genellikle bir kabuk komutu yürütülerek zorla reddedildi.
migrated
Sistem, eski alan doğrulaması kullanan önceki bir işlemin sonucunu korudu.
restored
Alan, kullanıcı veri geri yükleme işlemini gerçekleştirdikten sonra onaylandı. Alanın daha önce doğrulandığı varsayılır.
legacy_failure
Alan, eski bir doğrulayıcı tarafından reddedildi. Söz konusu hatanın nedeni bilinmiyor.
system_configured
Alan, cihaz yapılandırması tarafından otomatik olarak onaylandı.
Hata kodu: 1024 veya üstü

Cihazın doğrulayıcısına özel özel hata kodu.

Ağ bağlantısı oluşturduğunuzdan emin olup alan doğrulama işlemini tekrar başlatın.

Kullanıcıdan uygulamanızı bir alanla ilişkilendirmesini isteyin

Uygulamanızın bir alan için onaylanmasının bir başka yolu da, kullanıcıdan uygulamanızı söz konusu alan adıyla ilişkilendirmesini istemektir.

Uygulamanızın, alan için hâlihazırda onaylanıp onaylanmadığını kontrol etme

Kullanıcıya sormadan önce, uygulamanızın <intent-filter> öğelerinizde tanımladığınız alanlar için varsayılan işleyici olup olmadığını kontrol edin. Aşağıdaki yöntemlerden birini kullanarak onay durumunu sorgulayabilirsiniz:

Alan AdıDoğrulamaYöneticisi

Aşağıdaki kod snippet'i, DomainVerificationManager API'nin nasıl kullanılacağını gösterir:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Java

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

Komut satırı programı

Uygulamanızı geliştirme sırasında test ederken kuruluşunuza ait alanların doğrulama durumunu sorgulamak için aşağıdaki komutu çalıştırabilirsiniz:

adb shell pm get-app-links --user cur PACKAGE_NAME

Aşağıdaki örnek çıkışta, uygulama "example.org" alanı için doğrulanamadı, ancak 0. kullanıcı sistem ayarlarında uygulamayı manuel olarak onaylamıştır ve bu alan adı için başka bir paket doğrulanmaz.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

Kabuk komutlarını, kullanıcının belirli bir alanla ilişkilendirilecek uygulamayı seçtiği sürecin simülasyonunu yapmak için de kullanabilirsiniz. Bu komutların tam açıklaması, adb shell pm çıktısında mevcuttur.

İsteğin bağlamını belirtin

Alan onayı için istekte bulunmadan önce kullanıcı için bağlam bilgisi sağlayın. Örneğin, kullanıcılara uygulamanızın belirli bir alan için neden varsayılan işleyici olması gerektiğini açıklayan bir başlangıç ekranı, iletişim kutusu veya benzer bir kullanıcı arayüzü öğesi gösterebilirsiniz.

İsteğinde bulunma

Kullanıcı, uygulamanızın kendisinden ne istediğini anladıktan sonra istekte bulunun. Bunu yapmak için aşağıdaki kod snippet'inde gösterildiği gibi ACTION_APP_OPEN_BY_DEFAULT_SETTINGS amaç işlemini ve hedef uygulama için package:com.example.pkg ile eşleşen bir veri dizesini içeren bir niyet çağırın:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Java

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

Niyet çağrıldığında, kullanıcılar Varsayılan olarak aç adlı bir ayar ekranı görür. Bu ekranda Şekil 1'de gösterildiği gibi Desteklenen bağlantıları aç yazan bir radyo düğmesi bulunur.

Kullanıcı Desteklenen bağlantıları aç seçeneğini etkinleştirdiğinde, Bu uygulamada açılacak bağlantılar adlı bölümün altında bir dizi onay kutusu görünür. Kullanıcılar buradan uygulamanızla ilişkilendirmek istedikleri alanları seçebilir. Şekil 2'de gösterildiği gibi alan eklemek için Bağlantı ekle'yi de seçebilirler. Kullanıcılar daha sonra ekledikleri alanlarda herhangi bir bağlantıyı seçtiklerinde, bu bağlantı uygulamanızda otomatik olarak açılır.

Radyo düğmesi etkinleştirildiğinde, alta yakın bir bölümde onay kutuları ve &quot;Bağlantı ekle&quot; adlı bir düğme bulunur
Şekil 1. Kullanıcıların, uygulamanızda varsayılan olarak hangi bağlantıların açılacağını seçebilecekleri sistem ayarları ekranı.
Her onay kutusu, ekleyebileceğiniz bir alanı temsil eder. İletişim kutusunun düğmeleri &quot;İptal&quot; ve &quot;Ekle&quot;dir.
Şekil 2. Kullanıcıların uygulamanızla ilişkilendirilecek ek alanlar seçebileceği iletişim kutusu.

Uygulamanızın doğrulayamadığı alanları uygulamanızda açma

Uygulamanızın ana işlevi, işlenen alanlarını doğrulama imkanı olmadan bağlantıları üçüncü taraf olarak açmak olabilir. Böyle bir durumda, kullanıcılara o sırada bir web bağlantısı seçerken birinci taraf uygulaması ile sizin (üçüncü taraf) uygulamanız arasında seçim yapamayacaklarını açıklayın. Kullanıcıların alanları üçüncü taraf uygulamanızla manuel olarak ilişkilendirmesi gerekir.

Ayrıca, kullanıcı bunu yapmayı tercih etmesi durumunda kullanıcının bağlantıyı birinci taraf uygulamasında açmasına, yani proxy olarak hareket etmesine olanak tanıyan bir diyalog veya trambolin etkinliği eklemeyi düşünün. Bu tür bir diyalog veya trambolin etkinliği oluşturmadan önce, uygulamanızı, uygulamanızın web intent filtresiyle eşleşen birinci taraf uygulamalarında paket görünürlüğü elde edecek şekilde ayarlayın.

Test uygulama bağlantıları

Uygulama bağlama özelliğini uygularken, sistemin uygulamanızı web sitelerinizle ilişkilendirebildiğinden ve URL isteklerini beklediğiniz gibi işleyebildiğinden emin olmak için bağlantı işlevini test etmeniz gerekir.

Mevcut bir ifade dosyasını test etmek için İfade Listesi Oluşturma ve Test Aracı aracını kullanabilirsiniz.

Doğrulanacak ana makinelerin listesini onaylayın

Test sırasında, sistemin uygulamanız için doğrulaması gereken ilişkili ana makinelerin listesini onaylamanız gerekir. İlgili intent filtrelerinde aşağıdaki özellikleri ve öğeleri içeren tüm URL'lerin listesini yapın:

  • http veya https değerine sahip android:scheme özelliği
  • Alan URL kalıbına sahip android:host özelliği
  • android.intent.action.VIEW işlem öğesi
  • android.intent.category.BROWSABLE kategori öğesi

Adlandırılmış her ana makine ve alt alan adında bir Digital Asset Links JSON dosyasının sağlanıp sağlanmadığını kontrol etmek için bu listeyi kullanın.

Digital Asset Links dosyalarını onaylama

Her web sitesi için Digital Asset Links JSON dosyasının düzgün şekilde barındırıldığını ve tanımlandığını doğrulamak amacıyla Digital Asset Links API'yi kullanın:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://domain.name:optional_port&
   relation=delegate_permission/common.handle_all_urls

Test sürecinizin bir parçası olarak, bağlantıları işlemeyle ilgili mevcut sistem ayarlarını kontrol edebilirsiniz. Bağlı cihazınızdaki tüm uygulamalarla ilgili mevcut bağlantı işleme politikalarının listesini görmek için aşağıdaki komutu kullanın:

adb shell dumpsys package domain-preferred-apps

Veya şunun aynı şeyi yapar:

adb shell dumpsys package d

Not: Sistemin doğrulama işlemini tamamlaması için uygulamanızı yükledikten sonra en az 20 saniye bekleyin.

Komut, cihazda tanımlanan her kullanıcı veya profilin listesini ve öncesinde aşağıdaki biçimde bir başlık döndürür:

App linkages for user 0:

Bu başlıktan sonra, çıkış ilgili kullanıcının bağlantı işleme ayarlarını listelemek için aşağıdaki biçimi kullanır:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

Bu giriş, söz konusu kullanıcı için hangi uygulamaların hangi alanlarla ilişkilendirildiğini gösterir:

  • Package: Bir uygulamayı, manifest dosyasında belirtilen paket adına göre tanımlar.
  • Domains - Bu uygulamanın işlediği web ana makinelerinin tam listesini, boşlukları sınırlayıcı olarak kullanarak gösterir.
  • Status - Bu uygulama için geçerli bağlantı işleme ayarını gösterir. Doğrulamayı geçen ve manifest dosyası android:autoVerify="true" içeren bir uygulama always durumunu gösterir. Bu durumdan sonraki onaltılık sayı, Android sisteminin kullanıcının uygulama bağlantısı tercihleri ile ilgili kaydıyla ilgilidir. Bu değer, doğrulamanın başarılı olup olmadığını göstermez.

Not: Doğrulama tamamlanmadan önce kullanıcı, bir uygulamanın uygulama bağlantısı ayarlarını değiştirirse doğrulama başarısız olsa bile başarılı bir doğrulama için yanlış pozitif bir sonuç görebilirsiniz. Ancak bu doğrulama hatası, kullanıcı tarafından uygulamanın desteklenen bağlantıları sormadan açacak şekilde açıkça etkinleştirilip etkinleştirilmediği önemli değildir. Bunun nedeni, kullanıcı tercihlerinin programatik doğrulamaya göre öncelikli olmasıdır (veya bunun olmamasıdır). Bunun sonucunda bağlantı, sanki doğrulama başarılı olmuş gibi, iletişim kutusu gösterilmeden doğrudan uygulamanıza gider.

Test örneği

Uygulama bağlantısı doğrulamanın başarılı olması için sistemin, uygulama bağlantısı ölçütlerini karşılayan belirli bir intent filtresinde belirttiğiniz web sitelerinin her biriyle uygulamanızı doğrulayabilmesi gerekir. Aşağıdaki örnekte, çeşitli uygulama bağlantılarının tanımlanmış olduğu bir manifest yapılandırması gösterilmektedir:

<application>

    <activity android:name=”MainActivity”>
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:scheme="https" />
            <data android:host="www.example.com" />
            <data android:host="mobile.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="www.example2.com" />
        </intent-filter>
    </activity>

    <activity android:name=”SecondActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" />
            <data android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" />
            <data android:host="example.com" />
        </intent-filter>
      </activity>

</application>

Platformun yukarıdaki manifestten doğrulamaya çalışacağı ana makinelerin listesi şöyledir:

www.example.com
mobile.example.com
www.example2.com
account.example.com

Platformun yukarıdaki manifestten doğrulamaya çalışmayacağı ana makinelerin listesi şöyledir:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)

İfade listeleri hakkında daha fazla bilgi edinmek için İfade Listesi Oluşturma sayfasını inceleyin.

Sık karşılaşılan uygulama hatalarını düzeltme

Android Uygulama Bağlantılarınızı doğrulayamıyorsanız aşağıdaki yaygın hataları kontrol edin. Bu bölümde, yer tutucu alan adı olarak example.com kullanılmaktadır. Bu kontrolleri gerçekleştirirken example.com yerine sunucunuzun gerçek alan adını yazın.

Yanlış niyet filtresi oluşturuldu
Bir <intent-filter> öğesine, uygulamanızın sahibi olmayan bir URL'yi ekleyip eklemediğinizi kontrol edin.
Yanlış sunucu yapılandırması

Sunucunuzun JSON yapılandırmasını kontrol edin ve SHA değerinin doğru olduğundan emin olun.

Ayrıca, example.com. öğesinin (sondaki noktayla birlikte) example.com ile aynı içeriği sunduğundan emin olun.

Sunucu tarafı yönlendirmeler

Aşağıdaki gibi bir yönlendirme ayarlarsanız sistem, uygulamanız için hiçbir Android Uygulama Bağlantısını doğrulamaz:

  • http://example.com-https://example.com
  • example.com-www.example.com

Bu davranış, uygulamanızın güvenliğini korur.

Sunucu sağlamlığı

Sunucunuzun istemci uygulamalarınıza bağlanıp bağlanamadığını kontrol edin.

Doğrulanamayan bağlantılar

Test amacıyla, kasıtlı olarak doğrulanamayan bağlantılar ekleyebilirsiniz. Android 11 ve önceki sürümlerde bu bağlantıların, sistemin uygulamanız için tüm Android App Links'i doğrulamamasına neden olduğunu unutmayın.

assetlinks.json dosyasında yanlış imza

İmzanızın doğru olduğunu ve uygulamanızı imzalamak için kullanılan imzayla eşleştiğini doğrulayın. Sık yapılan hatalardan bazıları şunlardır:

  • Uygulamayı hata ayıklama sertifikasıyla imzalama ve yalnızca assetlinks.json sürümünde sürüm imzası bulundurmak.
  • assetlinks.json dilinde küçük harfli imza kullanılıyor. İmza büyük harfle yazılmalıdır.
  • Play Uygulama İmzalama'yı kullanıyorsanız Google'ın her bir sürümünüzü imzalamak için kullandığı imzayı kullandığınızdan emin olun. Web sitesi ilişkilendirmelerini bildirme hakkındaki talimatları uygulayarak eksiksiz bir JSON snippet'i dahil olmak üzere bu ayrıntıları doğrulayabilirsiniz.