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

Android Uygulama Bağlantısı, kullanıcının uygulamayı seçmesini gerektirmeden web sitenizin URL'lerinin ilgili içeriği Android uygulamanızda hemen açmasına olanak tanıyan özel bir derin bağlantı türüdür. Android App Links, Digital Asset Links API'sini kullanarak uygulamanızın ilgili alan adına ait bağlantıları otomatik olarak açma konusunda web sitesi tarafından onaylandığına güvenir. Sistem, URL'lerin sahibi olduğunuzu başarıyla doğrularsa sistem 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, sisteme, uygulamanızın intent filtrelerinizde kullanılan URL alanlarına ait olup olmadığını doğrulaması gerektiğini 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ı doğrulaması 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>

Her ana makine için yalnızca bir <intent-filter> bildirimine autoVerify eklenmesi yeterli olsa da, söz konusu ana makine işaretlenmemiş diğer bildirimlerde kullanılsa bile tutarlılık için her bir <intent-filter> öğesine autoVerify eklemeniz önerilir. Bu aynı zamanda, manifest dosyanızdaki öğeleri kaldırdığınızda veya yeniden düzenlemenizden sonra, uygulamanızın hâlâ tanımladığınız tüm alanlarla ilişkili kalmasını sağlar.

Alan doğrulama işlemi internet bağlantısı gerektirir ve işlemin tamamlanması biraz zaman alabilir. Sistem, sürecin verimliliğini artırmak için Android 12 veya sonraki sürümleri hedefleyen bir uygulamanın alanını, yalnızca önceki kod snippet'inde belirtilenle tam olarak aynı biçimi içeren bir <intent-filter> öğesinin içinde bulunuyorsa doğrular.

Birden fazla ana makine için uygulama bağlama desteği

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, Uygulama İçeriğine Derin Bağlantılar Oluşturma bölümünde açıklandığı gibi amacı çözümlemek için varsayılan olarak standart davranışına uyar. Bununla birlikte uygulama, uygulamanın diğer intent filtrelerinde tanımlanan URL kalıpları 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 konumunda assetlinks.json dosyası bulunursa ancak https://www.example.net/.well-known/assetlinks.json için 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ı tanımlayan bir <data> öğesi içerir. Ancak intent filtresinin hem http://www.example.com hem de https://www.example.com 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ğlamayı destekleme

Digital Asset Links protokolü, amaç filtrelerinizdeki alt alan adlarını benzersiz ve ayrı ana makineler olarak ele alır. Dolayısıyla, amaç filtreniz farklı alt alan adlarına sahip birden çok ana makine listeliyorsa 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'ı içerir. Bu nedenle, hem https://www.example.com/.well-known/assetlinks.json hem de https://mobile.example.com/.well-known/assetlinks.json üzerinde geçerli bir assetlinks.json 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

Aynı alanla ilişkilendirilmiş birden fazla uygulama yayınlarsanız uygulamaları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.

Böyle bir durumda, gerekli paket görünürlüğüne sahip olmanız koşuluyla kullanıcının cihazında çakışan olası uygulamalar olup olmadığını 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şkilendirilmiş 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şkilendirilmiş 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 imza 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ılabilen birden fazla parmak izini destekler.

    Uygulamanız için Play Uygulama İmzalama kullanıyorsanız keytool uygulamasını yerel olarak çalıştırarak oluşturulan sertifika parmak izi genellikle kullanıcıların cihazlarındaki parmak iziyle eşleşmez. Uygulamanız için Play Uygulama İmzalama özelliğini kullanıp kullanmadığınızı Release > Setup > App signing altındaki Play Console geliştirici hesabınızda doğrulayabilirsiniz. Bu durumda, aynı sayfada uygulamanız için doğru Digital Asset Links JSON snippet'ini 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ı içinde birden fazla uygulamayla ilişkilendirme bildirebilir. Aşağıdaki dosya listelemesinde, iki uygulamayla ilişkilendirme beyan eden 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ında 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 edebilir. Aşağıdaki dosya girişlerinde, example.com ve example.net ile uygulama1 arasındaki ilişkilendirmenin nasıl bildirileceğine dair bir örnek gösterilmektedir. İlk giriş, example.com'un uygulama1 ile olan ilişkilendirmesini göstermektedir:

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 giriş, example.net ile uygulama1 arasındaki ilişkiyi göstermektedir. 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ı şu 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, 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 olmadan (301 veya 302 yönlendirmeleri 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 bölümüne bakın.
  • Uygulamanızı, herkesin erişemeyeceği geliştirme/test URL'leriyle (örneğin, yalnızca VPN ile erişilebilen URL'ler) birlikte yayınlamayın. Bu tür durumlarda geçici bir çözüm olarak derleme varyantlarını yapılandırarak geliştirici derlemeleri için farklı bir manifest dosyası oluşturabilirsiniz.

