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

Android Uygulama Bağlantısı, web sitenizin URL'lerinin, kullanıcının uygulamayı seçmesini gerektirmeden Android uygulamanızdaki ilgili içeriği anında açmasını sağlayan özel bir derin bağlantı türüdür. Android Uygulama Bağlantıları, uygulamanızın bu alan için bağlantıları otomatik olarak açmak üzere web sitesi tarafından onaylandığına dair güven oluşturmak için Digital Asset Links API'yi 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 intent filtreleri ekleyin. Bu özellik, sisteme uygulamanızın, amaç filtrelerinizde kullanılan URL alanlarına ait olup olmadığını doğrulamasını bildirir.

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

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

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

Uygulama bağlantısı doğrulama için intent filtreleri ekleme

Uygulamanızda bağlantı işleme doğrulamayı etkinleştirmek için aşağıdaki biçime uygun amaç 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". -->
    <!-- Do not include other schemes. -->
    <data android:scheme="http" />
    <data android:scheme="https" />

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

autoVerify öğesini her ana makine için yalnızca bir <intent-filter> bildirimine eklemek yeterli olsa da bu ana makine diğer işaretlenmemiş bildirimlerde kullanılsa bile tutarlılık için autoVerify öğesini her <intent-filter> öğesine eklemeniz önerilir. Bu sayede, manifest dosyanızdaki öğeleri kaldırdıktan veya yeniden düzenledikten sonra da uygulamanızın tanımladığınız tüm alanlarla ilişkilendirilmeye devam etmesi sağlanır.

Alan doğrulama işlemi için internet bağlantısı gerekir ve tamamlanması biraz zaman alabilir. Sürecin verimliliğini artırmak için sistem, Android 12 veya sonraki sürümleri hedefleyen bir uygulamada yalnızca alan, önceki kod snippet'inde belirtilen biçimi içeren bir <intent-filter> öğesinin içindeyse doğrular. Örneğin, "http" ve "https" dışındaki şemalar (ör. <data android:scheme="custom" />), <intent-filter> öğesinin alan adı doğrulamasını tetiklemesini engeller.

Birden fazla ana makine için uygulama bağlantısını destekleme

Sistem, uygulamanın URL intent filtrelerinin veri öğelerinde belirtilen ana makineyi, bu intent filtresindeki ilgili web alanlarında barındırılan Digital Asset Links dosyalarına göre 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 standart davranışına geri döner. Ancak uygulama, diğer intent filtrelerinde tanımlanan URL kalıplarının herhangi biri için varsayılan işleyici olarak doğrulanmaya devam edebilir.

Not: Android 11 (API düzeyi 30) ve önceki sürümlerde sistem, manifestte tanımladığınız tüm ana makineler için 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 amaç filtrelerine sahip bir uygulama, yalnızca https://www.example.com için doğrulamayı geçer. Bu durum, https://www.example.com/.well-known/assetlinks.json konumunda bir assetlinks.json dosyası bulunursa ancak https://www.example.net/.well-known/assetlinks.json konumunda bulunmazsa geçerlidir:

<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ı amaç filtresindeki tüm <data> öğeleri, birleştirilmiş özelliklerinin tüm varyasyonlarını hesaba katmak için birleştirilir. Örneğin, yukarıdaki ilk amaç filtresi yalnızca HTTPS şemasını bildiren bir <data> öğesi içerir. Ancak bu öğe, diğer <data> öğesiyle birleştirilir. Böylece amaç filtresi hem http://www.example.com hem de https://www.example.com öğelerini destekler. Bu nedenle, belirli URI şemaları ve alan kombinasyonlarını tanımlamak istediğinizde ayrı amaç filtreleri oluşturmanız gerekir.

Birden fazla alt alan adı için uygulama bağlantısını destekleme

Digital Asset Links protokolü, amaç filtrelerinizdeki alt alan adlarını benzersiz ve ayrı ana makineler olarak değerlendirir. Bu nedenle, niyet filtreniz farklı alt alan adlarına sahip birden fazla ana makineyi listeliyorsa her alan adında geçerli bir assetlinks.json yayınlamanız gerekir. Örneğin, aşağıdaki amaç filtresi, kabul edilen amaç URL'si ana makineleri olarak www.example.com ve mobile.example.com'yi içerir. Bu nedenle, 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 (ör. *.example.com) bildirirseniz 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 konumunda yayınlandığı sürece example.com'nin herhangi bir alt adı (ör. foo.example.com) için doğrulama adımını 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şkili birden fazla uygulama olup olmadığını kontrol etme

