Eine Website mit App-Erlebnissen.
Das SDK ist eine optionale progressive Erweiterung. Ihre Seiten besitzen weiterhin Inhalte, Routing, Konten, Warenkörbe und Geschäftsregeln. Die native Shell verfügt über App-Chrome- und Geräteintegrationen. Das SDK leitet kleine, validierte Nachrichten zwischen den beiden weiter.
Es ist kein öffentlicher SiteTo.App-REST-Dienst beteiligt. Websites benötigen keinen SiteTo.App-Schlüssel und das SDK darf niemals Anmeldeinformationen für den Shop, Kundengeheimnisse oder Token für privilegierte Konten enthalten.
Kontextbezogene Seitentitel
Lassen Sie eine Checkout-, Konto- oder Artikelseite den nativen Header aktualisieren, während der Browsertitel korrekt bleibt.
Live-Navigationsabzeichen
Senden Sie sofort einen bekannten Wert oder lesen Sie einen Warenkorb, einen Posteingang oder eine Buchungsanzahl von einer URL mit demselben Ursprung.
Routenbezogene Navigation
Halten Sie das aktive native Navigationselement an herkömmlichen Seiten und einseitigen Anwendungsrouten ausgerichtet.
Lebenszyklusereignisse
Aktualisieren Sie den veralteten Website-Status, wenn die App fortgesetzt wird, eine erneute Verbindung herstellt oder über eine Benachrichtigung oder einen Deep Link geöffnet wird.
Native Aktionen
Verwenden Sie das Systemfreigabeblatt, Berechtigungsaufforderungen, Einstellungen und subtiles haptisches Feedback, sofern dies unterstützt wird.
Sicheres Browserverhalten
Jede Funktion verfügt über einen dokumentierten Browser-Fallback oder No-Op, sodass eine Website-Codebasis weiterhin überall funktioniert.
Ein Skript, explizit versioniert.
Fügen Sie das CDN-Skript zu einer normalen Website hinzu oder installieren Sie das npm-Paket in einer gebündelten Anwendung. Beide weisen das gleiche Verhalten und die gleiche Protokollversion auf.
<script
src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
defer
></script>import { SiteToApp } from '@sitetoapp/web-sdk';Hauptversionen sind im URL- und Paketvertrag enthalten. Geschützte Ergänzungen können innerhalb von 24 Stunden versandt werden v1; Umbenennte Methoden, geänderte Payloads oder ein anderes Fallback-Verhalten erfordern v2.
Erkennen Sie Fähigkeiten, nicht Benutzeragenten.
SiteToApp.ready() beginnt einen Handshake mit der nativen Shell und wird zu einem AppContext. Es muss auch in einem normalen Browser aufgelöst werden, damit der Anwendungscode niemals hängen bleibt, während er auf eine Brücke wartet, die nicht vorhanden ist.
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');| Kontextfeld | Wert | Grund |
|---|---|---|
| verfügbar | Boolescher Wert | Ob eine native Shell einen gültigen Handshake abgeschlossen hat. |
| Plattform | ios | Android | Web | Die aktive Laufzeit; niemals vom Benutzeragenten abgeleitet. |
| appVersion | Zeichenfolge | null | Die installierte native App-Version, sofern verfügbar. |
| sdkVersion | Zeichenfolge | Die geladene Website-SDK-Version. |
| protocolVersion | Nummer | null | Der Überbrückungsvertrag wird mit der App ausgehandelt. |
| Fähigkeiten | string[] | Unterstützte Befehle wie navigation.badge oder share. |
| colorScheme | Licht | dunkel | Das aktuelle native Erscheinungsbild. |
| safeArea | oben, rechts, unten, links | Einfügungen in CSS-Pixeln für benutzerdefinierte Vollbild-Layouts. |
context.capabilities wenn die Unterstützung je nach installierter App-Version variiert. Plattformkontrollen sind das letzte Mittel.Behalten Sie den Kontext des nativen Headers bei.
Eine Seite kann den App-Header ändern, wenn Kunden Produkte, Artikel, Kontoabschnitte oder den Checkout durchlaufen. Standardmäßig ist setTitle Aktualisiert sowohl den nativen Header als auch document.title Daher bleibt auch der Browserverlauf nützlich.
// 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)Verbinden Sie einen Website-Übergang mit der Shell-Ladeanzeige. Die App muss dennoch ein automatisches Timeout erzwingen, damit eine Seite nicht für immer ausgeführt werden kann.
page.setPullToRefresh(boolean)Deaktivieren Sie Pull-to-Refresh für Zeichenoberflächen, Karten oder Interaktionen, bei denen die Geste mit dem Seitenverhalten in Konflikt steht.
Zeigen Sie die Anzahl an, auf die es jetzt ankommt.
Navigationselemente verwenden stabile IDs, die im SiteTo.App-Builder konfiguriert sind, z cart, inbox, oder bookings. Bezeichnungen können sich ändern, diese IDs bleiben jedoch der Vertrag zwischen der Website und der App.
Legen Sie einen bekannten Wert fest
// 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');Update von einer URL
Ein Watcher ruft im Website-Kontext ab – nicht von einem separaten SiteTo.App-Dienst. Relative URLs mit demselben Ursprung werden empfohlen, da sie die normalen Website-Cookies und Sicherheitsregeln beibehalten.
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();| Option | Standard | Verhalten |
|---|---|---|
| URL | erforderlich | HTTPS oder relative URL, die JSON oder Klartext zurückgibt. |
| jsonPath | keiner | Punktpfad wie „cart.item_count“. Erforderlich, wenn JSON nicht selbst der Badge-Wert ist. |
| Intervall | deaktiviert | Abfrageintervall in Millisekunden, mindestens 15 Sekunden. |
| refreshOn | Fertig, weitermachen | Jede Kombination aus „Bereit“, „Lebenslauf“, „Fokus“ und „URL ändern“. |
| Anmeldeinformationen | gleichen Ursprungs | Verwendet den Modus „Anmeldeinformationen abrufen“ des Browsers. Für Cross-Origin-Anfragen ist weiterhin CORS erforderlich. |
| Time-out | 5000 | Maximale Abrufzeit in Millisekunden. |
| hideWhenZero | WAHR | Blenden Sie das Abzeichen aus, wenn das zugeordnete Ergebnis 0, null oder falsch ist. |
| abgestanden | halten | Nach einem Fehler den letzten gültigen Wert beibehalten; klar ist die Alternative. |
- Numerische Werte werden von 1–99 angezeigt; Größere Werte verwenden den nativen Wert 99+ treatment.
- Textwerte werden gekürzt, bereinigt und auf vier sichtbare Zeichen beschränkt.
- Die Abfrage wird angehalten, während die App im Hintergrund läuft, und mit einer sofortigen Aktualisierung fortgesetzt.
- Überlappende Anfragen werden storniert; Die neueste gültige Antwort gewinnt.
- Es werden HTTP-, Parsing- und Mapping-Fehler ausgegeben
sdk:errorohne die Seite zu zerstören.
Nutzen Sie das Geräteverhalten dort, wo es seinen Platz verdient.
Native Aktionen sollen einen bestehenden Webfluss verbessern und nicht zur Voraussetzung für die Nutzung der Website werden. Berechtigungsaufforderungen müssen einer klaren Benutzeraktion folgen und ihren Wert zuerst auf der Seite erläutern.
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');Teilen Sie es mit einem nützlichen Fallback
Verwenden Sie das native Freigabeblatt in der App. navigator.share sofern verfügbar, dann ein Fallback in die Zwischenablage nach einer Benutzeraktion.
Halten Sie den Berechtigungsstatus einfach
Zurückkehren default, granted, denied, oder unsupported. Stellen Sie niemals ein rohes Push-Token für den Seitencode bereit.
Öffnen Sie externe Links bewusst
Intern genehmigte URLs bleiben in der App. Externe HTTPS-Links werden im Systembrowser geöffnet, sofern in der App-Konfiguration nichts anderes angegeben ist.
Physisches Feedback zur Geschwindigkeitsbegrenzung
Haptiken werden ignoriert, wenn sie nicht unterstützt werden, und nativ gedrosselt, um zu verhindern, dass eine Seite wiederholt störende Rückmeldungen erzeugt.
Lassen Sie die Website auf den App-Lebenszyklus reagieren.
Ereignisse fließen nach der Schema- und Ursprungsvalidierung von der nativen Shell in das SDK. Handler empfangen öffentliche, minimale Nutzlasten und geben eine Abmeldefunktion zurück, damit komponentenbasierte Websites diese bereinigen können.
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:resumeDie App kehrte in den Vordergrund zurück. Aktualisieren Sie zeitkritische Seitendaten und beobachtete Abzeichen.
app:pauseDie App wurde in den Hintergrund verschoben. Unterbrechen Sie teure Arbeiten, die nicht bereits vom Browser erledigt werden.
navigation:reselectDer Benutzer hat erneut auf das derzeit aktive native Navigationselement getippt. Üblicherweise wird ein Feed nach oben gescrollt.
route:openDie Shell hat einen vertrauenswürdigen Deep-Link erhalten, den der Seitenrouter ohne vollständiges Neuladen verarbeiten sollte.
notification:openedDer Benutzer hat eine Push-Benachrichtigung geöffnet. Die Nutzlast enthält eine genehmigte In-App-URL und optionale öffentliche Metadaten.
network:changeDie Konnektivität hat sich zwischen Online und Offline geändert. Der Browser bleibt die Quelle der Wahrheit für den tatsächlichen Abruferfolg.
appearance:changeDas ursprüngliche helle oder dunkle Erscheinungsbild veränderte sich. Payload enthält das neue Farbschema.
sdk:errorEin Watcher, ein Bridge-Befehl oder eine Nachrichtenvalidierung ist fehlgeschlagen. Für Diagnosezwecke gedacht, nicht für sensible Protokollierung.
Die Website muss eine Website bleiben.
Nicht in der App zu sein ist ein normaler Zustand und keine Ausnahme. Das SDK muss Konsolenrauschen vermeiden und vorhersehbare Ergebnisse liefern, wenn sein natives Gegenstück fehlt.
| Besonderheit | Normales Browserverhalten |
|---|---|
| bereit | Wird mit „available: false“ und „platform: web“ nach dem Timeout aufgelöst. |
| page.setTitle | Aktualisiert document.title, wenn das Dokument aktiviert ist; Native Zustellungsberichte falsch. |
| Abzeichen und Artikelstatus | Standardmäßig nicht abrufen oder rendern. Rückgabe geliefert: falsch ohne zu werfen. |
| navigation.open | Verwendet je nach Ziel location.assign, location.replace oder window.open. |
| navigation.back | Verwendet „history.back“, wenn der Browserverlauf verfügbar ist. |
| Aktie | Verwendet navigator.share und dann die Zwischenablage nach einer Benutzergeste. |
| Benachrichtigungen | Rückgabe nicht unterstützt; Es ersetzt nicht das Browser-Benachrichtigungssystem. |
| Haptik | Sicheres No-Op mit „geliefert: falsch“. |
{ delivered: false, reason: 'not-in-app' }. Ungültige Argumente und native Ablehnungen werden typisiert verwendet SiteToAppError codes.Vollständige Methodenreferenz.
SiteToApp.ready(options?)Warten Sie auf den Handshake und lösen Sie dann den aktuellen AppContext auf. Es löst sich immer auf; Ein normaler Browser gibt „available: false“ zurück.
SiteToApp.getContext()Gibt die zuletzt ausgehandelte Plattform, Versionen, Werte des sicheren Bereichs, Farbschema und Funktionsliste zurück.
SiteToApp.isAvailable()Melden Sie synchron, ob derzeit eine validierte native Bridge verbunden ist.
SiteToApp.page.setTitle(title, options?)Aktualisieren Sie document.title, den nativen Header oder beides. Leere Titel werden abgelehnt.
SiteToApp.page.setLoading(loading)Blenden Sie den Shell-Ladeindikator für einen Seitenübergang oder eine Aktion mit langer Laufzeit ein oder aus.
SiteToApp.page.setPullToRefresh(enabled)Aktivieren oder deaktivieren Sie natives Pull-to-Refresh für Bildschirme, auf denen die Geste geeignet ist.
SiteToApp.navigation.setBadge(itemId, value)Legen Sie ein konfiguriertes Navigationselement-Badge fest. Null, null und falsch löschen es.
SiteToApp.navigation.watchBadge(itemId, options)Rufen Sie einen Badge-Wert ab und ordnen Sie ihn Lebenszyklusauslösern oder einem kontrollierten Intervall zu. Gibt Aktualisierungs- und Stoppsteuerelemente zurück.
SiteToApp.navigation.setActive(itemId)Wählen Sie ein konfiguriertes natives Navigationselement aus, ohne auf der Website zu navigieren.
SiteToApp.navigation.syncWithLocation(rules)Beobachten Sie den Browserverlauf und achten Sie darauf, dass das aktive Element den URL-Übereinstimmungsregeln entspricht. Gibt eine Abmeldefunktion zurück.
SiteToApp.navigation.setItem(itemId, state)Aktualisieren Sie die Bezeichnung, Sichtbarkeit oder den aktivierten Status eines vorhandenen konfigurierten Elements.
SiteToApp.navigation.open(url, options?)Öffnen Sie eine genehmigte interne URL in der aktuellen Webansicht oder eine externe HTTPS-URL im Systembrowser.
SiteToApp.navigation.back()Fordern Sie die Shell auf, zurückzugehen und zum Browserverlauf zu wechseln, wenn keine native Route verfügbar ist.
SiteToApp.share(data)Öffnen Sie das native Freigabeblatt mit navigator.share und Zwischenablage-Fallbacks im Web.
SiteToApp.notifications.requestPermission()Fordern Sie nach einer Benutzergeste die Benachrichtigungsberechtigung an und geben Sie den resultierenden Status zurück.
SiteToApp.notifications.openSettings()Öffnen Sie die Betriebssystemeinstellungen für diese App, wenn die Berechtigung zuvor verweigert wurde.
SiteToApp.haptics.impact(style)Fordern Sie Feedback zu leichten, mittleren oder starken Auswirkungen an. Dies ist ein No-Op, wenn es nicht unterstützt wird.
SiteToApp.on(event, handler)Abonnieren Sie ein validiertes App-Event und erhalten Sie eine Abmeldefunktion.
SiteToApp.once(event, handler)Abonnieren Sie das nächste passende Ereignis und entfernen Sie dann den Handler automatisch.
Tippfehler: INVALID_ARGUMENT, UNSUPPORTED, NOT_ALLOWED, TIMEOUT, FETCH_FAILED, PROTOCOL_MISMATCH, Und NATIVE_ERROR.
Ein kleiner, quittierter Nachrichtenumschlag.
Die JavaScript-Schicht normalisiert Plattformtransportdetails. In der App werden Nachrichten über den React Native WebView-Transport als serialisiertes JSON übertragen window.ReactNativeWebView.postMessage. Der Umschlag ist unabhängig von diesem Transport.
Von der Website zur App
{
"channel": "sitetoapp",
"protocolVersion": 1,
"id": "sta_01J8ZQ6JY1",
"type": "navigation.badge.set",
"payload": {
"itemId": "cart",
"value": 3
},
"timestamp": 1789584000000
}App-Bestätigung
{
"channel": "sitetoapp",
"protocolVersion": 1,
"type": "response",
"replyTo": "sta_01J8ZQ6JY1",
"ok": true,
"payload": null
}App zur Website
// 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() },
});- Das SDK beginnt mit
bridge.hello; Die App antwortet mit unterstützten Protokollversionen und -funktionen. - Jeder Befehl erhält eine eindeutige ID. Befehle, die eine Bestätigung benötigen, erhalten eine Antwort mit Verweis auf diese ID.
- Das Standard-Bestätigungs-Timeout beträgt zwei Sekunden. Verspätete Antworten werden nach Ablauf einer Zeitüberschreitung ignoriert.
- Nachrichten sind nur JSON, auf 64 KB begrenzt und werden auf jeder Seite genau einmal analysiert.
- Wiederholte Titel- und Abzeichenänderungen werden entprellt; der letzte gültige Wert gewinnt.
__receiveist nur für die Implementierung gedacht, nach Möglichkeit nicht aufzählbar und lehnt Nachrichten außerhalb des Schemas ab.
Die Brücke ist konstruktionsbedingt schmal.
Eine WebView-Bridge schafft native Autorität innerhalb von Webinhalten, sodass die App-Shell jede Seitennachricht als nicht vertrauenswürdige Eingabe behandelt – selbst wenn die Seite Ihnen gehört. Es erzwingt die folgenden Regeln:
Die Bridge wird nur für die genauen HTTPS-Ursprünge und URL-Muster aktiviert, die für Ihre App konfiguriert sind, und deaktiviert, bevor Sie woanders hin navigieren.
Nachrichtentypen werden auf die Zulassungsliste gesetzt und jede Nutzlast wird anhand des ausgehandelten Protokollschemas validiert. Unbekannte Felder werden ignoriert und unbekannte Befehle abgelehnt.
Store-Anmeldeinformationen, Push-Tokens, Gerätekennungen, Authentifizierungscookies und native Dateisystempfade werden niemals Seiten-JavaScript ausgesetzt.
Es werden nur relative URLs oder validierte HTTPS-Ziele akzeptiert. javascript:, data:, file:, intent: und benutzerdefinierte Schemata werden blockiert, sofern sie nicht durch einen bestimmten Befehl auf die Zulassungsliste gesetzt werden.
Berechtigungsaufforderungen, Freigabe-Fallbacks, Einstellungslinks und störende native Aktionen erfordern eine aktuelle Benutzergeste.
Befehle sind ratenbegrenzt, Nachrichten sind auf 64 KB begrenzt und für Zeichenfolgen und native Aufrufe gelten Längenbeschränkungen und Zeitüberschreitungen.
Nutzdaten werden aus Produktionsprotokollen entfernt. Diagnosefehler enthalten Codes und Nachrichten-IDs, niemals Kundeninhalte oder Geheimnisse.
Beobachtete Badge-Anfragen folgen den Browser-Abrufregeln. Anmeldeinformationen gleichen Ursprungs sind die Standardeinstellung. Cross-Origin-URLs müssen CORS bestehen.
Testen Sie Ihre Integration.
Das SDK ändert nur das Verhalten innerhalb Ihrer App. Überprüfen Sie beide Pfade, damit App-Benutzer das native Erlebnis erhalten und Browser-Besucher dafür sorgen, dass die Website genauso funktioniert wie zuvor.
- Öffnen Sie die Seiten, die das SDK aufrufen, in einem normalen mobilen Browser und vergewissern Sie sich, dass nichts kaputt geht
context.availableist falsch. - Testen Sie in der App auf iOS und Android, einschließlich langsamer Netzwerke, Offline-Status und Wiederaufnahme nach langer Zeit im Hintergrund.
- Überprüfen Sie Titel, Abzeichen und aktive Navigation nach Neuladungen und clientseitigen Routenänderungen.
- Testen Sie für native Aktionen die Pfade „Benutzergeste“, „Berechtigung verweigert“ und „Nicht unterstützt“.
- Wenn Ihre Site eine Inhaltssicherheitsrichtlinie verwendet, lassen Sie den SDK-Skriptursprung zu.
Gibt es einen Anwendungsfall, der in diesem Vertrag nicht berücksichtigt wird?
Teilen Sie den Website-Ablauf, das von Ihnen benötigte App-Verhalten und was in einem normalen Browser passieren soll. Das reicht uns zur Bewertung.