Memverifikasi Link Aplikasi Android

Link Aplikasi Android adalah jenis deep link khusus yang memungkinkan URL situs Anda segera membuka konten yang sesuai di aplikasi Android, tanpa memerlukan pengguna untuk memilih aplikasi tersebut. Link Aplikasi Android menggunakan Digital Asset Links API untuk membangun kepercayaan bahwa aplikasi Anda telah disetujui oleh situs agar otomatis membuka link untuk domain tersebut. Jika sistem berhasil memverifikasi bahwa Anda adalah pemilik URL, sistem akan otomatis mengarahkan intent URL tersebut ke aplikasi Anda.

Untuk memverifikasi bahwa Anda adalah pemilik aplikasi dan URL situs, selesaikan langkah-langkah berikut:

  1. Menambahkan filter intent yang berisi atribut autoVerify. Atribut ini memberi sinyal kepada sistem bahwa aplikasi harus memverifikasi apakah aplikasi Anda termasuk dalam domain URL yang digunakan dalam filter intent.

  2. Deklarasikan pengaitan antara situs dan filter intent Anda dengan menghosting file JSON Digital Asset Links di lokasi berikut:

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

Anda dapat menemukan informasi terkait dalam referensi berikut:

Menambahkan filter intent untuk verifikasi link aplikasi

Guna mengaktifkan verifikasi penanganan link untuk aplikasi Anda, tambahkan filter intent yang cocok dengan format berikut:

<!-- 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>

Meskipun sudah cukup menyertakan autoVerify hanya dalam satu deklarasi <intent-filter> untuk setiap host, meskipun host tersebut digunakan di seluruh deklarasi lain yang tidak ditandai, sebaiknya Anda menambahkan autoVerify ke setiap elemen <intent-filter> demi konsistensi. Hal ini juga memastikan bahwa, setelah Anda menghapus atau memfaktorkan ulang elemen di file manifes, aplikasi Anda tetap terkait dengan semua domain yang masih Anda tetapkan.

Proses verifikasi domain memerlukan koneksi internet dan dapat memakan waktu beberapa saat hingga selesai. Untuk membantu meningkatkan efisiensi proses, sistem akan memverifikasi domain untuk aplikasi yang menargetkan Android 12 atau yang lebih tinggi hanya jika domain tersebut berada dalam elemen <intent-filter> yang berisi format persis yang ditentukan dalam cuplikan kode sebelumnya.

Mendukung penautan aplikasi untuk beberapa host

Sistem harus dapat memverifikasi host yang ditentukan dalam elemen data filter intent URL aplikasi dengan file Digital Asset Links yang dihosting di domain web masing-masing dalam filter intent tersebut. Jika verifikasi gagal, sistem akan ditetapkan secara default ke perilaku standar untuk menyelesaikan intent, seperti yang dijelaskan dalam Membuat Deep Link ke Konten Aplikasi. Namun, aplikasi masih dapat diverifikasi sebagai pengendali default untuk salah satu pola URL yang ditentukan dalam filter intent lainnya dari aplikasi tersebut.

Catatan: Di Android 11 (API level 30) dan yang lebih rendah, sistem tidak memverifikasi aplikasi Anda sebagai pengendali default, kecuali jika menemukan file Digital Asset Links yang cocok untuk semua host yang Anda tentukan dalam manifes.

Contohnya, aplikasi dengan filter intent berikut akan lulus verifikasi hanya untuk https://www.example.com jika file assetlinks.json ditemukan di https://www.example.com/.well-known/assetlinks.json, tetapi tidak di https://www.example.net/.well-known/assetlinks.json:

<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>

Catatan: Semua elemen <data> dalam filter intent yang sama digabungkan untuk memperhitungkan semua variasi atribut gabungannya. Misalnya, filter intent pertama di atas menyertakan elemen <data> yang hanya mendeklarasikan skema HTTPS. Namun, filter tersebut dikombinasikan dengan elemen <data> lainnya sehingga filter intent mendukung http://www.example.com dan https://www.example.com. Dengan demikian, Anda harus membuat filter intent yang terpisah jika ingin menentukan kombinasi tertentu dari domain dan skema URI.

Mendukung penautan aplikasi untuk beberapa subdomain

