Verifikasi Link Aplikasi

Jika android:autoVerify="true" ada di setidaknya salah satu filter intent aplikasi Anda, menginstal aplikasi Anda di perangkat yang menjalankan Android 6.0 (API level 23) atau yang lebih tinggi akan menyebabkan sistem otomatis memverifikasi host yang terkait dengan URL di filter intent aplikasi Anda. Di Android 12 dan yang lebih baru, 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 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 nama host unik yang ditemukan pada filter intent di atas, Android akan mengkueri situs yang sesuai untuk file Digital Asset Links di https:///.well-known/assetlinks.json.

Setelah mengonfirmasi daftar situs yang akan dikaitkan dengan aplikasi Anda, dan Anda telah mengonfirmasi bahwa file JSON yang dihosting sudah valid, instal aplikasi di perangkat Anda. Tunggu setidaknya 20 detik agar 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 tinggi, 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 radio yang disebut Buka link yang didukung, seperti yang ditunjukkan pada gambar 1.

Saat pengguna mengaktifkan Buka link yang didukung, sekumpulan kotak centang akan muncul di bagian yang disebut Link untuk dibuka di aplikasi ini. Dari sini, pengguna dapat memilih domain yang ingin dihubungkan dengan aplikasi Anda. Mereka 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.