Disponible · v1

El puente entre su sitio web y su aplicación.

Un SDK de JavaScript pequeño y versionado para coordinar títulos de páginas, navegación, insignias, ciclo de vida de aplicaciones, uso compartido, notificaciones y otros comportamientos nativos, sin un servicio de backend público.

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

if (context.available) {
  await SiteToApp.page.setTitle('Your cart');
  await SiteToApp.navigation.setBadge('cart', 3);
}
Sin clave, token o punto final REST público
Objetivo

Un sitio web, con momentos conscientes de la aplicación.

El SDK es una mejora progresiva opcional. Sus páginas aún poseen contenido, enrutamiento, cuentas, carritos y reglas comerciales. El shell nativo posee integraciones de dispositivos y aplicaciones Chrome. El SDK pasa mensajes pequeños y validados entre los dos.

No hay ningún servicio REST público SiteTo.App involucrado. Los sitios web no necesitan una clave SiteTo.App y el SDK nunca debe contener credenciales de tienda, secretos de clientes ni tokens de cuentas privilegiadas.

Títulos de página contextuales

Deje que una página de pago, cuenta o artículo actualice el encabezado nativo mientras mantiene correcto el título del navegador.

Insignias de navegación en vivo

Envíe un valor conocido inmediatamente o lea un carrito, una bandeja de entrada o un recuento de reservas desde una URL del mismo origen.

Navegación con reconocimiento de ruta

Mantenga el elemento de navegación nativo activo alineado con las páginas tradicionales y las rutas de aplicaciones de una sola página.

Eventos del ciclo de vida

Actualiza el estado obsoleto del sitio web cuando la aplicación se reanuda, se vuelve a conectar o se abre desde una notificación o un enlace profundo.

Acciones nativas

Utilice la hoja para compartir del sistema, las solicitudes de permiso, la configuración y la retroalimentación háptica sutil cuando sea compatible.

Comportamiento seguro del navegador

Cada función tiene un navegador documentado de respaldo o no operativo, por lo que el código base de un sitio web continúa funcionando en todas partes.

Disponibilidad y configuración

Un script, versionado explícitamente.

Agregue el script CDN a un sitio web normal o instale el paquete npm en una aplicación incluida. Ambos exponen el mismo comportamiento y versión de protocolo.

secuencia de comandos CDNv1
<script
  src="https://cdn.siteto.app/sdk/v1/sitetoapp.min.js"
  defer
></script>
módulo ESv1
import { SiteToApp } from '@sitetoapp/web-sdk';

Las versiones principales se encuentran en la URL y en el contrato del paquete. Las adiciones que no se rompen pueden enviarse dentro v1; Los métodos renombrados, las cargas útiles modificadas o un comportamiento alternativo diferente requieren v2.

Preparación y contexto

Detectar capacidades, no agentes de usuario.

SiteToApp.ready() comienza un apretón de manos con el shell nativo y se resuelve en un AppContext. También debe resolverse en un navegador normal, de modo que el código de la aplicación nunca se cuelgue mientras espera un puente que no está presente.

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');
Campo de contextoValorRazón
disponiblebooleanoSi un shell nativo completó un protocolo de enlace válido.
plataformaiOS | androide | webEl tiempo de ejecución activo; nunca se infiere del agente de usuario.
appVersioncadena | nuloLa versión de la aplicación nativa instalada, cuando esté disponible.
sdkVersioncadenaLa versión del SDK del sitio web cargada.
protocolVersionnúmero | nuloEl contrato puente negociado con la aplicación.
capacidadescadena[]Comandos admitidos como navegación.badge o compartir.
colorSchemeluz | oscuroLa apariencia nativa actual.
safeAreaarriba, derecha, abajo, izquierdaInserciones en píxeles CSS para diseños personalizados de pantalla completa.
El código de característica debe verificar context.capabilities cuando el soporte varía según la versión de la aplicación instalada. Los controles de plataforma son el último recurso.
Títulos de página y estado

Mantenga el encabezado nativo en contexto.

Una página puede cambiar el encabezado de la aplicación a medida que los clientes avanzan por los productos, artículos, secciones de la cuenta o al finalizar la compra. Por defecto, setTitle actualiza tanto el encabezado nativo como document.title por lo que el historial del navegador también sigue siendo útil.

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)