Protokol Digital Asset Links memperlakukan subdomain di filter intent Anda sebagai host yang unik dan terpisah. Jadi, jika filter intent Anda mencantumkan beberapa host dengan subdomain yang berbeda, Anda harus memublikasikan assetlinks.json yang valid di setiap domain. Misalnya, filter intent berikut menyertakan www.example.com dan mobile.example.com sebagai host URL intent yang disetujui. Jadi, assetlinks.json yang valid harus dipublikasikan di https://www.example.com/.well-known/assetlinks.json dan https://mobile.example.com/.well-known/assetlinks.json.

<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>

Atau, jika Anda mendeklarasikan nama host dengan karakter pengganti (seperti *.example.com), Anda harus memublikasikan file assetlinks.json di nama host root (example.com). Misalnya, aplikasi dengan filter intent berikut akan lulus verifikasi untuk setiap sub-nama example.com (seperti foo.example.com) selama file assetlinks.json dipublikasikan di https://example.com/.well-known/assetlinks.json:

<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>

Periksa beberapa aplikasi yang dikaitkan dengan domain yang sama

Jika Anda memublikasikan beberapa aplikasi yang masing-masing terhubung dengan domain yang sama, aplikasi tersebut masing-masing dapat diverifikasi dengan sukses. Namun, jika aplikasi dapat menyelesaikan host domain dan jalurnya yang sama persis, seperti yang terjadi pada aplikasi versi ringan dan lengkap, hanya aplikasi yang baru saja diinstal yang dapat menyelesaikan intent web untuk domain tersebut.

Dalam kasus seperti ini, periksa kemungkinan adanya aplikasi yang bentrok di perangkat pengguna, asalkan Anda memiliki visibilitas paket yang diperlukan. Kemudian, di aplikasi Anda, tampilkan dialog pemilih kustom yang berisi hasil dari memanggil queryIntentActivities(). Pengguna dapat memilih aplikasi yang disukai dari daftar aplikasi yang cocok yang muncul dalam dialog.

Mendeklarasikan keterkaitan situs

File JSON Digital Asset Links harus dipublikasikan di situs Anda untuk menunjukkan aplikasi Android yang terkait dengan situs dan memverifikasi intent URL aplikasi. File JSON menggunakan kolom berikut untuk mengidentifikasi aplikasi terkait:

  • package_name: ID aplikasi yang dideklarasikan dalam file build.gradle aplikasi.
  • sha256_cert_fingerprints: Sidik jari SHA256 dari sertifikat penandatanganan aplikasi Anda. Anda dapat menggunakan perintah berikut untuk membuat sidik jari melalui keytool Java:
    keytool -list -v -keystore my-release-key.keystore
    
    Kolom ini mendukung beberapa sidik jari, yang dapat digunakan untuk mendukung berbagai versi aplikasi Anda, seperti build produksi dan debug.

    Jika Anda menggunakan Penandatanganan Aplikasi Play untuk aplikasi, sidik jari sertifikat yang dihasilkan dengan menjalankan keytool secara lokal biasanya tidak akan cocok dengan sidik jari yang ada di perangkat pengguna. Anda dapat memverifikasi apakah menggunakan Penandatanganan Aplikasi Play untuk aplikasi di akun developer Konsol Play di bagian Release > Setup > App signing. Jika menggunakannya, Anda juga akan menemukan cuplikan JSON Digital Asset Links yang tepat untuk aplikasi Anda di halaman yang sama.

Contoh file assetlinks.json berikut memberikan hak membuka link ke aplikasi Android com.example:

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

Mengaitkan situs dengan beberapa aplikasi

Situs dapat mendeklarasikan keterkaitan dengan beberapa aplikasi dalam file assetlinks.json yang sama. Daftar file berikut menunjukkan contoh file pernyataan yang mendeklarasikan keterkaitan dengan dua aplikasi, secara terpisah, dan berada di https://www.example.com/.well-known/assetlinks.json:

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

Aplikasi berbeda dapat menangani link untuk resource yang berbeda dengan host web yang sama. Misalnya, app1 dapat mendeklarasikan filter intent untuk https://example.com/articles, dan app2 dapat mendeklarasikan filter intent untuk https://example.com/videos.

Catatan: Beberapa aplikasi yang telah dikaitkan dengan domain dapat ditandatangani dengan sertifikat yang sama atau berbeda.

Mengaitkan beberapa situs dengan satu aplikasi