Her biri aynı alanla ilişkili birden fazla uygulama yayınlarsanız her biri başarıyla doğrulanabilir. Ancak uygulamalar, bir uygulamanın lite ve tam sürümlerinde olduğu gibi tam olarak aynı alan ana makinesini ve yolu çözebiliyorsa yalnızca en son yüklenen uygulama, bu alan için web amaçlarını çözebilir.

Bu gibi durumlarda, gerekli paket görünürlüğüne sahip olmanız koşuluyla kullanıcının cihazında olası çakışan uygulamaları kontrol edin. Ardından, uygulamanızda queryIntentActivities() çağrısından elde edilen sonuçları 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 bildirme

Web sitesiyle ilişkili 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 uygulama kimliği build.gradle dosyasında beyan edilir.
  • sha256_cert_fingerprints: Uygulamanızın imzalama sertifikasının SHA256 parmak izleri. Java keytool aracılığıyla parmak izi oluşturmak için aşağıdaki komutu kullanabilirsiniz:
    keytool -list -v -keystore my-release-key.keystore
    
    Bu alan, uygulamanızın farklı sürümlerini (ör. hata ayıklama ve üretim derlemeleri) 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ındakiyle eşleşmez. Play Console geliştirici hesabınızdaki Release > Setup > App signing bölümünde uygulamanız için Play Uygulama İmzalama'yı kullanıp kullanmadığınızı doğrulayabilirsiniz. Bu özelliği kullanıyorsanız aynı sayfada uygulamanız için doğru Digital Asset Links JSON snippet'ini de bulabilirsiniz.

Aşağıdaki örnek assetlinks.json dosyası, bir 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ında birden fazla uygulamayla ilişkilendirme bildirebilir. Aşağıdaki dosya listesinde, iki uygulamayla ayrı ayrı ilişkilendirme beyan eden ve https://www.example.com/.well-known/assetlinks.json adresinde bulunan bir beyan 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ındaki farklı kaynakların bağlantılarını işleyebilir. Örneğin, uygulama1 https://example.com/articles için bir amaç filtresi bildirebilir ve uygulama2 https://example.com/videos için bir amaç filtresi bildirebilir.

Not: Bir alanla ilişkili birden fazla uygulama aynı veya farklı sertifikalarla imzalanabilir.

Tek bir uygulamayla birden fazla web sitesini ilişkilendirme

Birden fazla web sitesi, kendi assetlinks.json dosyalarında aynı uygulamayla ilişkilendirme beyan edebilir. Aşağıdaki dosya listelemelerinde, example.com ve example.net'in app1 ile ilişkilendirilmesinin nasıl beyan edileceğine dair bir örnek gösterilmektedir. İlk listede, example.com'un app1 ile ilişkilendirilmesi gösterilmektedir:

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

Sonraki listede, example.net'in app1 ile ilişkilendirilmesi 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ı aşağıdaki konumda yayınlamanız gerekir:

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

Aşağıdakilerden emin olun:

  • assetlinks.json dosyası, içerik türü application/json ile sunuluyor.
  • assetlinks.json dosyasına, uygulamanızın intent filtreleri HTTPS'yi veri şeması olarak tanımlasa da tanımlamasa da HTTPS bağlantısı üzerinden erişilebilmelidir.
  • assetlinks.json dosyasına herhangi bir yönlendirme olmadan (301 veya 302 yönlendirmesi olmadan) erişilebilmelidir.
  • Uygulama bağlantılarınız birden fazla ana makine alanını destekliyorsa assetlinks.json dosyasını her alanda yayınlamanız gerekir. Birden fazla ana makine için uygulama bağlantısını destekleme başlıklı makaleyi inceleyin.
  • Uygulamanızı, manifest dosyasında herkese açık olarak erişilemeyebilecek (ör. yalnızca VPN ile erişilebilen) geliştirme/test URL'leriyle yayınlamayın. Bu gibi durumlarda, geliştirme derlemeleri için farklı bir manifest dosyası oluşturmak üzere derleme çeşitlerini yapılandırmak geçici bir çözüm olabilir.

Android App Links doğrulama

