Verfügbar · v1

Die Brücke zwischen Ihrer Website und ihrer App.

Ein kleines, versioniertes JavaScript-SDK zum Koordinieren von Seitentiteln, Navigation, Abzeichen, App-Lebenszyklus, Freigabe, Benachrichtigungen und anderem nativen Verhalten – ohne einen öffentlichen Backend-Dienst.

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

if (context.available) {
  await SiteToApp.page.setTitle('Your cart');
  await SiteToApp.navigation.setBadge('cart', 3);
}
Kein Schlüssel, Token oder öffentlicher REST-Endpunkt
Zweck

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.

Verfügbarkeit und Einrichtung

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.

CDN-Skriptv1
<script
  src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
  defer
></script>
ES-Modulv1
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.

Bereitschaft und Kontext

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.

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');
KontextfeldWertGrund
verfügbarBoolescher WertOb eine native Shell einen gültigen Handshake abgeschlossen hat.
Plattformios | Android | WebDie aktive Laufzeit; niemals vom Benutzeragenten abgeleitet.
appVersionZeichenfolge | nullDie installierte native App-Version, sofern verfügbar.
sdkVersionZeichenfolgeDie geladene Website-SDK-Version.
protocolVersionNummer | nullDer Überbrückungsvertrag wird mit der App ausgehandelt.
Fähigkeitenstring[]Unterstützte Befehle wie navigation.badge oder share.
colorSchemeLicht | dunkelDas aktuelle native Erscheinungsbild.
safeAreaoben, rechts, unten, linksEinfügungen in CSS-Pixeln für benutzerdefinierte Vollbild-Layouts.
Der Funktionscode sollte überprüft werden context.capabilities wenn die Unterstützung je nach installierter App-Version variiert. Plattformkontrollen sind das letzte Mittel.
Seitentitel und Status

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.

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)

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.

Navigationsabzeichen

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

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

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.

Beispiel für einen Warenkorb im Shopify-Stilv1
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();
OptionStandardVerhalten
URLerforderlichHTTPS oder relative URL, die JSON oder Klartext zurückgibt.
jsonPathkeinerPunktpfad wie „cart.item_count“. Erforderlich, wenn JSON nicht selbst der Badge-Wert ist.
IntervalldeaktiviertAbfrageintervall in Millisekunden, mindestens 15 Sekunden.
refreshOnFertig, weitermachenJede Kombination aus „Bereit“, „Lebenslauf“, „Fokus“ und „URL ändern“.
Anmeldeinformationengleichen UrsprungsVerwendet den Modus „Anmeldeinformationen abrufen“ des Browsers. Für Cross-Origin-Anfragen ist weiterhin CORS erforderlich.
Time-out5000Maximale Abrufzeit in Millisekunden.
hideWhenZeroWAHRBlenden Sie das Abzeichen aus, wenn das zugeordnete Ergebnis 0, null oder falsch ist.
abgestandenhaltenNach 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:error ohne die Seite zu zerstören.
Native Aktionen

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.

Teilen, Benachrichtigungen und 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');

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.

App-Ereignisse

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.

Veranstaltungsabonnementsv1
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

Die App kehrte in den Vordergrund zurück. Aktualisieren Sie zeitkritische Seitendaten und beobachtete Abzeichen.

app:pause

Die App wurde in den Hintergrund verschoben. Unterbrechen Sie teure Arbeiten, die nicht bereits vom Browser erledigt werden.

navigation:reselect

Der Benutzer hat erneut auf das derzeit aktive native Navigationselement getippt. Üblicherweise wird ein Feed nach oben gescrollt.

route:open

Die Shell hat einen vertrauenswürdigen Deep-Link erhalten, den der Seitenrouter ohne vollständiges Neuladen verarbeiten sollte.

notification:opened

Der Benutzer hat eine Push-Benachrichtigung geöffnet. Die Nutzlast enthält eine genehmigte In-App-URL und optionale öffentliche Metadaten.

network:change

Die Konnektivität hat sich zwischen Online und Offline geändert. Der Browser bleibt die Quelle der Wahrheit für den tatsächlichen Abruferfolg.

appearance:change

Das ursprüngliche helle oder dunkle Erscheinungsbild veränderte sich. Payload enthält das neue Farbschema.

sdk:error

Ein Watcher, ein Bridge-Befehl oder eine Nachrichtenvalidierung ist fehlgeschlagen. Für Diagnosezwecke gedacht, nicht für sensible Protokollierung.

Browser-Fallbacks

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.

BesonderheitNormales Browserverhalten
bereitWird mit „available: false“ und „platform: web“ nach dem Timeout aufgelöst.
page.setTitleAktualisiert document.title, wenn das Dokument aktiviert ist; Native Zustellungsberichte falsch.
Abzeichen und ArtikelstatusStandardmäßig nicht abrufen oder rendern. Rückgabe geliefert: falsch ohne zu werfen.
navigation.openVerwendet je nach Ziel location.assign, location.replace oder window.open.
navigation.backVerwendet „history.back“, wenn der Browserverlauf verfügbar ist.
AktieVerwendet navigator.share und dann die Zwischenablage nach einer Benutzergeste.
BenachrichtigungenRückgabe nicht unterstützt; Es ersetzt nicht das Browser-Benachrichtigungssystem.
HaptikSicheres No-Op mit „geliefert: falsch“.
Befehle sollten zu einem kleinen Ergebnis aufgelöst werden, z { delivered: false, reason: 'not-in-app' }. Ungültige Argumente und native Ablehnungen werden typisiert verwendet SiteToAppError codes.
v1-Oberfläche

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.

Bridge-Protokoll

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

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

App-Bestätigung

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

App zur Website

Validiertes natives Ereignisv1
// 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.
  • __receive ist nur für die Implementierung gedacht, nach Möglichkeit nicht aufzählbar und lehnt Nachrichten außerhalb des Schemas ab.
Sicherheitsregeln

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:

1

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.

2

Nachrichtentypen werden auf die Zulassungsliste gesetzt und jede Nutzlast wird anhand des ausgehandelten Protokollschemas validiert. Unbekannte Felder werden ignoriert und unbekannte Befehle abgelehnt.

3

Store-Anmeldeinformationen, Push-Tokens, Gerätekennungen, Authentifizierungscookies und native Dateisystempfade werden niemals Seiten-JavaScript ausgesetzt.

4

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.

5

Berechtigungsaufforderungen, Freigabe-Fallbacks, Einstellungslinks und störende native Aktionen erfordern eine aktuelle Benutzergeste.

6

Befehle sind ratenbegrenzt, Nachrichten sind auf 64 KB begrenzt und für Zeichenfolgen und native Aufrufe gelten Längenbeschränkungen und Zeitüberschreitungen.

7

Nutzdaten werden aus Produktionsprotokollen entfernt. Diagnosefehler enthalten Codes und Nachrichten-IDs, niemals Kundeninhalte oder Geheimnisse.

8

Beobachtete Badge-Anfragen folgen den Browser-Abrufregeln. Anmeldeinformationen gleichen Ursprungs sind die Standardeinstellung. Cross-Origin-URLs müssen CORS bestehen.

Bevor Sie live gehen

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.available ist 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.

Senden Sie einen Anwendungsfall