Eén website, met app-bewuste momenten.
De SDK is een optionele progressieve verbetering. Uw pagina's zijn nog steeds eigenaar van inhoud, routing, accounts, winkelwagentjes en bedrijfsregels. De native shell is eigenaar van app-chrome en apparaatintegraties. De SDK geeft kleine, gevalideerde berichten door tussen de twee.
Er is geen openbare SiteTo.App-REST-service bij betrokken. Websites hebben geen SiteTo.App-sleutel nodig en de SDK mag nooit winkelreferenties, klantgeheimen of geprivilegieerde accounttokens bevatten.
Contextuele paginatitels
Laat een betaal-, account- of artikelpagina de native header bijwerken terwijl de browsertitel correct blijft.
Live navigatiebadges
Push een bekende waarde onmiddellijk of lees het aantal winkelwagentjes, inbox of boekingen vanaf een URL van dezelfde oorsprong.
Routebewuste navigatie
Houd het actieve native navigatie-item uitgelijnd met traditionele pagina's en applicatieroutes van één pagina.
Levenscyclusgebeurtenissen
Vernieuw de verouderde websitestatus wanneer de app wordt hervat, opnieuw verbinding maakt of wordt geopend via een melding of deep link.
Inheemse acties
Gebruik het systeemdeelblad, toestemmingsprompts, instellingen en subtiele haptische feedback indien ondersteund.
Veilig browsergedrag
Elke functie heeft een gedocumenteerde browser fallback of no-op, zodat de codebase van één website overal blijft werken.
Eén script, expliciet versiebeheer.
Voeg het CDN-script toe aan een gewone website of installeer het npm-pakket in een gebundelde applicatie. Beide vertonen hetzelfde gedrag en dezelfde protocolversie.
<script
src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
defer
></script>import { SiteToApp } from '@sitetoapp/web-sdk';De belangrijkste versies staan in de URL en het pakketcontract. Niet-brekende toevoegingen kunnen binnen worden verzonden v1; hernoemde methoden, gewijzigde payloads of ander terugvalgedrag vereisen v2.
Detecteer mogelijkheden, geen user agents.
SiteToApp.ready() begint een handdruk met de oorspronkelijke shell en besluit tot een AppContext. Het moet ook in een normale browser worden opgelost, zodat applicatiecode nooit blijft hangen tijdens het wachten op een bridge die niet aanwezig is.
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');| Contextveld | Waarde | Reden |
|---|---|---|
| beschikbaar | Booleaans | Of een native shell een geldige handdruk heeft voltooid. |
| platform | ios | androïde | web | De actieve looptijd; nooit afgeleid van de user-agent. |
| appVersion | tekenreeks | nul | De geïnstalleerde native app-versie, indien beschikbaar. |
| sdkVersion | snaar | De geladen website-SDK-versie. |
| protocolVersion | nummer | nul | Het overbruggingscontract onderhandeld met de app. |
| mogelijkheden | snaar[] | Ondersteunde opdrachten zoals navigatie.badge of delen. |
| colorScheme | licht | donker | Het huidige inheemse uiterlijk. |
| safeArea | boven, rechts, onder, links | Inzetstukken in CSS-pixels voor aangepaste lay-outs op volledig scherm. |
context.capabilities wanneer de ondersteuning varieert per geïnstalleerde app-versie. Platformcontroles zijn een laatste redmiddel.Houd de native header in context.
Een pagina kan de app-koptekst wijzigen terwijl klanten door producten, artikelen, accountsecties of afrekenen gaan. Standaard, setTitle werkt zowel de native header als document.title dus de browsergeschiedenis blijft ook nuttig.
// 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)Koppel een websiteovergang aan de shell-laadindicator. De app moet nog steeds een automatische time-out afdwingen, zodat een pagina deze niet voor altijd actief kan laten.
page.setPullToRefresh(boolean)Schakel pull-to-refresh uit voor tekenoppervlakken, kaarten of interacties waarbij de beweging conflicteert met paginagedrag.
Toon de telling die er nu toe doet.
Navigatie-items gebruiken stabiele ID's die zijn geconfigureerd in de SiteTo.App-builder, zoals cart, inbox, of bookings. Labels kunnen veranderen, maar die ID's blijven het contract tussen de website en de app.
Stel een bekende waarde in
// 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');Updaten vanaf een URL
Een watcher haalt op in de websitecontext, niet uit een afzonderlijke SiteTo.App-service. Relatieve URL's van dezelfde oorsprong worden aanbevolen omdat ze de normale sitecookies en beveiligingsregels intact houden.
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();| Optie | Standaard | Gedrag |
|---|---|---|
| URL | vereist | HTTPS of relatieve URL die JSON of platte tekst retourneert. |
| jsonPath | geen | Puntpad zoals cart.item_count. Vereist als JSON zelf niet de badgewaarde is. |
| interval | gehandicapt | Polling-interval in milliseconden, met een minimum van 15 seconden. |
| refreshOn | klaar, hervatten | Elke combinatie van klaar, cv, focus en urlchange. |
| referenties | dezelfde oorsprong | Gebruikt de modus voor het ophalen van inloggegevens van de browser. Cross-origin-aanvragen vereisen nog steeds CORS. |
| time-out | 5000 | Maximale ophaaltijd in milliseconden. |
| hideWhenZero | WAAR | Verberg de badge als het toegewezen resultaat 0, null of false is. |
| muf | houden | Behoud de laatste geldige waarde na een fout; duidelijk is het alternatief. |
- Numerieke waarden worden weergegeven van 1–99; grotere waarden gebruiken de native 99+ treatment.
- Tekstwaarden zijn ingekort, opgeschoond en beperkt tot vier zichtbare tekens.
- De peiling wordt onderbroken terwijl de app op de achtergrond staat en wordt hervat met één onmiddellijke vernieuwing.
- Overlappende verzoeken worden geannuleerd; het nieuwste geldige antwoord wint.
- Er worden HTTP-, parserings- en toewijzingsfouten uitgezonden
sdk:errorzonder de pagina te breken.
Gebruik apparaatgedrag waar het zijn plaats verdient.
Native acties moeten een bestaande webflow verbeteren en geen vereiste worden voor het gebruik van de website. Toestemmingsprompts moeten een duidelijke gebruikersactie volgen en eerst hun waarde op de pagina uitleggen.
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');Deel met een nuttige terugval
Gebruik het native aandelenblad in de app, navigator.share indien beschikbaar, vervolgens een terugval op het klembord na een gebruikersactie.
Houd de toestemmingsstatus eenvoudig
Opbrengst default, granted, denied, of unsupported. Stel nooit een onbewerkt push-token bloot aan paginacode.
Open bewust externe links
Intern goedgekeurde URL's blijven in de app. Externe HTTPS-links worden geopend in de systeembrowser, tenzij de app-configuratie anders aangeeft.
Fysieke feedback met snelheidslimiet
Haptieken worden genegeerd wanneer ze niet worden ondersteund en worden native beperkt om te voorkomen dat een pagina herhaaldelijk storende feedback produceert.
Laat de website reageren op de levenscyclus van de app.
Gebeurtenissen stromen van de systeemeigen shell naar de SDK na validatie van het schema en de oorsprong. Handlers ontvangen openbare, minimale payloads en retourneren een afmeldingsfunctie, zodat op componenten gebaseerde sites deze kunnen opruimen.
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:resumeDe app keerde terug naar de voorgrond. Ververs tijdgevoelige paginagegevens en bekeken badges.
app:pauseDe app is naar de achtergrond verplaatst. Pauzeer duur werk dat nog niet door de browser wordt afgehandeld.
navigation:reselectDe gebruiker tikte opnieuw op het momenteel actieve native navigatie-item. Meestal wordt een feed naar boven gescrolld.
route:openDe shell ontving een vertrouwde deep link die de paginarouter zou moeten verwerken zonder volledig opnieuw te laden.
notification:openedDe gebruiker heeft een pushmelding geopend. Payload bevat een goedgekeurde in-app-URL en optionele openbare metadata.
network:changeDe connectiviteit veranderde tussen online en offline. De browser blijft de bron van de waarheid voor daadwerkelijk ophaalsucces.
appearance:changeHet oorspronkelijke lichte of donkere uiterlijk veranderde. Payload omvat het nieuwe kleurenschema.
sdk:errorEen watcher-, bridge-opdracht of berichtvalidatie is mislukt. Bedoeld voor diagnostiek, niet voor gevoelige logboekregistratie.
De website moet een website blijven.
Het niet aanwezig zijn in de app is een normale toestand en geen uitzondering. De SDK moet consoleruis vermijden en voorspelbare resultaten retourneren wanneer de oorspronkelijke tegenhanger afwezig is.
| Functie | Normaal browsergedrag |
|---|---|
| klaar | Wordt opgelost met beschikbaar: false en platform: web na de time-out. |
| page.setTitle | Werkt document.title bij wanneer document is ingeschakeld; native leveringsrapporten zijn onwaar. |
| badges en itemstatus | Standaard niet ophalen of renderen. Retour afgeleverd: vals zonder te gooien. |
| navigation.open | Gebruikt location.assign, location.replace of window.open afhankelijk van het doel. |
| navigation.back | Gebruikt history.back wanneer browsergeschiedenis beschikbaar is. |
| deel | Gebruikt navigator.share en vervolgens het klembord na een gebruikersgebaar. |
| meldingen | Retourzendingen worden niet ondersteund; het vervangt niet het browsermeldingssysteem. |
| haptiek | Veilig no-op met afgeleverd: false. |
{ delivered: false, reason: 'not-in-app' }. Ongeldige argumenten en native weigeringen worden getypt SiteToAppError codes.Volledige methodereferentie.
SiteToApp.ready(options?)Wacht op de handdruk en ga vervolgens naar de huidige AppContext. Het lost altijd op; een normale browser retourneert beschikbaar: false.
SiteToApp.getContext()Retourneer het laatst onderhandelde platform, de versies, de veilige gebiedswaarden, het kleurenschema en de mogelijkhedenlijst.
SiteToApp.isAvailable()Synchroniseer of er momenteel een gevalideerde native bridge is aangesloten.
SiteToApp.page.setTitle(title, options?)Update document.title, de native header of beide. Lege titels worden afgewezen.
SiteToApp.page.setLoading(loading)Toon of verberg de shell-laadindicator voor een paginaovergang of langlopende actie.
SiteToApp.page.setPullToRefresh(enabled)Schakel native pull-to-refresh in of uit voor schermen waarop de beweging geschikt is.
SiteToApp.navigation.setBadge(itemId, value)Stel een geconfigureerde navigatie-itembadge in. Nul, nul en onwaar, wis het.
SiteToApp.navigation.watchBadge(itemId, options)Haal een badgewaarde op en wijs deze toe op levenscyclustriggers of een gecontroleerd interval. Geeft de besturingselementen voor vernieuwen en stoppen terug.
SiteToApp.navigation.setActive(itemId)Selecteer een geconfigureerd native navigatie-item zonder door de website te navigeren.
SiteToApp.navigation.syncWithLocation(rules)Houd de browsergeschiedenis in de gaten en houd het actieve item in lijn met de URL-matchregels. Retourneert een afmeldingsfunctie.
SiteToApp.navigation.setItem(itemId, state)Update het label, de zichtbaarheid of de ingeschakelde status van een bestaand geconfigureerd artikel.
SiteToApp.navigation.open(url, options?)Open een goedgekeurde interne URL in de huidige webweergave of een externe HTTPS-URL in de systeembrowser.
SiteToApp.navigation.back()Vraag de shell om terug te gaan en door te gaan naar de browsergeschiedenis als er geen native route beschikbaar is.
SiteToApp.share(data)Open het eigen deelblad, met navigator.share en klembord-fallbacks op internet.
SiteToApp.notifications.requestPermission()Vraag toestemming voor meldingen na een gebruikersgebaar en retourneer de resulterende status.
SiteToApp.notifications.openSettings()Open de besturingssysteeminstellingen voor deze app wanneer de toestemming eerder werd geweigerd.
SiteToApp.haptics.impact(style)Vraag om feedback over lichte, gemiddelde of zware impact. Dit is een no-op als het niet wordt ondersteund.
SiteToApp.on(event, handler)Abonneer u op een gevalideerd app-evenement en ontvang een afmeldfunctie.
SiteToApp.once(event, handler)Abonneer u op de volgende overeenkomende gebeurtenis en verwijder de handler vervolgens automatisch.
Getypte fouten: INVALID_ARGUMENT, UNSUPPORTED, NOT_ALLOWED, TIMEOUT, FETCH_FAILED, PROTOCOL_MISMATCH, En NATIVE_ERROR.
Een kleine, bevestigde berichtenvelop.
De JavaScript-laag normaliseert platformtransportdetails. In de app reizen berichten via het React Native WebView-transport als geserialiseerde JSON door window.ReactNativeWebView.postMessage. De envelop is onafhankelijk van dat transport.
Website naar app
{
"channel": "sitetoapp",
"protocolVersion": 1,
"id": "sta_01J8ZQ6JY1",
"type": "navigation.badge.set",
"payload": {
"itemId": "cart",
"value": 3
},
"timestamp": 1789584000000
}App-bevestiging
{
"channel": "sitetoapp",
"protocolVersion": 1,
"type": "response",
"replyTo": "sta_01J8ZQ6JY1",
"ok": true,
"payload": null
}Appen naar 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() },
});- De SDK begint met
bridge.hello; de app reageert met ondersteunde protocolversies en -mogelijkheden. - Elke opdracht krijgt een unieke ID. Commando's die bevestiging nodig hebben, ontvangen een antwoord dat naar die ID verwijst.
- De standaardtime-out voor bevestiging is twee seconden. Late reacties worden genegeerd nadat een time-out is verstreken.
- Berichten zijn alleen JSON, beperkt tot 64 KB, en worden aan elke kant precies één keer geparseerd.
- Herhaalde titel- en badgewijzigingen worden ongedaan gemaakt; de laatste geldige waarde wint.
__receiveis alleen voor implementatie, waar mogelijk niet opsombaar, en weigert berichten buiten het schema.
De brug is smal van opzet.
Een WebView-bridge creëert native autoriteit binnen webinhoud, zodat de app-shell elk paginabericht als niet-vertrouwde invoer behandelt, zelfs als de pagina van u is. Het handhaaft deze regels:
De bridge wordt alleen ingeschakeld op de exacte HTTPS-oorsprong en URL-patronen die voor uw app zijn geconfigureerd, en uitgeschakeld voordat u ergens anders naartoe navigeert.
Berichttypen staan op de toelatingslijst en elke payload wordt gevalideerd op basis van het onderhandelde protocolschema. Onbekende velden worden genegeerd en onbekende opdrachten afgewezen.
Winkelreferenties, pushtokens, apparaat-ID's, authenticatiecookies en native bestandssysteempaden worden nooit blootgesteld aan pagina-JavaScript.
Alleen relatieve URL's of gevalideerde HTTPS-bestemmingen worden geaccepteerd. javascript:, data:, file:, intent: en aangepaste schema's worden geblokkeerd, tenzij een specifieke opdracht ze op de toelatingslijst zet.
Toestemmingsprompts, reserveonderdelen voor delen, koppelingen naar instellingen en verstorende native acties vereisen een recent gebruikersgebaar.
De snelheid van opdrachten is beperkt, berichten zijn beperkt tot 64 KB, en tekenreeksen en native oproepen hebben lengtelimieten en time-outs.
Payloads worden geredigeerd uit productielogboeken. Diagnostische fouten bevatten codes en bericht-ID's, nooit klantinhoud of geheimen.
Bekeken badgeverzoeken volgen de ophaalregels van de browser. Inloggegevens van dezelfde oorsprong zijn de standaard; cross-origin-URL's moeten CORS passeren.
Test uw integratie.
De SDK verandert alleen het gedrag binnen uw app. Controleer beide paden, zodat app-gebruikers de native ervaring krijgen en browserbezoekers de website precies zo laten werken als voorheen.
- Open de pagina's die de SDK aanroepen in een normale mobiele browser en controleer of er niets kapot gaat
context.availableis vals. - Test in de app op iOS en Android, inclusief trage netwerken, offline status en hervatten na lange tijd op de achtergrond.
- Controleer titels, badges en actieve navigatie na herlaadbeurten en routewijzigingen aan de klantzijde.
- Voor systeemeigen acties test u de paden voor gebruikersgebaren, geweigerde rechten en niet-ondersteunde paden.
- Als uw site gebruikmaakt van een inhoudsbeveiligingsbeleid, sta dan de oorsprong van het SDK-script toe.
Heeft u een use case die dit contract mist?
Deel de websitestroom, het app-gedrag dat u nodig heeft en wat er in een normale browser zou moeten gebeuren. Dat is voor ons voldoende om het te beoordelen.