Tersedia · v1

Jembatan antara situs web Anda dan aplikasinya.

SDK JavaScript kecil dan berversi untuk mengoordinasikan judul halaman, navigasi, lencana, siklus hidup aplikasi, berbagi, pemberitahuan, dan perilaku asli lainnya—tanpa layanan backend publik.

app-bridge.js
const context = await SiteToApp.ready();

if (context.available) {
  await SiteToApp.page.setTitle('Your cart');
  await SiteToApp.navigation.setBadge('cart', 3);
}
Tidak ada kunci, token, atau titik akhir REST publik
Tujuan

Satu situs web, dengan momen sadar aplikasi.

SDK adalah penyempurnaan progresif opsional. Halaman Anda masih memiliki konten, perutean, akun, keranjang, dan aturan bisnis. Shell asli memiliki aplikasi chrome dan integrasi perangkat. SDK meneruskan pesan kecil yang tervalidasi di antara keduanya.

Tidak ada layanan REST publik SiteTo.App yang terlibat. Situs web tidak memerlukan kunci SiteTo.App, dan SDK tidak boleh berisi kredensial toko, rahasia pelanggan, atau token akun istimewa.

Judul halaman kontekstual

Biarkan halaman checkout, akun, atau artikel memperbarui header asli sambil menjaga judul browser tetap benar.

Lencana navigasi langsung

Segera masukkan nilai yang diketahui atau baca keranjang, kotak masuk, atau jumlah pemesanan dari URL asal yang sama.

Navigasi yang sadar rute

Jaga agar item navigasi asli aktif tetap selaras dengan halaman tradisional dan rute aplikasi satu halaman.

Peristiwa siklus hidup

Menyegarkan status situs web lama saat aplikasi dilanjutkan, dihubungkan kembali, atau dibuka dari notifikasi atau tautan dalam.

Tindakan asli

Gunakan lembar berbagi sistem, perintah izin, pengaturan, dan umpan balik haptik halus jika didukung.

Perilaku browser yang aman

Setiap fitur memiliki fallback browser yang terdokumentasi atau no-op sehingga satu basis kode situs web terus berfungsi di mana saja.

Ketersediaan dan pengaturan

Satu skrip, diversi secara eksplisit.

Tambahkan skrip CDN ke situs web biasa, atau instal paket npm dalam aplikasi yang dibundel. Keduanya memperlihatkan perilaku dan versi protokol yang sama.

skrip CDNv1
<script
  src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
  defer
></script>
modul ESv1
import { SiteToApp } from '@sitetoapp/web-sdk';

Versi utama ada di URL dan kontrak paket. Penambahan non-breaking dapat dikirimkan dalam v1; mengganti nama metode, mengubah payload, atau memerlukan perilaku fallback yang berbeda v2.

Kesiapan dan konteks

Deteksi kemampuan, bukan agen pengguna.

SiteToApp.ready() memulai jabat tangan dengan shell asli dan memutuskan untuk an AppContext. Itu juga harus diselesaikan di browser normal, sehingga kode aplikasi tidak pernah hang saat menunggu jembatan yang tidak ada.

JavaScriptv1
const context = await SiteToApp.ready({ timeout: 1500 });

if (!context.available) {
  // Normal browser: keep using your existing web behavior.
  return;
}

await SiteToApp.page.setTitle('Order details');
await SiteToApp.navigation.setActive('orders');
Bidang konteksNilaiAlasan
tersediabooleanApakah shell asli menyelesaikan jabat tangan yang valid.
platformios | android | webWaktu proses aktif; tidak pernah disimpulkan dari agen pengguna.
appVersiontali | batalVersi aplikasi asli yang diinstal, jika tersedia.
sdkVersionrangkaianVersi SDK situs web yang dimuat.
protocolVersionnomor | batalKontrak jembatan dinegosiasikan dengan aplikasi.
kemampuanrangkaian[]Perintah yang didukung seperti navigasi.badge atau bagikan.
colorSchemecahaya | gelapPenampilan asli saat ini.
safeAreaatas, kanan, bawah, kiriSisipan dalam piksel CSS untuk tata letak layar penuh khusus.
Kode fitur harus diperiksa context.capabilities ketika dukungan bervariasi berdasarkan versi aplikasi yang diinstal. Pemeriksaan platform adalah pilihan terakhir.
Judul halaman dan status