Beberapa situs dapat mendeklarasikan keterkaitan dengan aplikasi yang sama pada file assetlinks.json masing-masing. Daftar file berikut menunjukkan contoh cara mendeklarasikan keterkaitan example.com dan example.net dengan app1. Daftar pertama menunjukkan keterkaitan example.com dengan app1:

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

Daftar berikutnya menunjukkan keterkaitan example.net dengan app1. Yang berbeda hanya lokasi tempat file-file ini dihosting (.com dan .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"]
  }
}]

Memublikasikan file verifikasi JSON

Anda harus memublikasikan file verifikasi JSON Anda di lokasi berikut:

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

Pastikan hal-hal berikut:

  • File assetlinks.json ditayangkan dengan jenis konten application/json.
  • File assetlinks.json harus dapat diakses melalui sambungan HTTPS, terlepas apakah filter intent aplikasi Anda mendeklarasikan HTTPS sebagai skema data.
  • File assetlinks.json harus dapat diakses tanpa pengalihan apa pun (tanpa pengalihan 301 atau 302).
  • Jika link aplikasi Anda mendukung beberapa domain host, Anda harus memublikasikan file assetlinks.json di setiap domain. Lihat Mendukung penautan aplikasi untuk beberapa host.
  • Jangan memublikasikan aplikasi dengan URL dev/test dalam file manifes yang mungkin tidak dapat diakses oleh publik (seperti yang hanya dapat diakses dengan VPN). Salah satu penyelesaian untuk kasus tersebut adalah mengonfigurasi varian build guna menghasilkan file manifes berbeda untuk build dev.

Verifikasi Link Aplikasi Android

Jika android:autoVerify="true" ada di setidaknya salah satu filter intent aplikasi Anda, menginstal aplikasi di perangkat yang menjalankan Android 6.0 (API level 23) atau yang lebih tinggi akan menyebabkan sistem secara otomatis memverifikasi host yang terkait dengan URL dalam filter intent aplikasi Anda. Di Android 12 dan yang lebih tinggi, Anda juga dapat memanggil proses verifikasi secara manual untuk menguji logika verifikasi.

Verifikasi otomatis

Verifikasi otomatis sistem mencakup hal berikut:

  1. Sistem memeriksa semua filter intent yang menyertakan salah satu dari hal berikut ini:
    • Tindakan: android.intent.action.VIEW
    • Kategori: android.intent.category.BROWSABLE dan android.intent.category.DEFAULT
    • Skema data: http atau https
  2. Untuk setiap hostname unik yang ditemukan pada filter intent di atas, Android akan mengkueri situs yang sesuai untuk file Digital Asset Links di https://hostname/.well-known/assetlinks.json.

Setelah mengonfirmasi daftar situs yang akan dikaitkan dengan aplikasi Anda, dan telah mengonfirmasi bahwa file JSON yang dihosting valid, instal aplikasi di perangkat. Tunggu minimal 20 detik hingga proses verifikasi asinkron selesai. Gunakan perintah berikut untuk memeriksa apakah sistem telah memverifikasi aplikasi Anda dan menetapkan kebijakan penanganan link yang benar:

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

Verifikasi manual

Mulai di Android 12, Anda dapat memanggil verifikasi domain untuk aplikasi yang diinstal di perangkat secara manual. Baik aplikasi Anda menargetkan Android 12 maupun tidak, Anda tetap dapat menjalankan proses ini.

Membuat koneksi internet

Untuk melakukan verifikasi domain, perangkat uji harus terhubung ke internet.

Mendukung proses verifikasi domain yang diupdate

Jika aplikasi Anda menargetkan Android 12 atau yang lebih baru, sistem akan menggunakan proses verifikasi domain yang diperbarui secara otomatis.

Jika tidak, Anda dapat mengaktifkan proses verifikasi yang diperbarui secara manual. Untuk melakukannya, jalankan perintah berikut di jendela terminal:

adb shell am compat enable 175408749 PACKAGE_NAME

Mereset status Link Aplikasi Android di perangkat

Sebelum menjalankan verifikasi domain secara manual di perangkat, Anda harus mereset status Link Aplikasi Android di perangkat pengujian. Untuk melakukannya, jalankan perintah berikut di jendela terminal:

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

Perintah ini menempatkan perangkat dalam keadaan yang sama seperti sebelum pengguna memilih aplikasi default untuk domain apa pun.

Memanggil proses verifikasi domain