Conecte una transición de sitio web al indicador de carga del shell. La aplicación aún debe imponer un tiempo de espera automático para que una página no pueda dejarla funcionando para siempre.

page.setPullToRefresh(boolean)

Desactive la función de arrastrar para actualizar para superficies de dibujo, mapas o interacciones donde el gesto entre en conflicto con el comportamiento de la página.

Insignias de navegación

Muestre el recuento que importa ahora.

Los elementos de navegación utilizan ID estables configurados en el generador SiteTo.App, como cart, inbox, o bookings. Las etiquetas pueden cambiar, pero esas identificaciones siguen siendo el contrato entre el sitio web y la aplicación.

Establecer un valor conocido

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

Actualizar desde una URL

Un observador busca en el contexto del sitio web, no desde un servicio SiteTo.App independiente. Se recomiendan URL relativas del mismo origen porque mantienen intactas las cookies normales del sitio y las reglas de seguridad.

Ejemplo de carrito estilo Shopifyv1
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();
OpciónPor defectoComportamiento
URLrequeridoHTTPS o URL relativa que devuelve JSON o texto sin formato.
jsonPathningunoRuta de puntos como cart.item_count. Obligatorio cuando JSON no es en sí mismo el valor de la insignia.
intervalodesactivadoIntervalo de sondeo en milisegundos, con un mínimo de 15 segundos.
refreshOnlisto, reanudarCualquier combinación de listo, currículum, foco y cambio de URL.
cartas credencialesmismo origenUtiliza el modo Obtener credenciales del navegador. Las solicitudes de origen cruzado aún requieren CORS.
se acabó el tiempo5000Tiempo máximo de recuperación en milisegundos.
hideWhenZeroverdaderoOculte la insignia cuando el resultado asignado sea 0, nulo o falso.
duromantenerMantener el último valor válido después de un error; clara es la alternativa.
  • Los valores numéricos se muestran del 1 al 99; los valores más grandes usan el nativo 99+ treatment.
  • Los valores de texto se recortan, desinfectan y se limitan a cuatro caracteres visibles.
  • El sondeo se detiene mientras la aplicación está en segundo plano y se reanuda con una actualización inmediata.
  • Las solicitudes superpuestas se cancelan; la respuesta válida más nueva gana.
  • Se emiten errores de HTTP, análisis y asignación sdk:error sin romper la página.
Acciones nativas

Utilice el comportamiento del dispositivo donde se gane su lugar.

Las acciones nativas deberían mejorar el flujo web existente, no convertirse en un requisito para utilizar el sitio web. Las solicitudes de permiso deben seguir una acción clara del usuario y explicar primero su valor en la página.

Compartir, notificaciones y hápticosv1
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');

Compartir con un recurso útil

Utilice la hoja para compartir nativa en la aplicación, navigator.share cuando esté disponible, luego un respaldo del portapapeles después de una acción del usuario.

Mantenga el estado del permiso simple

Devolver default, granted, denied, o unsupported. Nunca exponga un token de inserción sin formato al código de la página.

Abrir enlaces externos deliberadamente

Las URL internas aprobadas permanecen en la aplicación. Los enlaces HTTPS externos se abren en el navegador del sistema a menos que la configuración de la aplicación indique lo contrario.

Retroalimentación física con límite de velocidad

Los hápticos se ignoran cuando no son compatibles y se limitan de forma nativa para evitar que una página produzca comentarios disruptivos repetidos.

Eventos de aplicaciones

Deje que el sitio web responda al ciclo de vida de la aplicación.

Los eventos fluyen desde el shell nativo al SDK después de la validación del esquema y del origen. Los controladores reciben cargas útiles públicas mínimas y devuelven una función de cancelación de suscripción para que los sitios basados ​​en componentes puedan limpiarlas.

Suscripciones a eventosv1
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

La aplicación volvió al primer plano. Actualice los datos de las páginas urgentes y las insignias observadas.

app:pause

La aplicación pasó a un segundo plano. Pausar trabajos costosos que aún no están manejados por el navegador.

navigation:reselect

El usuario volvió a tocar el elemento de navegación nativo actualmente activo. Normalmente, un feed se desplaza hacia la parte superior.

route:open

El shell recibió un enlace profundo confiable que el enrutador de la página debería manejar sin una recarga completa.

notification:opened

El usuario abrió una notificación push. La carga útil contiene una URL aprobada en la aplicación y metadatos públicos opcionales.