Pertahankan tajuk asli dalam konteks.

Halaman dapat mengubah header aplikasi saat pelanggan menelusuri produk, artikel, bagian akun, atau pembayaran. Secara default, setTitle memperbarui header asli dan document.title jadi riwayat browser juga tetap berguna.

JavaScriptv1
// Update both the document title and the app header.
await SiteToApp.page.setTitle('Your cart');

// Change only the native header.
await SiteToApp.page.setTitle('Checkout', {
  document: false,
  native: true,
});

// Return to the title derived from the page or app configuration.
await SiteToApp.page.resetTitle();
page.setLoading(boolean)

Hubungkan transisi situs web ke indikator pemuatan shell. Aplikasi masih harus menerapkan batas waktu otomatis sehingga halaman tidak dapat membiarkannya berjalan selamanya.

page.setPullToRefresh(boolean)

Nonaktifkan tarik untuk menyegarkan untuk permukaan gambar, peta, atau interaksi yang gerakannya bertentangan dengan perilaku halaman.

Lencana navigasi

Tunjukkan hitungan yang penting sekarang.

Item navigasi menggunakan ID stabil yang dikonfigurasi di pembuat SiteTo.App, seperti cart, inbox, atau bookings. Label dapat berubah, namun ID tersebut tetap merupakan kontrak antara situs web dan aplikasi.

Tetapkan nilai yang diketahui

JavaScriptv1
// Numbers are formatted by the native app: 100 becomes “99+”.
await SiteToApp.navigation.setBadge('cart', 3);

// Zero, null, or false hides the badge.
await SiteToApp.navigation.setBadge('cart', 0);

// Short status labels are also allowed.
await SiteToApp.navigation.setBadge('inbox', 'NEW');

Perbarui dari URL

Pengamat mengambil dalam konteks situs web—bukan dari layanan SiteTo.App terpisah. URL relatif dengan asal yang sama direkomendasikan karena menjaga cookie situs normal dan aturan keamanan tetap utuh.

Contoh keranjang ala Shopifyv1
const cartBadge = SiteToApp.navigation.watchBadge('cart', {
  url: '/cart.js',
  jsonPath: 'item_count',
  interval: 30_000,
  refreshOn: ['ready', 'resume', 'focus', 'urlchange'],
  hideWhenZero: true,
  stale: 'keep',
});

// Refresh after a local add-to-cart action.
await cartBadge.refresh();

// Stop fetching when this page no longer owns the badge.
cartBadge.stop();
PilihanBawaanPerilaku
urldiperlukanHTTPS atau URL relatif yang mengembalikan JSON atau teks biasa.
jsonPathtidak adaJalur titik seperti cart.item_count. Diperlukan ketika JSON itu sendiri bukan merupakan nilai lencana.
selangdengan disabilitasInterval polling dalam milidetik, dengan minimal 15 detik.
refreshOnsiap, lanjutkanKombinasi apa pun dari ready, resume, focus, dan urlchange.
kredensialasal yang samaMenggunakan browser Ambil mode kredensial. Permintaan lintas asal masih memerlukan CORS.
batas waktu5000Waktu pengambilan maksimum dalam milidetik.
hideWhenZeroBENARSembunyikan lencana ketika hasil yang dipetakan adalah 0, nol, atau salah.
basimenyimpanPertahankan nilai valid terakhir setelah kesalahan; jelas adalah alternatifnya.
  • Nilai numerik ditampilkan dari 1–99; nilai yang lebih besar menggunakan yang asli 99+ treatment.
  • Nilai teks dipangkas, dibersihkan, dan dibatasi hingga empat karakter yang terlihat.
  • Jajak pendapat dijeda saat aplikasi berada di latar belakang dan dilanjutkan dengan satu penyegaran langsung.
  • Permintaan yang tumpang tindih dibatalkan; respons valid terbaru menang.
  • Kegagalan HTTP, penguraian, dan pemetaan terjadi sdk:error tanpa merusak halamannya.
Tindakan asli

Gunakan perilaku perangkat yang sesuai dengan tempatnya.