Android App Links doğrulaması

Uygulamanızın amaç filtrelerinden en az birinde android:autoVerify="true" varsa uygulamanızı Android 6.0 (API düzeyi 23) veya daha yeni sürümleri ç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 sürecini manuel olarak da başlatabilirsiniz.

Otomatik doğrulama

Sistemin otomatik doğrulaması şunları 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ının ilgili web sitelerini sorgular.

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. 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'den itibaren, cihazda yüklü olan uygulamalar için alan adı doğrulamasını manuel olarak başlatabilirsiniz. Bu işlemi, uygulamanızın Android 12'yi hedefleyip hedeflemediğinden bağımsız olarak gerçekleştirebilirsiniz.

İnternet bağlantısı kurma

Alan doğrulaması 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üncellenen alan doğrulama sürecini otomatik olarak kullanır.

Aksi takdirde, güncellenen doğrulama sürecini manuel olarak etkinleştirebilirsiniz. Bunun 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ında Android App Links'in durumunu sıfırlamanız gerekir. Bunun 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, kullanıcı herhangi bir alan adı için varsayılan uygulamaları seçmeden önce cihazı bulunduğu duruma getirir.

Alan doğrulama sürecini başlat

Bir cihazda Android App Links'in 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ı inceleyin

Doğrulama temsilcisinin isteklerini tamamlaması için biraz bekledikten 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 sonucu şuna 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 gerçekleştirilemediğini 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ğrulamasının belirli bir alan için döndürebileceği olası değerler 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 yeniden 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 zorla onaylandı.
denied
Alan adı, genellikle bir kabuk komutu yürütülerek zorla reddedildi.
migrated
Sistem, eski alan doğrulaması işlemini 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. İlgili hatanın nedeni bilinmiyor.
system_configured
Alan, cihaz yapılandırması tarafından otomatik olarak onaylandı.
Hata kodu 1024 veya daha yüksek

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

Ağ bağlantısı kurduğunuzu bir kez daha kontrol edin ve alan doğrulama işlemini yeniden başlatın.

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

Uygulamanızın bir alan adı 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 adı için zaten onaylanıp onaylanmadığını kontrol etme

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

Alan Adı Doğrulama Yöneticisi

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

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ğrulamada başarısız olduğu halde, 0. kullanıcı sistem ayarlarında uygulamayı manuel olarak onaylamıştır ve bu alan için başka hiç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 hangi uygulamanın belirli bir alanla ilişkilendirilmiş olduğunu 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ı paylaşın

Bu alan onayı isteğinde bulunmadan önce kullanıcıyla ilgili bilgi verin. Örneğin, kullanıcılara bir başlangıç ekranı, iletişim kutusu veya uygulamanızın belirli bir alan için neden varsayılan işleyici olması gerektiğini açıklayan benzer bir kullanıcı arayüzü öğesi gösterebilirsiniz.

İstekte bulunma

Kullanıcı, uygulamanızın kendisinden ne yapmasını 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 intent işlemini ve hedef uygulama için package:com.example.pkg ile eşleşen bir veri dizesi 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);

Niyet ç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ç ayarını 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 alanlarda herhangi bir bağlantıyı seçtiğinde bu bağlantı uygulamanızda otomatik olarak açılır.

