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

Android uygulama bağlantısı, web sitesi URL'lerinizin kullanıcının uygulamayı seçmesini gerektirmeden Android uygulamanızda ilgili içeriği hemen açmasına olanak tanıyan özel bir derin bağlantı türüdür. Android uygulama bağlantıları, uygulamanızın web sitesi tarafından onaylandığına dair güven oluşturmak için Digital Asset Links API'yi kullanır. Böylece, uygulamanız ilgili alanın bağlantılarını otomatik olarak açabilir. Sistem, URL'lerin sahibi olduğunuzu başarıyla doğrularsa bu URL intent'lerini otomatik olarak uygulamanıza yönlendirir.

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

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

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

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

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

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

Uygulamanız için bağlantı işleme doğrulamasını etkinleştirmek üzere 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". -->
    <!-- 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>

Her ana makine için yalnızca bir <intent-filter> beyanında autoVerify eklemek yeterli olsa da, bu ana makine işaretlenmemiş diğer beyanlarda kullanılsa bile tutarlılık için her <intent-filter> öğesine autoVerify eklemeniz önerilir. Bu, manifest dosyanızdaki öğeleri kaldırdıktan veya yeniden yapılandırdıktan sonra uygulamanızın, hâlâ tanımladığınız tüm alanlarla ilişkili kalmasını da sağlar.

Alan doğrulama süreci için internet bağlantısı gerekir ve tamamlanması biraz zaman alabilir. Sistemin, sürecin verimliliğini artırmasına yardımcı olmak için Android 12 veya sonraki sürümleri hedefleyen bir uygulamanın alanını doğrulaması için alanın, önceki kod snippet'inde belirtilen tam biçimi içeren bir <intent-filter> öğesi içinde olması gerekir. Örneğin, "http" ve "https" dışındaki şemalar (<data android:scheme="custom" /> gibi), <intent-filter> ürününün alan 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, söz konusu amaç filtresindeki ilgili web alanlarında barındırılan Digital Asset Links dosyalarıyla doğrulayabilmelidir. Doğrulama başarısız olursa sistem, amacı çözümlemek için varsayılan olarak Uygulama İçeriğine Derin Bağlantılar Oluşturma bölümünde açıklandığı gibi varsayılan davranışı uygular. Ancak uygulama, diğer intent filtrelerinde tanımlanan URL kalıplarından herhangi biri için 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 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 intent filtrelerine sahip bir uygulama, https://www.example.com/.well-known/assetlinks.json alanında bir assetlinks.json dosyası bulunduğunda ancak https://www.example.net/.well-known/assetlinks.json alanında bulunmadığında yalnızca https://www.example.com için doğrulama işlemini 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ştirilmiş özelliklerinin tüm varyasyonlarını hesaba katmak için birleştirilir. Örneğin, yukarıdaki ilk intent filtresi yalnızca HTTPS şemasını açıklayan bir <data> öğesi içerir. Ancak intent 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 fazla alt alan adı için uygulama bağlama desteği

Digital Asset Links protokolü, intent filtrelerinizdeki alt alan adlarını benzersiz ve ayrı ana makineler olarak değerlendirir. Bu nedenle, intent filtrenizde farklı alt alan adlarına sahip birden fazla barındırıcı listeleniyorsa her alanda geçerli bir assetlinks.json yayınlamanız gerekir. Örneğin, aşağıdaki intent filtresi, kabul edilen intent URL 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'de 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) tanımlarsanız assetlinks.json dosyanızı kök ana makine adında (example.com) yayınlamanız gerekir. Örneğin, aşağıdaki intent filtresine sahip bir uygulama, assetlinks.json dosyasının https://example.com/.well-known/assetlinks.json adresinde yayınlandığı sürece example.com alt adlarının (ör. foo.example.com) doğrulamasından 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 çok uygulama olup olmadığını kontrol edin

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

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 bir özel 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 intent'lerini 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 beyan edilen uygulama kimliği.
  • 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 izi destekler.

    Uygulamanız için Play Uygulama İmzalama'yı kullanıyorsanız keytool'nin 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 İmzası'nı kullanıp kullanmadığınızı Play Console geliştirici hesabınızdaki Release > Setup > App signing bölümünden doğrulayabilirsiniz. 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ı, 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şkilendirme bildirebilir. Aşağıdaki dosya listesinde, iki uygulamayla ayrı ayrı ilişkilendirmeyi belirten 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ı altındaki farklı kaynakların bağlantılarını işleyebilir. Örneğin, uygulama1 https://example.com/articles için amaç filtresi, uygulama2 ise https://example.com/videos için amaç filtresi beyan edebilir.

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

Birden fazla web sitesini tek bir uygulamayla ilişkilendirme

Birden fazla web sitesi, ilgili assetlinks.json dosyalarında aynı uygulamayla ilişkilendirme beyanında bulunabilir. Aşağıdaki dosya listelemelerinde, example.com ve example.net ile app1 arasındaki ilişkilendirmenin nasıl tanımlanacağıyla ilgili bir örnek gösterilmektedir. İlk girişte, example.com ile app1 arasındaki ilişki 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"]
  }
}]