Tindakan asli harus meningkatkan aliran web yang ada, bukan menjadi persyaratan untuk menggunakan situs web. Perintah izin harus mengikuti tindakan pengguna yang jelas dan menjelaskan nilainya di halaman terlebih dahulu.

Berbagi, notifikasi, dan haptikv1
await SiteToApp.share({
  title: 'Spring collection',
  text: 'These just arrived.',
  url: window.location.href,
});

// Must be called from a user click or tap.
const permission = await SiteToApp.notifications.requestPermission();

// Use sparingly for confirmation, not decoration.
await SiteToApp.haptics.impact('light');

Bagikan dengan cadangan yang berguna

Gunakan lembar berbagi asli di aplikasi, navigator.share jika tersedia, maka fallback clipboard setelah tindakan pengguna.

Jaga status izin tetap sederhana

Kembali default, granted, denied, atau unsupported. Jangan pernah memaparkan token push mentah ke kode halaman.

Buka tautan eksternal dengan sengaja

URL internal yang disetujui tetap ada di aplikasi. Tautan HTTPS eksternal terbuka di browser sistem kecuali jika konfigurasi aplikasi menyatakan sebaliknya.

Umpan balik fisik dengan batas kecepatan

Haptics diabaikan ketika tidak didukung dan dibatasi secara asli untuk mencegah halaman menghasilkan umpan balik yang mengganggu secara berulang-ulang.

Acara aplikasi

Biarkan situs web merespons siklus hidup aplikasi.

Peristiwa mengalir dari shell asli ke SDK setelah validasi skema dan asal. Penangan menerima muatan publik dan minimal dan mengembalikan fungsi berhenti berlangganan sehingga situs berbasis komponen dapat membersihkannya.

Langganan acarav1
const unsubscribe = SiteToApp.on('app:resume', () => {
  cartBadge.refresh();
});

SiteToApp.on('navigation:reselect', ({ itemId }) => {
  if (itemId === 'home') window.scrollTo({ top: 0, behavior: 'smooth' });
});

SiteToApp.on('notification:opened', ({ url }) => {
  if (url) window.location.assign(url);
});

// Remove a listener when its owning component unmounts.
unsubscribe();
app:resume

Aplikasi kembali ke latar depan. Segarkan data halaman yang sensitif terhadap waktu dan lencana yang ditonton.

app:pause

Aplikasi dipindahkan ke latar belakang. Jeda pekerjaan mahal yang belum ditangani oleh browser.

navigation:reselect

Pengguna mengetuk lagi item navigasi asli yang sedang aktif. Biasanya menggulirkan feed ke atas.

route:open

Shell menerima tautan dalam tepercaya yang harus ditangani oleh router halaman tanpa memuat ulang sepenuhnya.

notification:opened

Pengguna membuka pemberitahuan push. Payload berisi URL dalam aplikasi yang disetujui dan metadata publik opsional.

network:change

Konektivitas berubah antara online dan offline. Browser tetap menjadi sumber kebenaran keberhasilan pengambilan sebenarnya.

appearance:change

Tampilan asli terang atau gelap berubah. Payload mencakup skema warna baru.

sdk:error

Pengamat, perintah jembatan, atau validasi pesan gagal. Ditujukan untuk diagnostik, bukan logging sensitif.

Penggantian browser

Situs web harus tetap menjadi situs web.

Tidak berada di dalam aplikasi adalah keadaan normal, tidak terkecuali. SDK harus menghindari gangguan konsol dan mengembalikan hasil yang dapat diprediksi ketika versi aslinya tidak ada.

FiturPerilaku peramban normal
siapSelesaikan dengan tersedia: salah dan platform: web setelah batas waktu.
page.setTitleMemperbarui document.title ketika dokumen diaktifkan; laporan pengiriman asli salah.
lencana dan status itemJangan mengambil atau merender secara default. Pengembalian terkirim: salah tanpa melempar.
navigation.openMenggunakan location.assign, location.replace, atau window.open sesuai target.
navigation.backMenggunakan history.back ketika riwayat browser tersedia.
membagikanMenggunakan navigator.share, lalu clipboard setelah isyarat pengguna.
pemberitahuanPengembalian tidak didukung; itu tidak menggantikan sistem notifikasi browser.
haptikNo-op aman dengan terkirim: salah.
Perintah harus menyelesaikan hasil kecil seperti { delivered: false, reason: 'not-in-app' }. Argumen yang tidak valid dan penolakan asli menggunakan tipe yang diketik SiteToAppError codes.
permukaan v1

