Menambahkan filter Intent untuk Link Aplikasi

Link Aplikasi adalah deep link yang menggunakan skema HTTP atau HTTPS dan diverifikasi oleh Android sebagai terkait dengan situs Anda. Untuk mendaftar guna menangani Link Aplikasi, ikuti langkah-langkah berikut:

  1. Tambahkan satu atau beberapa filter Intent ke manifes aplikasi Anda yang menentukan domain atau URL situs Anda.
  2. Tambahkan autoVerify="true"attribute ke elemen filter Intent. Hal ini memberi sinyal kepada sistem bahwa sistem harus mencoba memverifikasi skema dan domain host terhadap konfigurasi assetlinks.json situs Anda.
  3. Mendeklarasikan asosiasi situs.

Berikut adalah contoh deklarasi Link Aplikasi dengan skema dan host serta autoVerify="true":

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <!-- 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 link that uses the "http" scheme, your
             app should be able to delegate that traffic to "https". -->
        <!-- Do not include other schemes, as this will prevent verification. -->
        <data android:scheme="http" />
        <data android:scheme="https" />

        <!-- Include one or more domains that should be verified. -->
        <data android:host="www.example.com" />
        <data android:host="*.example.com" />
    </intent-filter>
</activity>

Poin penting tentang kode

  • AutoVerify: Atribut android:autoVerify="true" diperlukan untuk Link Aplikasi. Atribut ini memberi sinyal kepada sistem bahwa sistem harus mencoba memverifikasi pengaitan antara aplikasi Anda dan skema serta domain yang ditentukan dalam tag <data>. Sebaiknya tambahkan autoVerify="true" ke setiap filter Intent yang ingin Anda verifikasi.
  • Elemen data: Setiap filter Intent Link Aplikasi harus menyertakan satu atau beberapa elemen <data> yang menentukan skema dan format host yang cocok dengan domain situs yang dapat diverifikasi.
  • Skema: Filter intent harus menyertakan elemen <data> untuk skema http dan https.
  • Host: Anda dapat menambahkan elemen <data> secara opsional untuk mencocokkan satu atau beberapa host. Gunakan karakter pengganti (*) untuk mencocokkan beberapa subdomain (seperti *.example.com). Sistem akan mencoba memverifikasi setiap host terhadap file assetlinks.json di situs Anda. Perhatikan bahwa perutean tingkat jalur harus ditangani oleh file assetlinks.json (lihat bagian praktik terbaik di bawah).

  • Beberapa Host: Jika Anda mendeklarasikan beberapa domain host, sistem (di Android 12+) akan mencoba memverifikasi setiap domain. Jika ada host yang diverifikasi, aplikasi akan menjadi pengendali default untuk link dari host yang diverifikasi tersebut. Di Android 11 dan yang lebih lama, verifikasi gagal jika satu host tidak dapat diverifikasi.

  • Beberapa filter Intent: Anda harus membuat filter terpisah jika ingin mendeklarasikan URL unik (seperti kombinasi skema dan host tertentu), karena beberapa elemen <data> dalam filter intent yang sama akan digabungkan untuk memperhitungkan semua variasi atribut gabungannya.

Pertimbangan untuk aturan filter manifes

Jika Anda menyiapkan filter untuk digunakan dengan Link Aplikasi Dinamis di Android 15 dan yang lebih tinggi, penting untuk diingat bahwa aturan dinamis yang dideklarasikan dalam file assetlinks.json sisi server tidak dapat memperluas cakupan aturan URL yang Anda deklarasikan secara statis dalam manifes aplikasi.

Oleh karena itu, sebaiknya gunakan pendekatan ini:

  • Dalam manifes aplikasi, tetapkan cakupan seluas mungkin, seperti dengan mendeklarasikan skema dan domain saja
  • Mengandalkan aturan assetlinks.json sisi server untuk penyempurnaan lebih lanjut, seperti perutean tingkat jalur.

Dengan konfigurasi ideal ini, Anda dapat menambahkan jalur App Link baru secara dinamis dalam file assetlinks.json sesuai kebutuhan, dengan mengetahui bahwa jalur tersebut akan sesuai dengan cakupan luas yang telah Anda tetapkan dalam manifes aplikasi.

Mendukung Link 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 kembali ke perilaku standarnya untuk menyelesaikan intent, seperti yang dijelaskan dalam Membuat Deep Link ke Konten Aplikasi. Namun, aplikasi masih dapat diverifikasi sebagai pengendali default untuk pola URL mana pun yang ditentukan dalam filter intent aplikasi lainnya.

