Mevcut · v1

Web siteniz ile uygulamanız arasındaki köprü.

Genel bir arka uç hizmeti olmadan sayfa başlıklarını, gezinmeyi, rozetleri, uygulama yaşam döngüsünü, paylaşımı, bildirimleri ve diğer yerel davranışları koordine etmek için küçük, sürümlü bir JavaScript SDK'sı.

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

if (context.available) {
  await SiteToApp.page.setTitle('Your cart');
  await SiteToApp.navigation.setBadge('cart', 3);
}
Anahtar, belirteç veya genel REST uç noktası yok
Amaç

Uygulamaya duyarlı anlar sunan tek web sitesi.

SDK isteğe bağlı aşamalı bir geliştirmedir. Sayfalarınız hâlâ içeriğe, yönlendirmeye, hesaplara, alışveriş sepetlerine ve iş kurallarına sahiptir. Yerel kabuk, uygulama kromuna ve cihaz entegrasyonlarına sahiptir. SDK, ikisi arasında küçük, doğrulanmış mesajları iletir.

SiteTo.App genel REST hizmeti söz konusu değildir. Web sitelerinin SiteTo.App anahtarına ihtiyacı yoktur ve SDK hiçbir zaman mağaza kimlik bilgilerini, müşteri sırlarını veya ayrıcalıklı hesap belirteçlerini içermemelidir.

Bağlamsal sayfa başlıkları

Bir ödeme, hesap veya makale sayfasının, tarayıcı başlığını doğru tutarken yerel başlığı güncellemesine izin verin.

Canlı navigasyon rozetleri

Bilinen bir değeri hemen iletin veya aynı kaynak URL'den bir sepeti, gelen kutusunu veya rezervasyon sayısını okuyun.

Rotaya duyarlı navigasyon

Etkin yerel gezinme öğesini geleneksel sayfalar ve tek sayfalı uygulama yollarıyla uyumlu tutun.

Yaşam döngüsü etkinlikleri

Uygulama devam ettirildiğinde, yeniden bağlandığında veya bir bildirimden ya da derin bağlantıdan açıldığında eski web sitesi durumunu yenileyin.

Yerel eylemler

Desteklendiğinde sistem paylaşım sayfasını, izin istemlerini, ayarları ve ince dokunsal geri bildirimi kullanın.

Güvenli tarayıcı davranışı

Her özelliğin belgelenmiş bir tarayıcı yedeklemesi veya işlem yapılmaması vardır, bu nedenle tek bir web sitesi kod tabanı her yerde çalışmaya devam eder.

Kullanılabilirlik ve kurulum

Açıkça sürümlendirilmiş tek bir komut dosyası.

CDN betiğini sıradan bir web sitesine ekleyin veya npm paketini birlikte verilen bir uygulamaya yükleyin. Her ikisi de aynı davranışı ve protokol sürümünü ortaya çıkarır.

CDN komut dosyasıv1
<script
  src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
  defer
></script>
ES modülüv1
import { SiteToApp } from '@sitetoapp/web-sdk';

Ana sürümler URL'de ve paket sözleşmesinde bulunur. Kırılmaz eklemeler içinde gönderilebilir v1; yeniden adlandırılan yöntemler, değişen veriler veya farklı geri dönüş davranışları v2.

Hazırlık ve bağlam

Kullanıcı aracılarını değil, yetenekleri tespit edin.

SiteToApp.ready() yerel kabuk ile el sıkışmaya başlar ve AppContext. Aynı zamanda normal bir tarayıcıda da çözülmesi gerekir, böylece uygulama kodu, mevcut olmayan bir köprüyü beklerken asla askıda kalmaz.

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');
Bağlam alanıDeğerSebep
mevcutbooleanYerel kabuğun geçerli bir el sıkışmayı tamamlayıp tamamlamadığı.
platformuios | android | ağEtkin çalışma zamanı; hiçbir zaman kullanıcı aracısından çıkarılmamıştır.
appVersiondize | hükümsüzMevcut olduğunda, yüklü yerel uygulama sürümü.
sdkVersionsicimYüklenen web sitesi SDK sürümü.
protocolVersionsayı | hükümsüzKöprü sözleşmesi uygulama ile müzakere edildi.
yeteneklersicim[]Navigasyon.badge veya paylaşım gibi desteklenen komutlar.
colorSchemeışık | karanlıkGeçerli yerel görünüm.
safeAreaüst, sağ, alt, solÖzel tam ekran düzenler için CSS piksellerindeki ekler.
Özellik kodu kontrol edilmelidir context.capabilities Destek, yüklü uygulama sürümüne göre değiştiğinde. Platform kontrolleri son çaredir.
Sayfa başlıkları ve durumu