Radyo düğmesi etkinleştirildiğinde alt tarafa yakın bir bölümde
    &quot;Bağlantı ekle&quot; düğmesi ve onay kutuları yer alır.
Ş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, işlenen alan adlarını doğrulama imkanı olmayan, üçüncü taraf olarak bağlantıları 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.

Buna ek olarak, kullanıcının tercih etmesi durumunda bağlantıyı birinci taraf uygulamasında açmasına olanak tanıyan ve proxy gibi davranan bir iletişim kutusu veya trambolin etkinliği sunmayı 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 uygulamalarda 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 ifade dosyasını test etmek için İfade Listesi Oluşturma Aracı 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şkilendirilmiş ana makinelerin listesini onaylamanız gerekir. Karşılık gelen 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 makinede ve alt alanda 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ı onaylayın

Her web sitesinde, Digital Asset Links JSON dosyasının doğru şekilde barındırıldığını ve tanımlandığını onaylamak için Digital Asset Links API'sini 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şleme için mevcut sistem ayarlarını kontrol edebilirsiniz. Bağlı cihazınızdaki tüm uygulamalara ilişkin mevcut bağlantı işleme politikalarının listesini almak için 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 işlemini tamamlamasına izin vermek için uygulamanız yüklendikten sonra en az 20 saniye bekleyin.

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 üstbilgiden sonra çıkış, söz konusu 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 alan adlarıyla ilişkilendirilmiş olduğunu gösterir:

  • Package: Bir uygulamayı, manifest dosyasında belirtilen paket adına göre tanımlar.
  • Domains: Ayırıcı olarak boş alanlar kullanarak, bu uygulamanın işlediği web bağlantılarının yer aldığı ana makinelerin tam listesini gösterir.
  • Status - Bu uygulama için geçerli bağlantı işleme ayarını gösterir. Doğrulamayı geçen ve manifest'inde android:autoVerify="true" bulunan bir uygulamada always durumu gösterilir. Bu durumdan sonraki onaltılık sayı, Android sisteminin kullanıcının uygulama bağlantısı tercihleriyle ilgili kaydı ile ilgilidir. Bu değer, doğrulamanın başarılı olup olmadığını göstermez.

Not: Kullanıcılar, doğrulama tamamlanmadan önce 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 gösterilebilir. Ancak bu doğrulama hatası, kullanıcının desteklenen bağlantıları sormadan açacak şekilde uygulamayı açıkça etkinleştirip etkinleştirmediği önemli değildir. Bunun nedeni, kullanıcı tercihlerinin programatik doğrulamaya (veya bu doğrulamanın olmaması) göre öncelikli olmasıdır. Bunun sonucunda bağlantı, doğrulama başarılı olmuş gibi iletişim kutusu gösterilmeden doğrudan uygulamanıza yönlendirir.

Test örneği

Uygulama bağlantısı doğrulamasının başarılı olması için sistemin, belirli bir intent filtresinde belirttiğiniz ve uygulama bağlantıları ölçütlerini karşılayan tüm web siteleri ile uygulamanızı doğrulayabilmesi gerekir. Aşağıdaki örnekte, çeşitli uygulama bağlantıları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 makinelerin 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)

İfade listeleri hakkında daha fazla bilgi için İfade Listesi Oluşturma bölümüne bakın.

Yaygın uygulama hatalarını düzeltme

Android App Links'i 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 gerçekleştirirken example.com yerine sunucunuzun gerçek alan adını kullanın.

Yanlış intent filtresi ayarlanmış
Bir <intent-filter> öğesine uygulamanızın sahip olmadığı bir URL ekleyip eklemediğinizi kontrol edin.
Hatalı 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 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 karşılaşılan hatalar:

  • Uygulamayı bir hata ayıklama sertifikasıyla imzalama ve sürüm imzasını yalnızca assetlinks.json üzerinde bulundurma.
  • assetlinks.json içinde küçük harfli imza kullanma. İmza büyük harfle yazılmalıdır.
  • Play Uygulama İmzalama 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 ile ilgili talimatları uygulayarak eksiksiz bir JSON snippet'i de dahil olmak üzere bu ayrıntıları doğrulayabilirsiniz.