Misalnya, aplikasi dengan filter intent berikut akan lolos verifikasi hanya untuk https://www.example.com jika file assetlinks.json ditemukan di https://www.example.com/.well-known/assetlinks.json, tetapi tidak 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>

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 hostname dengan karakter pengganti (seperti *.example.com), Anda harus memublikasikan file assetlinks.json di root hostname (example.com). Misalnya, aplikasi dengan filter intent berikut akan lolos verifikasi untuk setiap subnama 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 terkait 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.

Fitur Deep Link Dinamis, termasuk aturan pencocokan lanjutan di assetlinks.json dan penggunaan <uri-relative-filter-group>, hanya didukung sepenuhnya di Android 15 (level API 35) dan yang lebih tinggi.

Di Android 14 (level API 34) dan yang lebih rendah, sistem hanya mempertimbangkan scheme dan host yang dideklarasikan dalam elemen <data> manifes Anda untuk verifikasi Link Aplikasi. Aturan, pengecualian, dan pembaruan dinamis khusus jalur dari assetlinks.json tidak diterapkan.

Artinya, jika manifes Anda hanya menentukan scheme dan host, aplikasi Anda mungkin secara tidak terduga mengambil semua jalur untuk domain terverifikasi di Android 14 dan yang lebih lama, terlepas dari aturan khusus jalur yang ditentukan dalam assetlinks.json untuk Android 15 dan yang lebih tinggi.

Untuk mencegah aplikasi Anda menangani semua link untuk domain di Android 14 dan yang lebih rendah saat Anda ingin menggunakan Link Aplikasi Dinamis untuk jalur yang lebih spesifik di Android 15 dan yang lebih tinggi, sertakan jalur yang tidak cocok dalam filter intent manifes Anda. Tambahkan elemen <data> dengan atribut android:path yang kemungkinan tidak akan pernah menjadi jalur yang valid untuk link Anda. Hal ini memastikan bahwa filter intent tidak cocok dengan semua jalur pada versi yang lebih rendah.

Contoh:

<activity
    android:name=".MainActivity"
    android:exported="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" />

        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="www.example.com" />

        <!-- Add a non-matching path for backward compatibility -->
        <data android:path="/no_match_for_older_android_versions" />

        <uri-relative-filter-group android:allow="true">
          <data android:pathPattern="/.*"/>
        </uri-relative-filter-group>
    </intent-filter>
</activity>

Dengan menambahkan <data android:path="/no_match_for_older_android_versions" />, Anda memastikan bahwa di Android 14 dan yang lebih rendah, filter intent ini tidak cocok dengan link masuk mana pun, sekaligus tetap memungkinkan domain diverifikasi untuk digunakan dengan Link Aplikasi Dinamis di Android 15 dan yang lebih tinggi berdasarkan aturan pencocokan lanjutan dalam aturan assetlinks.json Anda.

Jika sudah memiliki Link Aplikasi dengan aturan jalur tertentu (seperti android:pathPrefix) dalam manifes dan ingin mulai menggunakan Link Aplikasi Dinamis di Android 15 dan yang lebih tinggi, Anda dapat menambahkan elemen <uri-relative-filter-group> langsung ke filter intent yang ada dengan aman.

Karena Android 14 dan yang lebih rendah mengabaikan elemen <uri-relative-filter-group>, Link Aplikasi yang ada akan terus berfungsi persis seperti sekarang di perangkat yang menjalankan Android versi lebih rendah.

Namun, Anda harus mempertimbangkan dengan cermat cara Android 15 dan yang lebih tinggi mengevaluasi konfigurasi "campuran":

  • Pemfilteran dua lapis: Di Android 15 dan yang lebih tinggi, sistem mengevaluasi filter intent sebagai gabungan. URL lulus pemeriksaan manifes jika memenuhi tag <data> statis lama atau aturan luas di <uri-relative-filter-group>. Setelah URL lulus pemeriksaan manifes awal ini, sistem akan menerapkan aturan dinamis yang ditentukan dalam file assetlinks.json Anda sebagai lapisan kedua pemfilteran terperinci. Artinya, aturan JSON sisi server pada akhirnya menentukan URL yang cocok yang benar-benar membuka aplikasi.

Contoh konfigurasi hybrid:

<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="www.example.com" />

    <!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
         also use this. -->
    <data android:pathPrefix="/store" />

    <!--
      Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
      evaluate this as a union between all paths and the configuration
      specified in the assetlinks.json file. Make sure to apply further
      refinements in the assetlinks.json file to prevent all URL paths from
      opening in the app.
    -->
    <uri-relative-filter-group android:allow="true">
        <data android:pathPrefix="/" />
    </uri-relative-filter-group>
</intent-filter>