Memverifikasi Link Aplikasi Android

Link Aplikasi Android adalah jenis deep link khusus yang memungkinkan URL situs Anda segera membuka konten terkait di aplikasi Android (tanpa mengharuskan pengguna memilih aplikasi).

Untuk menambahkan Link Aplikasi Android ke aplikasi Anda, tentukan filter intent yang membuka konten aplikasi Anda menggunakan URL HTTP (seperti yang dijelaskan dalam Membuat Deep Link ke Konten Aplikasi), dan pastikan bahwa Anda memiliki aplikasi dan URL situs (seperti yang dijelaskan dalam panduan ini). Jika sistem berhasil memverifikasi bahwa URL adalah milik Anda, sistem akan secara otomatis mengarahkan intent URL tersebut ke aplikasi Anda.

Untuk memverifikasi kepemilikan aplikasi dan situs Anda, diperlukan langkah-langkah berikut:

  • Minta verifikasi link aplikasi otomatis di manifes Anda. Hal ini akan memberi sinyal ke sistem Android bahwa sistem harus memastikan bahwa aplikasi Anda adalah milik domain URL yang digunakan dalam filter intent.
  • Deklarasikan hubungan antara situs web 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:

  • Mendukung URL dan App Indexing di Android Studio
  • Membuat Daftar Pernyataan
  • Perbedaan antara deep link dan link aplikasi

    Deep link adalah filter intent yang memungkinkan pengguna untuk secara langsung memasukkan aktivitas tertentu dalam aplikasi Android Anda. Mengklik salah satu link ini dapat membuka dialog disambiguasi, yang memungkinkan pengguna memilih salah satu dari beberapa aplikasi (termasuk milik Anda) yang dapat menangani URL yang ditentukan. Misalnya, gambar 1 menunjukkan dialog disambiguasi setelah pengguna mengklik link peta, yang menanyakan apakah akan membuka link di Maps atau Chrome.

    Gambar 1. Dialog disambiguasi

    Link Aplikasi Android adalah deep link yang didasarkan pada URL situs yang telah diverifikasi sebagai bagian dari situs Anda. Jadi, mengklik salah satunya akan langsung membuka aplikasi Anda jika sudah diinstal, dan dialog disambiguasi tidak akan muncul. Meskipun begitu, pengguna tetap dapat mengubah preferensi untuk menangani link ini.

    Tabel berikut menjelaskan perbedaan yang lebih spesifik.

    Deep linkLink aplikasi
    Skema URL intent http, https, atau skema kustom Memerlukan http atau https
    Tindakan intent Tindakan apa pun Memerlukan android.intent.action.VIEW
    Kategori intent Kategori apa pun Memerlukan android.intent.category.BROWSABLE dan android.intent.category.DEFAULT
    Verifikasi link Tak Ada Membutuhkan file Digital Asset Links yang tersedia di situs Anda dengan HTTPS
    Pengalaman pengguna Dapat menampilkan dialog disambiguasi bagi pengguna untuk memilih aplikasi mana yang dipakai untuk membuka link Tidak ada dialog; aplikasi akan terbuka untuk menangani link situs Anda
    Kompatibilitas Semua versi Android Android 6.0 dan lebih tinggi

    Meminta verifikasi link aplikasi

    Untuk mengaktifkan verifikasi penanganan link untuk aplikasi Anda, tetapkan android:autoVerify="true" pada salah satu filter intent URL web di manifes aplikasi Anda yang menyertakan tindakan intent android.intent.action.VIEW dan kategori intent android.intent.category.BROWSABLE, seperti yang ditampilkan dalam cuplikan kode manifes berikut:

    <activity ...>
    
      <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" android:host="www.example.com" />
          <data android:scheme="https" />
      </intent-filter>
    
    </activity>
    

    Jika android:autoVerify="true" ada di salah satu filter intent Anda, menginstal aplikasi di perangkat dengan Android 6.0 dan versi yang lebih tinggi menyebabkan sistem mencoba memverifikasi semua host yang terkait dengan URL pada salah satu filter intent aplikasi Anda. Verifikasi mencakup hal-hal berikut:

    1. Sistem memeriksa semua filter intent yang meliputi:
      • 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.

    Hanya jika sistem menemukan file Digital Asset Links yang cocok untuk semua host di manifes, barulah sistem menetapkan aplikasi Anda sebagai pengendali default untuk pola URL yang ditentukan.

    Mendukung penautan aplikasi untuk beberapa host

    Sistem harus dapat memverifikasi setiap host yang ditetapkan dalam elemen data filter intent URL aplikasi dengan file Digital Asset Links yang dihosting pada semua domain web masing-masing. Jika ada verifikasi yang gagal, aplikasi tidak akan diverifikasi sebagai pengendali default untuk pola URL mana pun yang ditentukan dalam filter intent aplikasi tersebut. Sistem kemudian secara default kembali ke perilaku standar untuk menyelesaikan intent, seperti yang dijelaskan dalam Membuat Deep Link ke Konten Aplikasi.

    Contohnya, aplikasi dengan filter intent berikut akan gagal verifikasi jika file assetlinks.json tidak ditemukan di https://www.example.com/.well-known/assetlinks.json dan 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" android:host="www.example.com" />
        <data android:scheme="https" />
      </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" android:host="www.example.net" />
      </intent-filter>
    </activity>
    
    </application>
    

    Ingat bahwa semua elemen <data> dalam filter intent yang sama akan digabungkan untuk memperhitungkan semua variasi atribut gabungannya. Misalnya, filter intent pertama di atas menyertakan elemen <data> yang hanya menyatakan 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" android:host="www.example.com" />
        <data android:scheme="https" android:host="mobile.example.com" />
      </intent-filter>
    </activity>
    </application>
    

    Selain itu, 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 meneruskan 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" android:host="*.example.com" />
      </intent-filter>
    </activity>
    </application>
    

    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 versi aplikasi Anda yang berbeda, seperti build produksi dan debug.

    Contoh file assetlinks.json berikut memberikan hak untuk 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) dan dapat diakses oleh bot (robots.txt Anda harus mengizinkan crawling /.well-known/assetlinks.json.
    • 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.

    Menguji link aplikasi

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

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

    Mengonfirmasi daftar host yang akan diverifikasi

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

    • Atribut android:scheme dengan nilai http atau https
    • Atribut android:host dengan pola URL domain
    • Element 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 telah 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
    

    Menguji intent URL

    Setelah mengonfirmasi daftar situs yang akan dikaitkan dengan aplikasi Anda, dan 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 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"
    

    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 menurut nama paket, seperti yang dideklarasikan dalam manifesnya.
    • Domains - Menampilkan daftar lengkap host yang link webnya ditangani aplikasi ini, menggunakan spasi kosong sebagai pembatasnya.
    • 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 semua situs yang Anda tetapkan dalam filter intent aplikasi, dan 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" android:host="www.example.com" />
              <data android:scheme="https" 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" 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" 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" 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" 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 coba 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 daftar pernyataan lebih lanjut, lihat Membuat Daftar Pernyataan.