network:change

La conectividad cambió entre en línea y fuera de línea. El navegador sigue siendo la fuente de verdad para el éxito real de la búsqueda.

appearance:change

La apariencia nativa clara u oscura cambió. La carga útil incluye la nueva combinación de colores.

sdk:error

Error en un observador, comando de puente o validación de mensaje. Diseñado para diagnóstico, no para registro confidencial.

Opciones de respaldo del navegador

El sitio web debe seguir siendo un sitio web.

No estar dentro de la aplicación es un estado normal, no una excepción. El SDK debe evitar el ruido de la consola y devolver resultados predecibles cuando su contraparte nativa está ausente.

CaracterísticaComportamiento normal del navegador
listoSe resuelve con disponible: falso y plataforma: web después del tiempo de espera.
page.setTitleActualiza document.title cuando el documento está habilitado; Los informes de entrega nativos son falsos.
insignias y estado del artículoNo buscar ni renderizar de forma predeterminada. Devolución entregada: falsa sin tirar.
navigation.openUtiliza ubicación.assign, ubicación.reemplazar o ventana.abrir según el objetivo.
navigation.backUtiliza History.back cuando el historial del navegador está disponible.
compartirUtiliza navigator.share y luego el portapapeles después de un gesto del usuario.
notificacionesDevoluciones sin soporte; no sustituye al sistema de notificaciones del navegador.
hápticosNo operación segura con entrega: falso.
Los comandos deben resolverse en un resultado pequeño como { delivered: false, reason: 'not-in-app' }. Los argumentos no válidos y las negaciones nativas utilizan tipos escritos. SiteToAppError codes.
superficie v1

Referencia completa del método.

SiteToApp.ready(options?)

Espere el apretón de manos y luego resuelva el AppContext actual. Siempre se resuelve; un navegador normal devuelve disponible: falso.

SiteToApp.getContext()

Devuelve la última plataforma negociada, versiones, valores de área segura, combinación de colores y lista de capacidades.

SiteToApp.isAvailable()

Informa sincrónicamente si un puente nativo validado está conectado actualmente.

SiteToApp.page.setTitle(title, options?)

Actualice document.title, el encabezado nativo o ambos. Se rechazan los títulos vacíos.

SiteToApp.page.setLoading(loading)

Muestra u oculta el indicador de carga del shell para una transición de página o una acción de larga duración.

SiteToApp.page.setPullToRefresh(enabled)

Habilite o deshabilite la función de actualización nativa para pantallas donde el gesto sea apropiado.

SiteToApp.navigation.setBadge(itemId, value)

Establezca una insignia de elemento de navegación configurada. Cero, nulo y falso lo borran.

SiteToApp.navigation.watchBadge(itemId, options)

Obtenga y asigne un valor de insignia en activadores del ciclo de vida o en un intervalo controlado. Devuelve los controles de actualización y detención.

SiteToApp.navigation.setActive(itemId)

Seleccione un elemento de navegación nativo configurado sin navegar por el sitio web.

SiteToApp.navigation.syncWithLocation(rules)

Observe el historial del navegador y mantenga el elemento activo alineado con las reglas de coincidencia de URL. Devuelve una función para cancelar la suscripción.

SiteToApp.navigation.setItem(itemId, state)

Actualice la etiqueta, la visibilidad o el estado habilitado de un elemento configurado existente.

SiteToApp.navigation.open(url, options?)

Abra una URL interna aprobada en la vista web actual o una URL HTTPS externa en el navegador del sistema.

SiteToApp.navigation.back()

Pídale al shell que regrese y acceda al historial del navegador cuando no haya una ruta nativa disponible.

SiteToApp.share(data)

Abra la hoja para compartir nativa, con navigator.share y los respaldos del portapapeles en la web.

SiteToApp.notifications.requestPermission()

Solicite permiso de notificación después de un gesto del usuario y devuelva el estado resultante.

SiteToApp.notifications.openSettings()

Abra la configuración del sistema operativo para esta aplicación cuando anteriormente se le negó el permiso.

SiteToApp.haptics.impact(style)

Solicite comentarios de impacto ligero, medio o fuerte. Esta no es una operación cuando no es compatible.

SiteToApp.on(event, handler)

Suscríbase a un evento de aplicación validado y reciba una función de cancelación de suscripción.