Yerel başlığı bağlamda tutun.

Müşteriler ürünler, makaleler, hesap bölümleri veya ödeme işlemleri arasında dolaşırken sayfa, uygulama başlığını değiştirebilir. Varsayılan olarak, setTitle hem yerel başlığı günceller hem de document.title bu nedenle tarayıcı geçmişi de yararlı olmaya devam ediyor.

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)

Kabuk yükleme göstergesine bir web sitesi geçişi bağlayın. Bir sayfanın onu sonsuza kadar çalışır halde bırakamaması için uygulamanın yine de otomatik bir zaman aşımı uygulaması gerekir.

page.setPullToRefresh(boolean)

Hareketin sayfa davranışıyla çakıştığı çizim yüzeyleri, haritalar veya etkileşimler için yenilemek için çekmeyi devre dışı bırakın.

Gezinme rozetleri

Şimdi önemli olan sayıyı gösterin.

Gezinme öğeleri, SiteTo.App oluşturucusunda yapılandırılmış kararlı kimlikleri kullanır; örneğin cart, inbox, veya bookings. Etiketler değişebilir ancak bu kimlikler web sitesi ile uygulama arasındaki sözleşme olarak kalır.

Bilinen bir değer ayarlayın

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');

Bir URL'den güncelleme

İzleyici, verileri ayrı bir SiteTo.App hizmetinden değil, web sitesi bağlamında getirir. Göreceli, aynı kökenli URL'ler önerilir çünkü normal site çerezlerini ve güvenlik kurallarını olduğu gibi korurlar.

Shopify tarzı sepet örneğiv1
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();
SeçenekVarsayılanDavranış
URLgerekliJSON veya düz metin döndüren HTTPS veya göreli URL.
jsonPathhiçbiricart.item_count gibi nokta yolu. JSON'un kendisi rozet değeri olmadığında gereklidir.
aralıkengelliMinimum 15 saniye olmak üzere milisaniye cinsinden yoklama aralığı.
refreshOnhazır, devam ettirHazır, devam ettir, odaklan ve urlchange'in herhangi bir kombinasyonu.
kimlik bilgileriaynı kökenliTarayıcının Kimlik bilgilerini al modunu kullanır. Çapraz kaynak istekleri hala CORS gerektiriyor.
zaman aşımı5000Milisaniye cinsinden maksimum getirme süresi.
hideWhenZerodoğruEşlenen sonuç 0, boş veya yanlış olduğunda rozeti gizleyin.
bayatkaleBir hatadan sonra son geçerli değeri koruyun; alternatif açıktır.
  • 1'den 99'a kadar sayısal değerler görüntülenir; daha büyük değerler yerel olanı kullanır 99+ treatment.
  • Metin değerleri kırpılır, arındırılır ve dört görünür karakterle sınırlandırılır.
  • Uygulama arka plandayken oylama duraklatılır ve anında yenilemeyle devam eder.
  • Çakışan istekler iptal edilir; en yeni geçerli yanıt kazanır.
  • HTTP, ayrıştırma ve eşleme hataları ortaya çıkıyor sdk:error sayfayı bozmadan.
Yerel eylemler

Yerini aldığı yerde cihaz davranışını kullanın.

Yerel eylemler, web sitesini kullanmak için bir gereklilik haline gelmemeli, mevcut bir web akışını iyileştirmelidir. İzin istemleri net bir kullanıcı eylemini takip etmeli ve öncelikle sayfada bunların değerini açıklamalıdır.

Paylaşım, bildirimler ve dokunsal özelliklerv1
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');

Yararlı bir yedekle paylaşın

Uygulamadaki yerel paylaşım sayfasını kullanın, navigator.share mümkün olduğunda, bir kullanıcı işleminden sonra panoya geri dönüş.

