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.
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.
<script
src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
defer
></script>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.
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.
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ğer | Sebep |
|---|---|---|
| mevcut | boolean | Yerel kabuğun geçerli bir el sıkışmayı tamamlayıp tamamlamadığı. |
| platformu | ios | android | ağ | Etkin çalışma zamanı; hiçbir zaman kullanıcı aracısından çıkarılmamıştır. |
| appVersion | dize | hükümsüz | Mevcut olduğunda, yüklü yerel uygulama sürümü. |
| sdkVersion | sicim | Yüklenen web sitesi SDK sürümü. |
| protocolVersion | sayı | hükümsüz | Köprü sözleşmesi uygulama ile müzakere edildi. |
| yetenekler | sicim[] | Navigasyon.badge veya paylaşım gibi desteklenen komutlar. |
| colorScheme | ışık | karanlık | Geçerli yerel görünüm. |
| safeArea | üst, sağ, alt, sol | Özel tam ekran düzenler için CSS piksellerindeki ekler. |
context.capabilities Destek, yüklü uygulama sürümüne göre değiştiğinde. Platform kontrolleri son çaredir.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.
// 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.
Ş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
// 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.
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çenek | Varsayılan | Davranış |
|---|---|---|
| URL | gerekli | JSON veya düz metin döndüren HTTPS veya göreli URL. |
| jsonPath | hiçbiri | cart.item_count gibi nokta yolu. JSON'un kendisi rozet değeri olmadığında gereklidir. |
| aralık | engelli | Minimum 15 saniye olmak üzere milisaniye cinsinden yoklama aralığı. |
| refreshOn | hazır, devam ettir | Hazır, devam ettir, odaklan ve urlchange'in herhangi bir kombinasyonu. |
| kimlik bilgileri | aynı kökenli | Tarayıcının Kimlik bilgilerini al modunu kullanır. Çapraz kaynak istekleri hala CORS gerektiriyor. |
| zaman aşımı | 5000 | Milisaniye cinsinden maksimum getirme süresi. |
| hideWhenZero | doğru | Eşlenen sonuç 0, boş veya yanlış olduğunda rozeti gizleyin. |
| bayat | kale | Bir 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:errorsayfayı bozmadan.
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.
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.
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.
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:resumeUygulama ön plana döndü. Zamana duyarlı sayfa verilerini ve izlenen rozetleri yenileyin.
app:pauseUygulama arka plana taşındı. Halihazırda tarayıcı tarafından gerçekleştirilmeyen pahalı işleri duraklatın.
navigation:reselectKullanıcı o anda etkin olan yerel gezinme öğesine tekrar dokundu. Genellikle bir beslemeyi en üste kaydırır.
route:openKabuk, sayfa yönlendiricisinin tam yeniden yükleme olmadan işlemesi gereken güvenilir bir derin bağlantı aldı.
notification:openedKullanı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:changeBağ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:changeDoğal açık veya koyu görünüm değişti. Yük, yeni renk şemasını içerir.
sdk:errorBir 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.
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.
| Özellik | Normal tarayıcı davranışı |
|---|---|
| hazır | Zaman aşımından sonra Available: false ve platform: web ile çözümlenir. |
| page.setTitle | Belge etkinleştirildiğinde document.title'ı günceller; yerel dağıtım raporları yanlış. |
| Rozetler ve öğe durumu | Varsayılan olarak getirmeyin veya oluşturmayın. İade teslim edildi: atmadan yanlış. |
| navigation.open | Hedefe göre konum.atama, konum.değiştir veya window.open'i kullanır. |
| navigation.back | Tarayıcı geçmişi mevcut olduğunda History.back'i kullanır. |
| paylaşmak | Bir kullanıcı hareketinden sonra navigator.share'ı ve ardından panoyu kullanır. |
| bildirimler | Desteklenmeyen döndürür; tarayıcı bildirim sisteminin yerini almaz. |
| dokunsal bilgi | Teslim edilen güvenli işlem dışı: yanlış. |
{ delivered: false, reason: 'not-in-app' }. Geçersiz argümanlar ve yerel reddetmeler yazılı olarak kullanılıyor SiteToAppError codes.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üçü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
{
"channel": "sitetoapp",
"protocolVersion": 1,
"id": "sta_01J8ZQ6JY1",
"type": "navigation.badge.set",
"payload": {
"itemId": "cart",
"value": 3
},
"timestamp": 1789584000000
}Uygulama onayı
{
"channel": "sitetoapp",
"protocolVersion": 1,
"type": "response",
"replyTo": "sta_01J8ZQ6JY1",
"ok": true,
"payload": null
}Web sitesine uygulama
// 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.
__receiveyalnızca uygulamaya yöneliktir, mümkün olduğunda numaralandırılamaz ve şema dışındaki iletileri reddeder.
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:
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.
İ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.
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.
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.
İzin istemleri, yedeklerin paylaşılması, ayar bağlantıları ve rahatsız edici yerel eylemler, yakın zamanda bir kullanıcı hareketi gerektirir.
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.
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.
İ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.
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.availableyanlış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.