Setelah mereset status Link Aplikasi Android di perangkat, Anda dapat melakukannya sendiri. Untuk melakukannya, jalankan perintah berikut di jendela terminal:

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

Meninjau hasil verifikasi

Setelah memberikan waktu kepada agen verifikasi untuk menyelesaikan permintaannya, tinjau hasil verifikasi. Untuk melakukannya, jalankan perintah berikut:

adb shell pm get-app-links PACKAGE_NAME

Output perintah ini mirip dengan contoh berikut:

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

Domain yang berhasil lulus verifikasi memiliki status verifikasi domain verified. Status lainnya menunjukkan bahwa verifikasi domain tidak dapat dilakukan. Secara khusus, status none menunjukkan bahwa agen verifikasi mungkin belum menyelesaikan proses verifikasi.

Daftar berikut menunjukkan kemungkinan nilai yang dapat ditampilkan oleh verifikasi domain untuk domain tertentu:

none
Tidak ada yang direkam untuk domain ini. Tunggu beberapa menit lagi agar agen verifikasi menyelesaikan permintaan yang terkait dengan verifikasi domain, lalu aktifkan proses verifikasi domain lagi.
verified
Domain untuk aplikasi pendeklarasi berhasil diverifikasi.
approved
Domain disetujui secara paksa, biasanya dengan menjalankan perintah shell.
denied
Domain ditolak secara paksa, biasanya dengan menjalankan perintah shell.
migrated
Sistem mempertahankan hasil dari proses sebelumnya yang menggunakan verifikasi domain lama.
restored
Domain disetujui setelah pengguna melakukan pemulihan data. Domain dianggap telah diverifikasi sebelumnya.
legacy_failure
Domain ditolak oleh pemverifikasi lama. Alasan kegagalan spesifik tidak diketahui.
system_configured
Domain disetujui secara otomatis oleh konfigurasi perangkat.
Kode error dari 1024 atau yang lebih tinggi

Kode error kustom yang khusus untuk pemverifikasi perangkat.

Periksa kembali apakah Anda telah membuat koneksi jaringan, lalu panggil proses verifikasi domain lagi.

Meminta pengguna menghubungkan aplikasi dengan domain

Cara lain agar aplikasi untuk suatu domain disetujui adalah dengan meminta pengguna menghubungkan aplikasi Anda dengan domain tersebut.

Memastikan aplikasi untuk domain sudah disetujui

Sebelum meminta pengguna, periksa apakah aplikasi Anda merupakan pengendali default untuk domain yang Anda tentukan di elemen <intent-filter>. Anda dapat meminta status persetujuan menggunakan salah satu metode berikut:

DomainVerificationManager

Cuplikan kode berikut menunjukkan cara menggunakan API DomainVerificationManager:

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

Program command-line

Saat menguji aplikasi selama pengembangan, Anda dapat menjalankan perintah berikut untuk meminta status verifikasi domain yang dimiliki organisasi Anda:

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

Pada contoh output berikut, meskipun aplikasi gagal melakukan verifikasi untuk domain "example.org", pengguna 0 telah menyetujui aplikasi secara manual di setelan sistem, dan tidak ada paket lain yang diverifikasi untuk domain tersebut.

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

Anda juga dapat menggunakan perintah shell untuk menyimulasikan proses saat pengguna memilih aplikasi mana yang terkait dengan domain tertentu. Penjelasan lengkap tentang perintah ini tersedia dari output adb shell pm.

Memberikan konteks untuk permintaan

Sebelum Anda membuat permintaan persetujuan domain ini, berikan beberapa konteks untuk pengguna. Misalnya, Anda dapat menampilkan layar pembuka, dialog, atau elemen UI serupa yang menjelaskan kepada pengguna mengapa aplikasi Anda harus menjadi pengendali default untuk domain tertentu.

Membuat Permintaan

Setelah pengguna memahami tindakan yang diminta oleh aplikasi Anda, buat permintaan. Untuk melakukannya, aktifkan intent yang menyertakan tindakan intent ACTION_APP_OPEN_BY_DEFAULT_SETTINGS, dan string data yang cocok package:com.example.pkg untuk aplikasi target, seperti yang ditampilkan di cuplikan kode berikut:

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

Saat intent dipanggil, pengguna akan melihat layar setelan yang disebut Buka secara default. Layar ini berisi tombol pilihan yang disebut Buka link yang didukung, seperti yang ditunjukkan pada gambar 1.