İzin durumunu basit tutun

Geri dönmek default, granted, denied, veya unsupported. Ham push jetonunu asla sayfa koduna maruz bırakmayın.

Dış bağlantıları kasıtlı olarak açın

Dahili olarak onaylanmış URL'ler uygulamada kalır. Uygulama yapılandırmasında aksi belirtilmediği sürece harici HTTPS bağlantıları sistem tarayıcısında açılır.

Hız limitli fiziksel geri bildirim

Desteklenmediğinde dokunsallar göz ardı edilir ve bir sayfanın tekrarlanan rahatsız edici geri bildirimler üretmesini önlemek için yerel olarak kısıtlanır.

Uygulama etkinlikleri

Web sitesinin uygulama yaşam döngüsüne yanıt vermesine izin verin.

Olaylar, şema ve kaynak doğrulamasının ardından yerel kabuktan SDK'ya akar. İşleyiciler genel, minimum miktarda veri alır ve bileşen tabanlı sitelerin bunları temizleyebilmesi için bir abonelikten çıkma işlevi döndürür.

Etkinlik abonelikleriv1
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

Uygulama ön plana döndü. Zamana duyarlı sayfa verilerini ve izlenen rozetleri yenileyin.

app:pause

Uygulama arka plana taşındı. Halihazırda tarayıcı tarafından gerçekleştirilmeyen pahalı işleri duraklatın.

navigation:reselect

Kullanıcı o anda etkin olan yerel gezinme öğesine tekrar dokundu. Genellikle bir beslemeyi en üste kaydırır.

route:open

Kabuk, sayfa yönlendiricisinin tam yeniden yükleme olmadan işlemesi gereken güvenilir bir derin bağlantı aldı.

notification:opened

Kullanıcı bir anlık bildirim açtı. Yük, onaylanmış bir uygulama içi URL'yi ve isteğe bağlı genel meta verileri içerir.

network:change

Bağlantı çevrimiçi ve çevrimdışı arasında değişti. Tarayıcı, gerçek getirme başarısı için gerçeğin kaynağı olmaya devam ediyor.

appearance:change

Doğal açık veya koyu görünüm değişti. Yük, yeni renk şemasını içerir.

sdk:error

Bir izleyici, köprü komutu veya mesaj doğrulaması başarısız oldu. Hassas günlük kaydı değil, teşhis amaçlıdır.

Tarayıcı yedekleri

Web sitesi bir web sitesi olarak kalmalıdır.

Uygulamanın içinde olmamak bir istisna değil normal bir durumdur. SDK, konsol gürültüsünden kaçınmalı ve yerel karşılığı olmadığında öngörülebilir sonuçlar vermelidir.

ÖzellikNormal tarayıcı davranışı
hazırZaman aşımından sonra Available: false ve platform: web ile çözümlenir.
page.setTitleBelge etkinleştirildiğinde document.title'ı günceller; yerel dağıtım raporları yanlış.
Rozetler ve öğe durumuVarsayılan olarak getirmeyin veya oluşturmayın. İade teslim edildi: atmadan yanlış.
navigation.openHedefe göre konum.atama, konum.değiştir veya window.open'i kullanır.
navigation.backTarayıcı geçmişi mevcut olduğunda History.back'i kullanır.
paylaşmakBir kullanıcı hareketinden sonra navigator.share'ı ve ardından panoyu kullanır.
bildirimlerDesteklenmeyen döndürür; tarayıcı bildirim sisteminin yerini almaz.
dokunsal bilgiTeslim edilen güvenli işlem dışı: yanlış.
Komutlar aşağıdaki gibi küçük bir sonuca çözümlenmelidir: { delivered: false, reason: 'not-in-app' }. Geçersiz argümanlar ve yerel reddetmeler yazılı olarak kullanılıyor SiteToAppError codes.
v1 yüzeyi

Tam yöntem referansı.

SiteToApp.ready(options?)

El sıkışmayı bekleyin, ardından mevcut AppContext'e çözümleyin. Her zaman çözülür; normal bir tarayıcı mevcut değerini döndürür: false.

SiteToApp.getContext()

En son üzerinde anlaşmaya varılan platformu, sürümleri, güvenli alan değerlerini, renk şemasını ve yetenek listesini döndürün.