Referensi metode lengkap.

SiteToApp.ready(options?)

Tunggu jabat tangan, lalu putuskan ke AppContext saat ini. Itu selalu terselesaikan; browser normal kembali tersedia: salah.

SiteToApp.getContext()

Kembalikan platform, versi, nilai area aman, skema warna, dan daftar kemampuan yang terakhir dinegosiasikan.

SiteToApp.isAvailable()

Laporkan secara sinkron apakah jembatan asli yang divalidasi saat ini terhubung.

SiteToApp.page.setTitle(title, options?)

Perbarui document.title, header asli, atau keduanya. Judul kosong ditolak.

SiteToApp.page.setLoading(loading)

Menampilkan atau menyembunyikan indikator pemuatan shell untuk transisi halaman atau tindakan yang berjalan lama.

SiteToApp.page.setPullToRefresh(enabled)

Mengaktifkan atau menonaktifkan tarikan untuk menyegarkan asli untuk layar yang sesuai dengan isyarat.

SiteToApp.navigation.setBadge(itemId, value)

Tetapkan lencana item navigasi yang dikonfigurasi. Nol, nol, dan salah hapus.

SiteToApp.navigation.watchBadge(itemId, options)

Ambil dan petakan nilai lencana pada pemicu siklus hidup atau interval terkontrol. Mengembalikan kontrol penyegaran dan penghentian.

SiteToApp.navigation.setActive(itemId)

Pilih item navigasi asli yang dikonfigurasi tanpa menavigasi situs web.

SiteToApp.navigation.syncWithLocation(rules)

Amati riwayat browser dan jaga agar item aktif tetap selaras dengan aturan pencocokan URL. Mengembalikan fungsi berhenti berlangganan.

SiteToApp.navigation.setItem(itemId, state)

Perbarui label, visibilitas, atau status aktif dari item terkonfigurasi yang sudah ada.

SiteToApp.navigation.open(url, options?)

Buka URL internal yang disetujui di tampilan web saat ini atau URL HTTPS eksternal di browser sistem.

SiteToApp.navigation.back()

Minta shell untuk kembali, menelusuri riwayat browser ketika tidak ada rute asli yang tersedia.

SiteToApp.share(data)

Buka lembar berbagi asli, dengan navigator.share dan fallback clipboard di web.

SiteToApp.notifications.requestPermission()

Minta izin pemberitahuan setelah isyarat pengguna dan kembalikan status yang dihasilkan.

SiteToApp.notifications.openSettings()

Buka pengaturan sistem operasi untuk aplikasi ini ketika izin sebelumnya ditolak.

SiteToApp.haptics.impact(style)

Minta umpan balik dampak ringan, sedang, atau berat. Ini adalah larangan jika tidak didukung.

SiteToApp.on(event, handler)

Berlangganan acara aplikasi yang divalidasi dan terima fungsi berhenti berlangganan.

SiteToApp.once(event, handler)

Berlangganan untuk acara pencocokan berikutnya, lalu hapus pengendali secara otomatis.

Kesalahan yang diketik: INVALID_ARGUMENT, UNSUPPORTED, NOT_ALLOWED, TIMEOUT, FETCH_FAILED, PROTOCOL_MISMATCH, Dan NATIVE_ERROR.

Protokol jembatan

Amplop pesan kecil yang diakui.

Lapisan JavaScript menormalkan detail transportasi platform. Di aplikasi, pesan dikirim melalui transportasi React Native WebView sebagai serial JSON window.ReactNativeWebView.postMessage. Amplop tidak bergantung pada pengangkutan itu.

Situs web ke aplikasi

Amplop perintahv1
{
  "channel": "sitetoapp",
  "protocolVersion": 1,
  "id": "sta_01J8ZQ6JY1",
  "type": "navigation.badge.set",
  "payload": {
    "itemId": "cart",
    "value": 3
  },
  "timestamp": 1789584000000
}

Pengakuan aplikasi

Amplop tanggapanv1
{
  "channel": "sitetoapp",
  "protocolVersion": 1,
  "type": "response",
  "replyTo": "sta_01J8ZQ6JY1",
  "ok": true,
  "payload": null
}