Saat mengaktifkan Buka link yang didukung, serangkaian kotak centang akan muncul di bagian yang disebut Link yang akan dibuka di aplikasi ini. Dari sini, pengguna dapat memilih domain yang ingin dikaitkan dengan aplikasi Anda. Pengguna juga dapat memilih Tambahkan link untuk menambahkan domain, seperti yang ditunjukkan pada gambar 2. Ketika nantinya pengguna memilih link mana pun di dalam domain yang ditambahkan, link akan terbuka di aplikasi Anda secara otomatis.

Saat tombol pilihan diaktifkan, bagian di dekat bagian bawah
    menyertakan kotak centang dan tombol bernama &#39;Tambahkan link&#39;
Gambar 1. Layar setelan sistem tempat pengguna dapat memilih link mana yang terbuka di aplikasi Anda secara default.
Setiap kotak centang mewakili domain yang dapat Anda tambahkan. Tombol dialog adalah &#39;Batalkan&#39; dan &#39;Tambahkan&#39;.
Gambar 2. Dialog tempat pengguna dapat memilih domain tambahan untuk dihubungkan dengan aplikasi Anda.

Membuka domain di aplikasi Anda yang tidak dapat diverifikasi oleh aplikasi

Fungsi utama aplikasi Anda mungkin untuk membuka link sebagai pihak ketiga, tanpa kemampuan untuk memverifikasi domain yang ditangani. Jika hal ini terjadi, jelaskan kepada pengguna bahwa, pada saat mereka memilih link web, mereka tidak dapat memilih antara aplikasi pihak pertama dan aplikasi (pihak ketiga) Anda. Pengguna harus menghubungkan domain secara manual dengan aplikasi pihak ketiga.

Selain itu, pertimbangkan untuk memperkenalkan aktivitas dialog atau trampolin yang memungkinkan pengguna membuka link di aplikasi pihak pertama jika pengguna lebih memilih untuk melakukannya agar bertindak sebagai proxy. Sebelum menyiapkan dialog atau aktivitas trampolin, siapkan aplikasi Anda sehingga memiliki visibilitas paket ke aplikasi pihak pertama yang cocok dengan filter intent web aplikasi Anda.

Menguji link aplikasi

Saat mengimplementasikan fitur penautan aplikasi, Anda harus menguji fungsi penautan untuk memastikan sistem dapat mengaitkan aplikasi dengan situs Anda, dan menangani permintaan URL, seperti yang Anda harapkan.

Untuk menguji file pernyataan yang ada, Anda dapat menggunakan alat Generator dan Penguji Daftar Pernyataan.

Mengonfirmasi daftar host yang akan diverifikasi

Saat melakukan pengujian, Anda harus mengonfirmasi daftar host terkait yang harus diverifikasi sistem untuk aplikasi Anda. Buat daftar semua URL yang filter intent terkaitnya menyertakan atribut dan elemen berikut:

  • Atribut android:scheme dengan nilai http atau https
  • Atribut android:host dengan pola URL domain
  • Elemen tindakan android.intent.action.VIEW
  • Elemen kategori android.intent.category.BROWSABLE

Gunakan daftar ini untuk memeriksa apakah file JSON Digital Asset Links telah tersedia di setiap host dan subdomain yang ditentukan.

Mengonfirmasi file Digital Asset Links

Untuk setiap situs, gunakan Digital Asset Links API untuk mengonfirmasi bahwa file JSON Digital Asset Links dihosting dan didefinisikan dengan benar:

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

Sebagai bagian dari proses pengujian, Anda dapat memeriksa setelan sistem saat ini untuk penanganan link. Gunakan perintah berikut untuk mendapatkan daftar kebijakan penanganan link yang ada bagi semua aplikasi di perangkat Anda yang terhubung:

adb shell dumpsys package domain-preferred-apps

Selain itu, perintah berikut juga melakukan hal yang sama:

adb shell dumpsys package d

Catatan: Pastikan Anda menunggu setidaknya 20 detik setelah penginstalan aplikasi agar sistem menyelesaikan proses verifikasi.

Perintah ini menampilkan daftar setiap pengguna atau profil yang ditentukan pada perangkat, diawali oleh header dalam format berikut:

App linkages for user 0:

Setelah header ini, output menggunakan format berikut untuk mencantumkan setelan penanganan link bagi pengguna tersebut:

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