SiteToApp.isAvailable()

Doğrulanmış bir yerel köprünün şu anda bağlı olup olmadığını eşzamanlı olarak raporlayın.

SiteToApp.page.setTitle(title, options?)

document.title'ı, yerel başlığı veya her ikisini birden güncelleyin. Boş başlıklar reddedilir.

SiteToApp.page.setLoading(loading)

Bir sayfa geçişi veya uzun süren bir eylem için kabuk yükleme göstergesini gösterin veya gizleyin.

SiteToApp.page.setPullToRefresh(enabled)

Hareketin uygun olduğu ekranlar için yerel yenilemek için çekmeyi etkinleştirin veya devre dışı bırakın.

SiteToApp.navigation.setBadge(itemId, value)

Yapılandırılmış bir gezinme öğesi rozeti ayarlayın. Sıfır, null ve false bunu temizler.

SiteToApp.navigation.watchBadge(itemId, options)

Yaşam döngüsü tetikleyicilerinde veya kontrollü bir aralıkta bir rozet değeri getirin ve eşleyin. Yenileme ve durdurma kontrollerini döndürür.

SiteToApp.navigation.setActive(itemId)

Web sitesinde gezinmeden yapılandırılmış bir yerel gezinme öğesini seçin.

SiteToApp.navigation.syncWithLocation(rules)

Tarayıcı geçmişini gözlemleyin ve etkin öğeyi URL eşleşme kurallarına uygun tutun. Abonelikten çıkma işlevini döndürür.

SiteToApp.navigation.setItem(itemId, state)

Mevcut yapılandırılmış bir öğenin etiketini, görünürlüğünü veya etkin durumunu güncelleyin.

SiteToApp.navigation.open(url, options?)

Geçerli web görünümünde onaylanmış bir dahili URL'yi veya sistem tarayıcısında harici bir HTTPS URL'sini açın.

SiteToApp.navigation.back()

Yerel rota mevcut olmadığında, kabuktan tarayıcı geçmişine geçerek geri dönmesini isteyin.

SiteToApp.share(data)

Web'deki navigator.share ve pano yedeklerini içeren yerel paylaşım sayfasını açın.

SiteToApp.notifications.requestPermission()

Bir kullanıcı hareketinden sonra bildirim izni isteyin ve ortaya çıkan durumu geri gönderin.

SiteToApp.notifications.openSettings()

İzin daha önce reddedildiğinde bu uygulamanın işletim sistemi ayarlarını açın.

SiteToApp.haptics.impact(style)

Hafif, orta veya ağır darbe geri bildirimi isteyin. Desteklenmediğinde bu işlem yapılmaz.

SiteToApp.on(event, handler)

Doğrulanmış bir uygulama etkinliğine abone olun ve abonelikten çıkma işlevi alın.

SiteToApp.once(event, handler)

Bir sonraki eşleşen etkinliğe abone olun ve ardından işleyiciyi otomatik olarak kaldırın.

Yazılan hatalar: INVALID_ARGUMENT, UNSUPPORTED, NOT_ALLOWED, TIMEOUT, FETCH_FAILED, PROTOCOL_MISMATCH, Ve NATIVE_ERROR.

Köprü protokolü

Küçük, onaylanmış bir mesaj zarfı.

JavaScript katmanı platform aktarım ayrıntılarını normalleştirir. Uygulamada mesajlar, React Native WebView aktarımı üzerinden serileştirilmiş JSON olarak seyahat eder. window.ReactNativeWebView.postMessage. Zarf bu aktarımdan bağımsızdır.

Web sitesinden uygulamaya

Komut zarfıv1
{
  "channel": "sitetoapp",
  "protocolVersion": 1,
  "id": "sta_01J8ZQ6JY1",
  "type": "navigation.badge.set",
  "payload": {
    "itemId": "cart",
    "value": 3
  },
  "timestamp": 1789584000000
}

Uygulama onayı

Yanıt zarfıv1
{
  "channel": "sitetoapp",
  "protocolVersion": 1,
  "type": "response",
  "replyTo": "sta_01J8ZQ6JY1",
  "ok": true,
  "payload": null
}

Web sitesine uygulama