Aşağıdaki girişte, example.net'in app1 ile ilişkisi gösterilmektedir. Yalnızca bu dosyaların barındırıldığı konum farklı (.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ı, application/json içerik türüyle sunulur.
  • Uygulamanızın intent filtrelerinin veri şeması olarak HTTPS'yi tanımlayıp tanımlamadığına bakılmaksızın assetlinks.json dosyasına HTTPS bağlantısı üzerinden erişilebilmelidir.
  • assetlinks.json dosyasına herhangi bir yönlendirme olmadan erişilebilmelidir (301 veya 302 yönlendirmesi olmamalıdır).
  • Uygulama bağlantılarınız birden fazla ana makine alanını destekliyorsa assetlinks.json dosyasını her alanda yayınlamanız gerekir. Çoklu ana makine için uygulama bağlamayı destekleme başlıklı makaleyi inceleyin.
  • Uygulamanızı, manifest dosyasında herkese açık olmayan (ör. yalnızca VPN ile erişilebilen) geliştirici/test URL'leriyle yayınlamayın. Bu tür durumlarda geçici bir çözüm, derleme varyantlarını yapılandırarak geliştirici derlemeleri için farklı bir manifest dosyası oluşturmaktır.

Android uygulama bağlantıları doğrulaması

Uygulamanızın intent filtrelerinden en az birinde android:autoVerify="true" varsa uygulamanızı Android 6.0 (API düzeyi 23) veya sonraki bir sürümün yüklü olduğu bir cihaza yüklediğinizde sistem, uygulamanızın intent filtrelerindeki URL'lerle ilişkili ana makineleri otomatik olarak doğrular. 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 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 https://hostname/.well-known/assetlinks.json adresindeki Digital Asset Links dosyasıyla ilgili web sitelerini sorgulayarak

Uygulamanızla ilişkilendirilecek web sitelerinin listesini ve barındırılan JSON dosyasının geçerli olduğunu onayladıktan sonra uygulamayı cihazınıza yükleyin. Asenkron doğrulama sürecinin tamamlanması için en az 20 saniye bekleyin. Sistemin uygulamanızı doğrulayıp doğru bağlantı işleme politikalarını ayarlayıp ayarlamadığı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, cihaza yüklenmiş 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ını gerçekleştirmek 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 bir sürümü 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

Cihazda Android App Links'in durumunu sıfırlama

Bir cihazda alan doğrulamasını 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 terminal penceresinde aşağıdaki komutu çalıştırın:

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

Bu komut, kullanıcı herhangi bir alan için varsayılan uygulamaları seçmeden önceki duruma cihazı döndürür.

Alan doğrulama sürecini başlatma

Bir cihazdaki Android uygulama bağlantılarının durumunu sıfırladıktan sonra doğrulamayı kendiniz 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 temsilcisinin isteklerini tamamlaması için biraz zaman tanıdıktan sonra doğrulama sonuçlarını inceleyin. Bu işlemi yapmak için şu komutu çalıştırın:

adb shell pm get-app-links PACKAGE_NAME

Bu komutun çıkışı 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ğrulaması durumu verified olur. Diğer tüm durumlar, alan doğrulamasının yapılamadığını gösterir. Özellikle none durumu, doğrulama temsilcisinin doğrulama sürecini henüz tamamlamamış olabileceğini gösterir.

Aşağıdaki listede, alan doğrulamasının belirli bir alan için döndürebileceği olası değer 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 sürecini tekrar başlatın.
verified
Alan, beyan eden uygulama için başarıyla doğrulandı.
approved
Alan, genellikle bir kabuk komutu çalıştırılarak zorunlu olarak onaylandı.
denied
Alan, genellikle bir kabuk komutu çalıştırılarak zorla reddedildi.
migrated
Sistem, eski alan doğrulamasını kullanan önceki bir işlemin sonucunu korudu.
restored
Kullanıcı, veri geri yükleme işlemini gerçekleştirdikten sonra alan onaylandı. Alanın daha önce doğrulandığı varsayılır.
legacy_failure
Alan, eski bir doğrulayıcı tarafından reddedildi. Belirli hata 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 onay almasının bir diğer yolu da kullanıcıdan uygulamanızı ilgili alanla ilişkilendirmesini istemektir.

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

Kullanıcıdan izin istemeden önce, uygulamanızın <intent-filter> öğelerinizde tanımladığınız alanların varsayılan işleyicisi olup olmadığını kontrol edin. Onay durumunu aşağıdaki yöntemlerden birini kullanarak 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ş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 çıktıda, uygulama "example.org" alanı için doğrulama işlemini geçememesine rağmen 0 numaralı kullanıcı, uygulamayı sistem ayarlarında manuel olarak onaylamıştır ve söz konusu 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 ilişkili uygulamayı seçtiği süreci simüle etmek için kabuk komutlarını da kullanabilirsiniz. Bu komutların tam açıklamasını adb shell pm çıkışında bulabilirsiniz.