android:autoVerify="true", uygulamanızın intent filtrelerinden en az birinde bulunduğunda uygulamanızı Android 6.0 (API düzeyi 23) veya sonraki sürümlerin yüklü olduğu bir cihaza yüklemek, sistemin uygulamanızın intent filtrelerindeki URL'lerle ilişkili ana makineleri otomatik olarak doğrulamasını sağlar. Android 12 ve sonraki sürümlerde, doğrulama mantığını test etmek için doğrulama sürecini manuel olarak da çağırabilirsiniz.

Otomatik doğrulama

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

  1. Sistem, aşağıdakilerden herhangi birini içeren tüm amaç 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 amaç filtrelerinde bulunan her benzersiz ana makine adı için https://hostname/.well-known/assetlinks.json adresindeki Dijital Varlık Bağlantıları dosyasıyla ilgili olarak ilgili web sitelerine sorgu gönderir.

Uygulamanızla ilişkilendirilecek web sitelerinin listesini onayladıktan ve barındırılan JSON dosyasının geçerli olduğunu doğruladıktan sonra uygulamayı cihazınıza yükleyin. Asenkron doğrulama işleminin tamamlanması için en az 20 saniye bekleyin. Sistemin uygulamanızı doğrulayıp doğru bağlantı işleme politikalarını ayarladığını kontrol etmek 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'den itibaren, bir cihaza yüklenen uygulama için alan doğrulamasını manuel olarak çağırabilirsiniz. Uygulamanızın Android 12'yi hedefleyip hedeflemediğinden bağımsız olarak bu işlemi gerçekleştirebilirsiniz.

İnternet bağlantısı kurun

Alan doğrulaması yapmak için test cihazınızın internete bağlı olması gerekir.

Güncellenen alan doğrulama sürecini destekleme

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

Aksi takdirde, güncellenen doğrulama sürecini manuel olarak etkinleştirebilirsiniz. Bunu yapmak için bir terminal penceresinde aşağıdaki komutu çalıştırın:

adb shell am compat enable 175408749 PACKAGE_NAME

Bir cihazda Android uygulama bağlantılarının durumunu sıfırlama

Bir cihazda alan doğrulama işlemini manuel olarak başlatmadan önce test cihazındaki Android uygulama bağlantılarının durumunu sıfırlamanız gerekir. Bunu yapmak için bir terminal penceresinde aşağıdaki komutu çalıştırın:

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

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

Alan doğrulama sürecini başlatma

Bir cihazda Android uygulama bağlantılarının durumunu sıfırladıktan sonra doğrulama işlemini gerçekleştirebilirsiniz. Bunu yapmak için bir terminal penceresinde aşağıdaki komutu çalıştırın:

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

Doğrulama sonuçlarını inceleme

Doğrulama aracısının isteklerini tamamlaması için biraz zaman tanıdıktan sonra doğrulama sonuçlarını inceleyin. Bunu 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 olur. Diğer tüm durumlar, alan doğrulamasının yapılamadığını gösterir. Özellikle none durumu, doğrulama aracısının doğrulama sürecini henüz tamamlamamış olabileceğini gösterir.

Aşağıdaki listede, alan doğrulamanı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ğrulamayla ilgili istekleri tamamlaması için birkaç dakika daha bekleyin, ardından alan doğrulama sürecini tekrar başlatın.
verified
Alan, bildiren uygulama için başarıyla doğrulandı.
approved
Alan, genellikle bir kabuk komutu yürütülerek zorunlu olarak onaylanmıştır.
denied
Alan, genellikle bir kabuk komutu yürütülerek zorunlu olarak reddedildi.
migrated
Sistem, eski alan doğrulama yönteminin kullanıldığı önceki bir işlemin sonucunu korudu.
restored
Alan, kullanıcı veri geri yükleme işlemi gerçekleştirdikten sonra onaylandı. Alan adının daha önce doğrulandığı varsayılır.
legacy_failure
Alan, eski bir doğrulayıcı tarafından reddedildi. Hatanın kesin nedeni bilinmiyor.
system_configured
Alan, cihaz yapılandırması tarafından otomatik olarak onaylandı.
1024 veya daha büyük bir hata kodu

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

Ağ bağlantısı oluşturduğunuzdan emin olun ve alan doğrulama sürecini tekrar başlatın.

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