Doğrulanmış yerel etkinlikv1
// 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 şununla başlar: bridge.hello; uygulama, desteklenen protokol sürümleri ve yetenekleriyle yanıt verir.
  • Her komut benzersiz bir kimlik alır. Onaylanması gereken komutlar, bu kimliğe atıfta bulunan bir yanıt alır.
  • Varsayılan onay zaman aşımı iki saniyedir. Zaman aşımı sona erdikten sonra geç yanıtlar dikkate alınmaz.
  • İletiler yalnızca JSON'dur, 64 KB ile sınırlıdır ve her iki tarafta tam olarak bir kez ayrıştırılır.
  • Tekrarlanan unvan ve rozet değişiklikleri iptal edilir; en son geçerli değer kazanır.
  • __receive yalnızca uygulamaya yöneliktir, mümkün olduğunda numaralandırılamaz ve şema dışındaki iletileri reddeder.
Güvenlik kuralları

Köprü tasarımı gereği dardır.

Web Görünümü köprüsü, web içeriği içinde yerel yetki oluşturur; böylece uygulama kabuğu, sayfa size ait olsa bile her sayfa iletisini güvenilmeyen giriş olarak değerlendirir. Şu kuralları uygular:

1

Köprü yalnızca uygulamanız için yapılandırılmış tam HTTPS kaynaklarında ve URL modellerinde etkinleştirilir ve başka bir yere gitmeden önce devre dışı bırakılır.

2

İleti türleri izin verilenler listesine alınır ve her veri, üzerinde anlaşılan protokol şemasına göre doğrulanır. Bilinmeyen alanlar göz ardı edilir ve bilinmeyen komutlar reddedilir.

3

Mağaza kimlik bilgileri, push belirteçleri, cihaz tanımlayıcıları, kimlik doğrulama çerezleri ve yerel dosya sistemi yolları hiçbir zaman sayfa JavaScript'ine maruz kalmaz.

4

Yalnızca göreli URL'ler veya doğrulanmış HTTPS hedefleri kabul edilir. javascript:, data:, file:, aim: ve özel şemalar, belirli bir komut tarafından izin verilenler listesine eklenmediği sürece engellenir.

5

İzin istemleri, yedeklerin paylaşılması, ayar bağlantıları ve rahatsız edici yerel eylemler, yakın zamanda bir kullanıcı hareketi gerektirir.

6

Komutlar hız sınırlıdır, mesajların sınırı 64 KB'tır ve dizeler ile yerel çağrıların uzunluk sınırları ve zaman aşımları vardır.

7

Yükler üretim günlüklerinden çıkarılır. Tanılama hataları, kodları ve mesaj kimliklerini içerir; asla müşteri içeriği veya sırlarını içermez.

8

İzlenen rozet istekleri tarayıcı Getirme kurallarına uygundur. Aynı kaynak kimlik bilgileri varsayılandır; çapraz köken URL'leri CORS'u geçmelidir.

Canlı yayına çıkmadan önce

Entegrasyonunuzu test edin.

SDK yalnızca uygulamanızın içindeki davranışı değiştirir. Uygulama kullanıcılarının yerel deneyimi yaşaması ve tarayıcı ziyaretçilerinin web sitesinin tam olarak eskisi gibi çalışmaya devam etmesi için her iki yolu da kontrol edin.

  • SDK'yı çağıran sayfaları normal bir mobil tarayıcıda açın ve context.available yanlıştır.
  • Yavaş ağlar, çevrimdışı durum ve arka planda uzun süre kaldıktan sonra devam etme dahil olmak üzere iOS ve Android'deki uygulamada test edin.
  • Yeniden yüklemelerden ve istemci tarafı rota değişikliklerinden sonra unvanları, rozetleri ve aktif navigasyonu kontrol edin.
  • Yerel eylemler için kullanıcı hareketini, izin reddedilen ve desteklenmeyen yolları test edin.
  • Siteniz İçerik Güvenliği Politikası kullanıyorsa SDK komut dosyası kaynağına izin verin.

Bu sözleşmenin gözden kaçırdığı bir kullanım durumu var mı?

Web sitesi akışını, ihtiyacınız olan uygulama davranışını ve normal bir tarayıcıda ne olması gerektiğini paylaşın. Bu bizim değerlendirmemiz için yeterli.

Bir kullanım örneği gönderin