The Android Developer Challenge is back! Submit your idea before December 2.

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 mewajibkan 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 memastikan bahwa Anda memiliki URL, 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 meng-hosting 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 Pengindeksan Aplikasi 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 disambiguitas, yang memungkinkan pengguna memilih salah satu dari beberapa aplikasi (termasuk milik Anda) yang dapat menangani URL yang ditentukan. Misalnya, gambar 1 menunjukkan dialog disambiguitas setelah pengguna mengklik link peta, yang menanyakan apakah akan membuka link di Maps atau Chrome.

    Gambar 1. Dialog disambiguitas

    Link Aplikasi Android adalah deep link yang didasarkan pada URL situs yang telah dipastikan sebagai bagian dari situs Anda. Jadi, mengklik salah satunya akan langsung membuka aplikasi Anda, jika sudah diinstal, dan dialog disambuitas 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 khusus Membutuhkan http atau https
    Tindakan intent Tindakan apa pun Membutuhkan android.intent.action.VIEW
    Kategori intent Kategori apa pun Membutuhkan android.intent.category.BROWSABLE dan android.intent.category.DEFAULT
    Verifikasi link Tidak ada Membutuhkan file Digital Asset Links yang tersedia di situs Anda dengan HTTPS
    Pengalaman pengguna Dapat menampilkan dialog disambiguitas 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

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

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

    1. Sistem memeriksa semua filter intent yang termasuk:
      • 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 menanyakan situs terkait 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 di-host pada semua domain web masing-masing. Jika ada verifikasi yang gagal, aplikasi tidak akan diverifikasi sebagai pengendali default untuk salah satu pola URL yang ditentukan dalam filter intent aplikasi tersebut. Sistem kemudian disetel default 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>
        

    Perlu diingat 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 spesifik 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 ini 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). Contohnya, 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" android:host="*.example.com" />
            </intent-filter>
          </activity>
        </application>
        

    Mendeklarasikan pengaitan situs web

    File JSON Digital Asset Links harus dipublikasikan di situs web 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 dinyatakan 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 web dengan beberapa aplikasi

    Situs web dapat mendeklarasikan pengaitan dengan beberapa aplikasi dalam file assetlinks.json yang sama. Daftar file berikut menunjukkan contoh file pernyataan yang mendeklarasikan pengaitan 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 web sekaligus dengan satu aplikasi

    Beberapa situs dapat mendeklarasikan pengaitan dengan aplikasi yang sama pada file assetlinks.json masing-masing. Daftar file berikut menunjukkan contoh cara mendeklarasikan pengaitan example.com dan example.net dengan app1. Daftar pertama menunjukkan pengaitan 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 pengaitan example.net dengan app1. Yang berbeda hanya lokasi tempat file-file ini di-host (.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 koneksi HTTPS, terlepas apakah filter intent aplikasi Anda menyatakan 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. 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 fitur 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
    • elemen kategori 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 API Digital Asset Links untuk mengonfirmasi bahwa file JSON Digital Asset Links telah di-host 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 di-host 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, sebagaimana 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 manifes yang 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 disebabkan karena preferensi pengguna lebih diutamakan daripada verifikasi program (atau ketiadaan verifikasi ini). Akibatnya, link akan langsung menuju aplikasi Anda, tanpa menampilkan dialog, seperti verifikasi telah berhasil.

    Contoh pengujian

    Agar verifikasi link aplikasi berhasil, sistem harus dapat memverifikasi aplikasi dengan semua situs web 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 selengkapnya tentang daftar pernyataan, lihat Membuat Daftar Pernyataan.