Daftar ini menunjukkan aplikasi mana yang terkait dengan domain untuk pengguna tersebut:

  • Package - Mengidentifikasi aplikasi berdasarkan nama paket, seperti yang dideklarasikan dalam manifesnya.
  • Domains - Menampilkan daftar lengkap host yang link webnya ditangani aplikasi ini, menggunakan spasi kosong sebagai pembatas.
  • Status - Menunjukkan setelan penanganan link saat ini untuk aplikasi ini. Aplikasi yang telah lolos verifikasi, dan manifesnya berisi android:autoVerify="true", akan menunjukkan status always. Angka heksadesimal setelah status ini berkaitan dengan catatan sistem Android atas preferensi penautan aplikasi pengguna. Nilai ini tidak menunjukkan keberhasilan verifikasi.

Catatan: Jika pengguna mengubah setelan link aplikasi untuk suatu aplikasi sebelum verifikasi selesai, Anda mungkin melihat informasi keberhasilan verifikasi yang keliru, meskipun sebenarnya verifikasi gagal. Namun, kegagalan verifikasi ini bukanlah masalah jika pengguna secara eksplisit mengaktifkan aplikasi untuk membuka link yang didukung tanpa bertanya. Hal ini karena preferensi pengguna lebih diutamakan daripada verifikasi program (atau ketiadaan verifikasi ini). Akibatnya, link akan langsung menuju aplikasi Anda, tanpa menampilkan dialog, seakan-akan verifikasi telah berhasil.

Contoh pengujian

Agar verifikasi link aplikasi berhasil, sistem harus dapat memverifikasi aplikasi dengan setiap situs yang Anda tentukan dalam filter intent tertentu, yang memenuhi kriteria untuk link aplikasi. Contoh berikut menunjukkan konfigurasi manifes dengan beberapa link aplikasi yang telah ditentukan:

<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>

Daftar host yang akan coba diverifikasi oleh platform dari manifes di atas adalah:

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

Daftar host yang tidak akan dicoba diverifikasi oleh platform dari manifes di atas adalah:

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

Untuk mempelajari lebih lanjut daftar pernyataan, lihat Membuat Daftar Pernyataan.

Memperbaiki error penerapan umum

Jika Anda tidak dapat memverifikasi Link Aplikasi Android, periksa error umum berikut. Bagian ini menggunakan example.com sebagai nama domain placeholder; saat melakukan pemeriksaan ini, ganti example.com dengan nama domain server Anda yang sebenarnya.

Penyiapan filter intent salah
Periksa apakah Anda menyertakan URL yang tidak dimiliki aplikasi Anda di elemen <intent-filter>.
Konfigurasi server salah

Periksa konfigurasi JSON server Anda, dan pastikan nilai SHA sudah benar.

Selain itu, pastikan example.com. (dengan titik di akhir) menayangkan konten yang sama dengan example.com.

Pengalihan sisi server

Sistem tidak memverifikasi semua Link Aplikasi Android untuk aplikasi Anda jika Anda menyiapkan pengalihan seperti berikut:

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

Perilaku ini melindungi keamanan aplikasi Anda.

Keandalan server

Periksa apakah server Anda dapat terhubung ke aplikasi klien.

Link yang tidak dapat diverifikasi

Untuk tujuan pengujian, Anda mungkin sengaja menambahkan link yang tidak dapat diverifikasi. Perlu diingat bahwa pada Android 11 dan yang lebih rendah, link ini menyebabkan sistem tidak memverifikasi semua Link Aplikasi Android untuk aplikasi Anda.

Tanda tangan di assetlinks.json salah

Pastikan tanda tangan Anda sudah benar dan cocok dengan tanda tangan yang digunakan untuk menandatangani aplikasi. Kesalahan yang umum terjadi meliputi:

  • Menandatangani aplikasi dengan sertifikat debug dan hanya memiliki tanda tangan rilis di assetlinks.json.
  • Memiliki tanda tangan huruf kecil di assetlinks.json. Tanda tangan harus menggunakan huruf besar.
  • Jika menggunakan Penandatanganan Aplikasi Play, pastikan Anda menggunakan tanda tangan yang digunakan Google untuk menandatangani setiap rilis. Anda dapat memverifikasi detail ini, termasuk cuplikan JSON lengkap, dengan mengikuti petunjuk tentang mendeklarasikan pengaitan situs.