İsteğin bağlamını belirtin

Alan onayı için bu isteği göndermeden önce kullanıcıyla ilgili bazı bilgiler verin. Örneğin, kullanıcıya uygulamanızın belirli bir alan için neden varsayılan işleyici olması gerektiğini açıklayan bir açılış ekranı, iletişim kutusu veya benzer bir kullanıcı arayüzü öğesi gösterebilirsiniz.

İsteği gönderin

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

Intent ç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ç adlı 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 alan adlarını seçebilirler. Şekil 2'de gösterildiği gibi, alan eklemek için Bağlantı ekle'yi de seçebilirler. Kullanıcılar daha sonra ekledikleri alan adlarındaki herhangi bir bağlantıyı seçtiğinde bağlantı otomatik olarak uygulamanızda açılır.

Radyo düğmesi etkinleştirildiğinde, alt kısımdaki bir bölümde onay kutularının yanı sıra &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şkilendirmek için ek alanlar seçebileceği iletişim kutusu.

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

Uygulamanızın ana işlevi, yönetilen alanlarını doğrulama yeteneği olmadan bağlantıları üçüncü taraf olarak açmak olabilir. Bu durumda, kullanıcılara web bağlantısı seçerken birinci taraf uygulaması ile üçü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ının tercih etmesi durumunda bağlantıyı birinci taraf uygulamasında açmasına olanak tanıyan bir iletişim kutusu veya trampolin etkinliği sunabilirsiniz. Bu tür bir iletişim kutusu veya trampolin etkinliği oluşturmadan önce uygulamanızı, uygulamanızın web intent filtresiyle eşleşen birinci taraf uygulamalarına paket görünürlüğü olacak şekilde ayarlayın.

Uygulama bağlantılarını test etme

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ı oluşturma 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 makine 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 filtreleri aşağıdaki özellikleri ve öğeleri içeren tüm URL'lerin listesini oluşturun:

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

Her adlandırılmış 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 doğru şekilde barındırıldığından ve tanımlandığından emin olmak üzere 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ı işlemeyle ilgili mevcut 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

Alternatif olarak aşağıdakiler de aynı şeyi yapar:

adb shell dumpsys package d

Not: Sistemin 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ı veya profilin listesini, öncesinde aşağıdaki biçimde bir başlıktan yararlanarak döndürür:

App linkages for user 0:

Bu başlığın ardından, çıkışta ilgili kullanıcının 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 liste, ilgili kullanıcının hangi uygulamaların hangi alan adlarıyla ilişkilendirildiğini gösterir:

  • Package: Bir uygulamayı, manifest dosyasında belirtilen paket adına göre tanımlar.
  • Domains: Bu uygulamanın web bağlantılarını işlediği ana makinelerin tam listesini, ayırıcı olarak boşluklar kullanılarak gösterir.
  • Status: Bu uygulamanın geçerli 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 sonra gelen on altılık sayı, Android sisteminin kullanıcının uygulama bağlantısı tercihlerini kaydetmesiyle 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 olsa bile doğrulama işleminin başarılı olduğuyla ilgili yanlış pozitif bir sonuç görebilirsiniz. Ancak kullanıcı, uygulamanın desteklenen bağlantıları sormadan açmasını açıkça etkinleştirdiyse bu doğrulama hatası önemli değildir. Bunun nedeni, kullanıcı tercihlerinin programatik doğrulamaya (veya bu doğrulamanın olmaması) göre öncelikli olmasıdır. Sonuç olarak, bağlantı, doğrulama başarılı olmuş gibi bir iletişim kutusu göstermeden doğrudan uygulamanıza yönlendirir.

Test örneği

Uygulama bağlantısı doğrulamasının başarılı olması için sistemin, uygulamanızı uygulama bağlantılarıyla ilgili ölçütleri karşılayan belirli bir intent filtresinde belirttiğiniz web sitelerinin her biriyle 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 manifest dosyasından doğrulamaya çalışacağı ana makinelerin listesi:

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

Platformun yukarıdaki manifest dosyasından doğrulama denemeyeceği barındırıcıları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)

Açıklama listeleri hakkında daha fazla bilgi edinmek için Açıklama Listesi Oluşturma başlıklı makaleyi 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ılır. Bu kontrolleri yaparken example.com yerine sunucunuzun gerçek alan adını kullanın.

Yanlış intent filtresi ayarlanmış
<intent-filter> öğesine uygulamanızın sahibi olmadığı bir URL 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 App Links'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 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 Uygulama Bağlantıları'nı doğrulamamasına neden olacağını 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 karşılaşılan hatalar:

  • Uygulamanın hata ayıklama sertifikasıyla imzalanması ve assetlinks.json'te yalnızca sürüm imzasının bulunması.
  • assetlinks.json içinde küçük harfli bir imza olması. İ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şkilerini beyan etme ile ilgili talimatları uygulayarak JSON snippet'inin tamamı da dahil olmak üzere bu ayrıntıları doğrulayabilirsiniz.