Bersiaplah untuk menggunakan 12L, yaitu update fitur baru untuk perangkat layar besar yang akan hadir awal tahun depan. Coba sekarang juga!

Resolusi intent web

Mulai Android 12, intent web generik berubah menjadi aktivitas dalam aplikasi Anda hanya jika aplikasi disetujui untuk domain tertentu yang terdapat dalam intent web tersebut. Jika aplikasi Anda untuk domain tidak disetujui, intent web akan ditetapkan ke aplikasi browser default pengguna.

Aplikasi dapat memperoleh persetujuan ini dengan melakukan salah satu hal berikut:

Jika aplikasi Anda memanggil intent web, pertimbangkan untuk menambahkan perintah atau dialog yang meminta pengguna untuk mengonfirmasi tindakan.

Atribut intent web

Intent web adalah intent yang berisi karakteristik berikut:

Filter intent web harus menyertakan kategori yang dapat dilihat

Mulai Android 12, filter intent web juga harus mendeklarasikan kategori CATEGORY_BROWSABLE agar intent web tertentu dapat mengatasi aktivitas di aplikasi Anda.

Link Aplikasi Android, tersedia di Android 8.0 (API level 26) dan lebih tinggi, gunakan API Link Aset Digital untuk menghubungkan aplikasi tertentu dengan domain web. Penghubungan ini memungkinkan sistem memercayai bahwa aplikasi telah disetujui oleh situs untuk secara otomatis membuka link untuk domain tersebut.

Mulai Android 12, Anda dapat menjalankan verifikasi domain secara manual untuk mengevaluasi cara sistem menyelesaikan Android App Links Anda.

Pada aplikasi yang menargetkan Android 12, sistem membuat beberapa perubahan pada cara Android App Link diverifikasi. Perubahan ini meningkatkan keandalan pengalaman penautan aplikasi dan memberikan kontrol lebih kepada developer aplikasi dan pengguna akhir. Anda juga dapat memanggil verifikasi domain secara manual untuk menguji keandalan deklarasi Anda.

Jika Anda menargetkan Android 12 dan mengandalkan verifikasi Link Aplikasi Android untuk membuka link web di aplikasi, update deklarasi Link Aplikasi Android untuk mendukung proses verifikasi yang diubah.

Memperbarui deklarasi Link Aplikasi Android

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 hanya jika domain tersebut berada dalam elemen <intent-filter> yang diformat secara khusus. Elemen <intent-filter> harus berisi tindakan, kategori, dan skema yang ditampilkan dalam cuplikan 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.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />

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

Memanggil verifikasi domain secara 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, 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)
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

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

Mengalihkan persetujuan domain secara manual

Verifikasi domain dan pilihan pengguna dapat diubah menggunakan perintah shell yang memungkinkan developer menyetel status yang sesuai untuk melakukan proses debug, menjalankan pengujian, atau untuk kasus seperti tidak ada sambungan internet.

Penjelasan lengkap tentang perintah ini tersedia dari output adb shell pm.

Perhatikan bahwa semua prioritas persetujuan tunggal dan pembatasan persetujuan tunggal yang sama berlaku meskipun disetujui melalui perintah shell, sehingga beberapa kasus khusus seperti memasang dua varian aplikasi secara bersamaan memerlukan penanganan khusus untuk membuka link web tertentu di aplikasi yang dimaksud.

Beberapa aplikasi terverifikasi

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.

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.