SiteToApp.once(event, handler)

Suscríbase para el próximo evento coincidente y luego elimine el controlador automáticamente.

Errores escritos: INVALID_ARGUMENT, UNSUPPORTED, NOT_ALLOWED, TIMEOUT, FETCH_FAILED, PROTOCOL_MISMATCH, y NATIVE_ERROR.

Protocolo puente

Un sobre pequeño con mensaje reconocido.

La capa de JavaScript normaliza los detalles del transporte de la plataforma. En la aplicación, los mensajes viajan a través del transporte React Native WebView como JSON serializado a través de window.ReactNativeWebView.postMessage. El sobre es independiente de ese transporte.

Sitio web a aplicación

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

Reconocimiento de la aplicación

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

Aplicación al sitio web

Evento nativo validadov1
// 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() },
});
  • El SDK comienza con bridge.hello; la aplicación responde con capacidades y versiones de protocolo compatibles.
  • Cada comando obtiene una identificación única. Los comandos que necesitan confirmación reciben una respuesta que hace referencia a ese ID.
  • El tiempo de espera de confirmación predeterminado es de dos segundos. Las respuestas tardías se ignoran una vez transcurrido el tiempo de espera.
  • Los mensajes son solo JSON, están limitados a 64 KB y se analizan exactamente una vez en cada lado.
  • Los cambios repetidos de título e insignia no rebotan; el último valor válido gana.
  • __receive es solo de implementación, no enumerable cuando sea posible y rechaza mensajes fuera del esquema.
Reglas de seguridad

El puente es estrecho por diseño.

Un puente WebView crea autoridad nativa dentro del contenido web, por lo que el shell de la aplicación trata cada mensaje de la página como entrada que no es de confianza, incluso cuando la página le pertenece. Hace cumplir estas reglas:

1

El puente se habilita solo en los orígenes HTTPS exactos y los patrones de URL configurados para su aplicación y se deshabilita antes de navegar a otro lugar.

2

Los tipos de mensajes están incluidos en la lista de permitidos y cada carga útil se valida según el esquema de protocolo negociado. Los campos desconocidos se ignoran y los comandos desconocidos se rechazan.

3

Las credenciales de almacenamiento, los tokens de inserción, los identificadores de dispositivos, las cookies de autenticación y las rutas del sistema de archivos nativo nunca se exponen al JavaScript de la página.

4

Solo se aceptan URL relativas o destinos HTTPS validados. javascript:, data:, file:, intent: y los esquemas personalizados están bloqueados a menos que un comando específico los incluya en la lista de permitidos.

5

Las solicitudes de permiso, las opciones para compartir, los enlaces de configuración y las acciones nativas disruptivas requieren un gesto reciente del usuario.

6

Los comandos tienen una velocidad limitada, los mensajes tienen un límite de 64 KB y las cadenas y las llamadas nativas tienen límites de longitud y tiempos de espera.

7

Las cargas útiles se eliminan de los registros de producción. Los errores de diagnóstico contienen códigos e ID de mensajes, nunca contenido o secretos del cliente.

8

Las solicitudes de insignias observadas siguen las reglas de recuperación del navegador. Las credenciales del mismo origen son las predeterminadas; Las URL de origen cruzado deben pasar CORS.

Antes de salir en vivo

Pruebe su integración.

El SDK solo cambia el comportamiento dentro de tu aplicación. Verifique ambas rutas para que los usuarios de la aplicación obtengan la experiencia nativa y los visitantes del navegador mantengan el sitio web funcionando exactamente como antes.

  • Abra las páginas que llaman al SDK en un navegador móvil normal y confirme que nada se rompe cuando context.available es falso.
  • Pruebe en la aplicación en iOS y Android, incluidas redes lentas, estado fuera de línea y reanudación después de un largo tiempo en segundo plano.
  • Verifique títulos, insignias y navegación activa después de recargas y cambios de ruta del lado del cliente.
  • Para acciones nativas, pruebe las rutas de gestos de usuario, permiso denegado y no admitidas.
  • Si su sitio utiliza una Política de seguridad de contenido, permita el origen del script del SDK.

¿Tiene algún caso de uso que este contrato omita?

Comparta el flujo del sitio web, el comportamiento de la aplicación que necesita y lo que debería suceder en un navegador normal. Eso nos basta para evaluarlo.

Enviar un caso de uso