Aplikasi ke situs web

Acara asli yang divalidasiv1
// Native shell → website. Internal SDK method; not public surface.
window.SiteToApp.__receive({
  channel: 'sitetoapp',
  protocolVersion: 1,
  type: 'event',
  event: 'app:resume',
  payload: { occurredAt: Date.now() },
});
  • SDK dimulai dengan bridge.hello; aplikasi merespons dengan versi dan kemampuan protokol yang didukung.
  • Setiap perintah mendapat ID unik. Perintah yang memerlukan konfirmasi menerima respons yang merujuk pada ID tersebut.
  • Batas waktu pengakuan default adalah dua detik. Respons yang terlambat akan diabaikan setelah batas waktu habis.
  • Pesan hanya berupa JSON, dibatasi hingga 64 KB, dan diurai tepat satu kali di setiap sisi.
  • Perubahan judul dan lencana yang berulang akan dibatalkan; nilai valid terbaru menang.
  • __receive hanya untuk implementasi, tidak dapat dihitung jika memungkinkan, dan menolak pesan di luar skema.
Aturan keamanan

Jembatan ini sempit secara desain.

Jembatan WebView menciptakan otoritas asli di dalam konten web, sehingga shell aplikasi memperlakukan setiap pesan halaman sebagai masukan yang tidak tepercaya—bahkan ketika halaman tersebut milik Anda. Ini menegakkan aturan-aturan ini:

1

Jembatan ini diaktifkan hanya pada asal HTTPS dan pola URL yang dikonfigurasi untuk aplikasi Anda, dan dinonaktifkan sebelum menavigasi ke tempat lain.

2

Jenis pesan diizinkan dan setiap payload divalidasi berdasarkan skema protokol yang dinegosiasikan. Bidang yang tidak diketahui diabaikan dan perintah yang tidak diketahui ditolak.

3

Kredensial penyimpanan, token push, pengidentifikasi perangkat, cookie autentikasi, dan jalur sistem file asli tidak pernah diekspos ke halaman JavaScript.

4

Hanya URL relatif atau tujuan HTTPS tervalidasi yang diterima. javascript:, data:, file:, maksud:, dan skema khusus diblokir kecuali perintah tertentu mengizinkannya.

5

Permintaan izin, fallback berbagi, link pengaturan, dan tindakan asli yang mengganggu memerlukan isyarat pengguna terkini.

6

Perintah dibatasi kecepatannya, pesan dibatasi hingga 64 KB, dan string serta panggilan asli memiliki batas panjang dan batas waktu.

7

Muatan disunting dari log produksi. Kesalahan diagnostik berisi kode dan ID pesan, tidak pernah berisi konten atau rahasia pelanggan.

8

Permintaan lencana yang diawasi mengikuti aturan Pengambilan browser. Kredensial asal yang sama adalah defaultnya; URL lintas asal harus melewati CORS.

Sebelum Anda ditayangkan

Uji integrasi Anda.

SDK hanya mengubah perilaku di dalam aplikasi Anda. Periksa kedua jalur sehingga pengguna aplikasi mendapatkan pengalaman asli dan pengunjung browser menjaga situs web tetap berfungsi persis seperti sebelumnya.

  • Buka halaman yang memanggil SDK di browser seluler normal dan konfirmasikan tidak ada kerusakan saat itu context.available adalah salah.
  • Uji dalam aplikasi di iOS dan Android, termasuk jaringan lambat, keadaan offline, dan dilanjutkan kembali setelah sekian lama di latar belakang.
  • Periksa judul, lencana, dan navigasi aktif setelah memuat ulang dan perubahan rute sisi klien.
  • Untuk tindakan asli, uji jalur gestur pengguna, ditolak izin, dan tidak didukung.
  • Jika situs Anda menggunakan Kebijakan Keamanan Konten, izinkan asal skrip SDK.

Apakah ada kasus penggunaan yang terlewatkan oleh kontrak ini?

Bagikan alur situs web, perilaku aplikasi yang Anda perlukan, dan apa yang seharusnya terjadi di browser normal. Itu saja sudah cukup bagi kita untuk menilainya.

Kirim kasus penggunaan