Uygulamanızın bir alan için onaylanmasının bir diğer yolu da kullanıcıdan uygulamanızı bu alanla ilişkilendirmesini istemektir.

Uygulamanızın alan için onaylanıp onaylanmadığını kontrol edin

Kullanıcıya istem göstermeden ö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:

DomainVerificationManager

Aşağıdaki kod snippet'inde DomainVerificationManager API'nin nasıl kullanılacağı gösterilmektedir:

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ı

Geliştirme sırasında uygulamanızı test ederken kuruluşunuzun sahip olduğu 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 çıktıda, uygulama "example.org" alanı için doğrulanamamış olsa da kullanıcı 0, sistem ayarlarında uygulamayı manuel olarak onaylamış ve bu alan için başka bir paket doğrulanmamıştır.

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

Kullanıcının belirli bir alanla hangi uygulamanın ilişkilendirileceğini seçtiği süreci simüle etmek için kabuk komutlarını da kullanabilirsiniz. Bu komutlarla ilgili kapsamlı açıklamayı adb shell pm komutunun çıktısında bulabilirsiniz.

İstekle ilgili bağlam bilgisi verin

Alan onayı isteğinde bulunmadan önce kullanıcıya biraz bağlam bilgisi verin. Örneğin, kullanıcılara bir açılış ekranı, iletişim kutusu veya benzer bir kullanıcı arayüzü öğesi göstererek uygulamanızın neden belirli bir alan için varsayılan işleyici olması gerektiğini açıklayabilirsiniz.

İsteği gönderme

Kullanıcı, uygulamanızın kendisinden ne yapmasını istediğini anladıktan sonra isteğinizi gönderin. Bunu yapmak için aşağıdaki kod snippet'inde gösterildiği gibi, hedef uygulama için ACTION_APP_OPEN_BY_DEFAULT_SETTINGS amaç işlemini ve package:com.example.pkg ile eşleşen bir veri dizesini içeren bir amaç ç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);

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

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

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

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

Uygulamanızın temel işlevi, işlediği alanları doğrulama özelliği olmadan bağlantıları üçüncü taraf olarak açmak olabilir. Bu durumda, kullanıcılara bir web bağlantısı seçtiklerinde 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ı isterse bağlantıyı birinci taraf uygulamasında açmasına olanak tanıyan bir iletişim kutusu veya trambolin etkinliği sunmayı da düşünebilirsiniz. Bu durumda, birinci taraf uygulaması proxy görevi görür. Böyle bir iletişim kutusu veya trambolin etkinliği oluşturmadan önce uygulamanızı, uygulamanızın web amaç filtresiyle eşleşen birinci taraf uygulamalara paket görünürlüğü olacak şekilde ayarlayın.

Uygulama bağlantılarını test etme

Uygulama bağlantısı ö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 ekstre dosyasını test etmek için Ekstre Listesi Oluşturucu ve Test Aracı'nı kullanabilirsiniz.

Doğrulanacak ana makinelerin listesini onaylayın.

Test sırasında, sistemin uygulamanız için doğrulayacağı ilişkili ana makine listesini onaylamanız gerekir. Aşağıdaki özellikleri ve öğeleri içeren karşılık gelen amaç filtrelerinin bulunduğu tüm URL'lerin bir listesini oluşturun:

  • android:scheme özelliği http veya https değeriyle
  • Alan URL'si kalıbı içeren android:host özelliği
  • android.intent.action.VIEW işlem öğesi
  • android.intent.category.BROWSABLE kategori öğesi

Bu listeyi kullanarak, adlandırılmış her ana makinede ve alt alanda bir Digital Asset Links JSON dosyası sağlandığını kontrol edin.

Digital Asset Links dosyalarını onaylayın

Her web sitesi için Digital Asset Links API'yi kullanarak Digital Asset Links JSON dosyasının düzgün şekilde barındırıldığını ve tanımlandığını onaylayı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ı işleme için geçerli sistem ayarlarını kontrol edebilirsiniz. Bağlı cihazınızdaki tüm uygulamalar için mevcut bağlantı işleme politikalarının listesini almak üzere aşağıdaki komutu kullanın:

adb shell dumpsys package domain-preferred-apps

Aşağıdaki kod da aynı işi yapar:

adb shell dumpsys package d

Not: Sistemlerin doğrulama sürecini tamamlaması için uygulamanızı yükledikten sonra en az 20 saniye beklediğinizden emin olun.

Komut, cihazda tanımlanan her kullanıcının veya profilin listesini döndürür. Bu liste, aşağıdaki biçimde bir başlıkla başlar:

App linkages for user 0:

Bu başlığın ardından, çıkışta bağlantı işleme ayarlarını listelemek için aşağıdaki biçim kullanılı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şkili olduğunu gösterir:

  • Package - Bir uygulamayı, manifestinde belirtildiği şekilde paket adına göre tanımlar.
  • Domains - Bu uygulamanın web bağlantılarını işlediği ana makinelerin tam listesini, sınırlayıcı olarak boşlukları kullanarak gösterir.
  • Status: Bu uygulamanın mevcut bağlantı işleme ayarını gösterir. Doğrulamayı geçmiş ve manifesti android:autoVerify="true" içeren bir uygulamanın durumu always olarak gösterilir. Bu durumdan sonraki onaltılık sayı, Android sisteminin kullanıcının uygulama bağlantısı tercihlerine ilişkin kaydıyla ilgilidir. Bu değer, doğrulamanın başarılı olup olmadığını belirtmez.

Not: Bir kullanıcı, doğrulama tamamlanmadan önce bir uygulamanın uygulama bağlantısı ayarlarını değiştirirse doğrulama başarısız olmasına rağmen başarılı bir doğrulama için yanlış pozitif görebilirsiniz. Ancak, kullanıcı desteklenen bağlantıları sormadan açmak için uygulamayı açıkça etkinleştirdiyse bu doğrulama hatası önemli değildir. Bunun nedeni, kullanıcı tercihlerinin programatik doğrulamaya (veya bunun olmamasına) göre öncelikli olmasıdır. Bu nedenle, doğrulama başarılı olmuş gibi bağlantı doğrudan uygulamanıza gider ve iletişim kutusu gösterilmez.

Test örneği

Uygulama bağlantısı doğrulamasının başarılı olması için sistemin, uygulama bağlantıları ölçütlerini karşılayan belirli bir intent filtresinde belirttiğiniz web sitelerinin her biriyle uygulamanızı doğrulayabilmesi gerekir. Aşağıdaki örnekte, birkaç uygulama bağlantısının tanımlandığı 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:

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

Platformun yukarıdaki manifestten doğrulamaya çalışmayacağı ana bilgisayarların listesi:

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

Bildirim listeleri hakkında daha fazla bilgi edinmek için Bildirim Listesi Oluşturma başlıklı makaleyi inceleyin.

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

Android App Link'lerinizi doğrulayamıyorsanız aşağıdaki yaygın hataları kontrol edin. Bu bölümde yer tutucu alan adı olarak example.com kullanılır. Bu kontrolleri yaparken example.com yerine sunucunuzun gerçek alan adını girin.

Yanlış amaç filtresi ayarı
Uygulamanızın sahibi olmadığı bir URL'yi <intent-filter> öğesine 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. (sondaki nokta ile) öğesinin example.com ile aynı içeriği sunduğundan emin olun.

Sunucu tarafı yönlendirmeler

Aşağıdakiler gibi bir yönlendirme ayarlarsanız sistem, uygulamanız için hiçbir Android App Link'i 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, doğrulanabilir olmayan bağlantıları bilerek ekleyebilirsiniz. Android 11 ve önceki sürümlerde bu bağlantıların, sistemin uygulamanız için tüm Android Uygulama Bağlantılarını doğrulamamasına neden olduğunu unutmayın.

assetlinks.json dosyasında yanlış imza var

İmzanızın doğru olduğunu ve uygulamanızı imzalamak için kullanılan imzayla eşleştiğini doğrulayın. Yaygın hatalar şunlardır:

  • Uygulamayı hata ayıklama sertifikasıyla imzalama ve yalnızca assetlinks.json'da yayın imzasına sahip olma.
  • assetlinks.json içinde küçük harfli bir imza kullanıyorsanız. İmza büyük harflerle yazılmalıdır.
  • Play Uygulama İmzalama özelliğini kullanıyorsanız Google'ın her sürümünüzü imzalamak için kullandığı imzayı kullandığınızdan emin olun. Web sitesi ilişkilendirmelerini bildirme ile ilgili talimatları uygulayarak bu ayrıntıları (tam bir JSON snippet'i dahil) doğrulayabilirsiniz.