Disponível · v1

A ponte entre seu site e seu aplicativo.

Um pequeno SDK JavaScript versionado para coordenar títulos de páginas, navegação, emblemas, ciclo de vida de aplicativos, compartilhamento, notificações e outros comportamentos nativos, sem um serviço de back-end 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);
}
Nenhuma chave, token ou endpoint REST público
Propósito

Um site, com momentos de reconhecimento de aplicativos.

O SDK é um aprimoramento progressivo opcional. Suas páginas ainda possuem conteúdo, roteamento, contas, carrinhos e regras de negócios. O shell nativo possui integrações de aplicativos e dispositivos cromados. O SDK passa mensagens pequenas e validadas entre os dois.

Não há nenhum serviço REST público SiteTo.App envolvido. Os sites não precisam de uma chave SiteTo.App e o SDK nunca deve conter credenciais de loja, segredos de clientes ou tokens de contas privilegiadas.

Títulos de páginas contextuais

Deixe uma página de checkout, conta ou artigo atualizar o cabeçalho nativo enquanto mantém o título do navegador correto.

Emblemas de navegação ao vivo

Envie um valor conhecido imediatamente ou leia um carrinho, uma caixa de entrada ou uma contagem de reservas a partir de um URL de mesma origem.

Navegação com reconhecimento de rota

Mantenha o item de navegação nativo ativo alinhado com páginas tradicionais e rotas de aplicativos de página única.

Eventos do ciclo de vida

Atualize o estado desatualizado do site quando o aplicativo for retomado, reconectado ou aberto a partir de uma notificação ou link direto.

Ações nativas

Use a planilha de compartilhamento do sistema, prompts de permissão, configurações e feedback tátil sutil quando compatível.

Comportamento seguro do navegador

Cada recurso tem um substituto de navegador documentado ou não operacional, para que a base de código de um site continue funcionando em qualquer lugar.

Disponibilidade e configuração

Um script, com versão explícita.

Adicione o script CDN a um site comum ou instale o pacote npm em um aplicativo incluído. Ambos expõem o mesmo comportamento e versão do protocolo.

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

As versões principais residem no URL e no contrato do pacote. Adições ininterruptas podem ser enviadas dentro v1; métodos renomeados, cargas alteradas ou comportamento de fallback diferente exigem v2.

Prontidão e contexto

Detecte recursos, não agentes de usuário.

SiteToApp.ready() inicia um aperto de mão com o shell nativo e resolve para um AppContext. Ele também deve ser resolvido em um navegador normal, para que o código do aplicativo nunca seja interrompido enquanto aguarda uma ponte que não 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ão
disponívelbooleanoSe um shell nativo completou um handshake válido.
plataformaios | andróide | redeO tempo de execução ativo; nunca inferido do agente do usuário.
appVersioncorda | nuloA versão nativa instalada do aplicativo, quando disponível.
sdkVersioncordaA versão do SDK do site carregado.
protocolVersionnúmero | nuloO contrato ponte negociado com o app.
capacidadescorda[]Comandos suportados, como navigation.badge ou share.
colorSchemeluz | escuroA aparência nativa atual.
safeAreasuperior, direita, inferior, esquerdaInserções em pixels CSS para layouts personalizados de tela inteira.
O código do recurso deve verificar context.capabilities quando o suporte varia de acordo com a versão do aplicativo instalado. As verificações da plataforma são o último recurso.
Títulos e estado das páginas

Mantenha o cabeçalho nativo no contexto.

Uma página pode alterar o cabeçalho do aplicativo conforme os clientes navegam pelos produtos, artigos, seções da conta ou finalização da compra. Por padrão, setTitle atualiza o cabeçalho nativo e document.title portanto, o histórico do navegador também permanece ú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 uma transição de site ao indicador de carregamento do shell. O aplicativo ainda deve impor um tempo limite automático para que uma página não possa deixá-lo em execução para sempre.

page.setPullToRefresh(boolean)

Desative puxar para atualizar para desenhar superfícies, mapas ou interações onde o gesto entra em conflito com o comportamento da página.

Emblemas de navegação

Mostre a contagem que importa agora.

Os itens de navegação usam IDs estáveis ​​configurados no construtor SiteTo.App, como cart, inbox, ou bookings. Os rótulos podem mudar, mas esses IDs continuam sendo o contrato entre o site e o aplicativo.

Defina um valor conhecido

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

Atualizar a partir de um URL

Um observador busca no contexto do site, não em um serviço SiteTo.App separado. URLs relativos e de mesma origem são recomendados porque mantêm intactos os cookies normais do site e as regras de segurança.

Exemplo de carrinho 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();
OpçãoPadrãoComportamento
urlobrigatórioHTTPS ou URL relativo retornando JSON ou texto simples.
jsonPathnenhumCaminho de pontos como cart.item_count. Obrigatório quando o JSON não é o valor do selo.
intervalodesabilitadoIntervalo de pesquisa em milissegundos, com mínimo de 15 segundos.
refreshOnpronto, retomarQualquer combinação de pronto, currículo, foco e mudança de URL.
credenciaismesma origemUsa o modo de busca de credenciais do navegador. Solicitações de origem cruzada ainda exigem CORS.
tempo esgotado5000Tempo máximo de busca em milissegundos.
hideWhenZeroverdadeiroOculte o emblema quando o resultado mapeado for 0, nulo ou falso.
obsoletomanterMantenha o último valor válido após um erro; claro é a alternativa.
  • Os valores numéricos são exibidos de 1 a 99; valores maiores usam o nativo 99+ treatment.
  • Os valores de texto são cortados, limpos e limitados a quatro caracteres visíveis.
  • A pesquisa é pausada enquanto o aplicativo está em segundo plano e é retomada com uma atualização imediata.
  • Solicitações sobrepostas são canceladas; a resposta válida mais recente vence.
  • Falhas de HTTP, análise e mapeamento são emitidas sdk:error sem quebrar a página.
Ações nativas

Use o comportamento do dispositivo onde ele merece seu lugar.

As ações nativas devem melhorar um fluxo da web existente e não se tornar um requisito para o uso do site. Os prompts de permissão devem seguir uma ação clara do usuário e explicar primeiro seu valor na página.

Compartilhamento, notificações e sensação tátilv1
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');

Compartilhe com um substituto útil

Use a planilha de compartilhamento nativa no aplicativo, navigator.share quando disponível, um substituto da área de transferência após uma ação do usuário.

Mantenha o status da permissão simples

Retornar default, granted, denied, ou unsupported. Nunca exponha um push token bruto ao código da página.

Abra links externos deliberadamente

URLs aprovados internamente permanecem no aplicativo. Links HTTPS externos são abertos no navegador do sistema, a menos que a configuração do aplicativo indique o contrário.

Feedback físico com limite de taxa

A sensação tátil é ignorada quando não tem suporte e é limitada nativamente para evitar que uma página produza feedback perturbador repetido.

Eventos de aplicativos

Deixe o site responder ao ciclo de vida do aplicativo.

Os eventos fluem do shell nativo para o SDK após a validação do esquema e da origem. Os manipuladores recebem cargas públicas mínimas e retornam uma função de cancelamento de assinatura para que sites baseados em componentes possam limpá-los.

Assinaturas de 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

O aplicativo voltou ao primeiro plano. Atualize dados de páginas urgentes e emblemas assistidos.

app:pause

O aplicativo foi para segundo plano. Pause trabalhos caros que ainda não foram gerenciados pelo navegador.

navigation:reselect

O usuário tocou novamente no item de navegação nativo atualmente ativo. Geralmente rola um feed para o topo.

route:open

O shell recebeu um link direto confiável que o roteador da página deve manipular sem recarregar completamente.

notification:opened

O usuário abriu uma notificação push. A carga útil contém um URL no aplicativo aprovado e metadados públicos opcionais.

network:change

A conectividade mudou entre online e offline. O navegador continua sendo a fonte da verdade para o sucesso real da busca.

appearance:change

A aparência nativa clara ou escura mudou. A carga útil inclui o novo esquema de cores.

sdk:error

Um inspetor, um comando de ponte ou uma validação de mensagem falhou. Destinado a diagnósticos, não a registros confidenciais.

Alternativas de navegador

O site deve permanecer um site.

Não estar dentro do aplicativo é um estado normal, não uma exceção. O SDK deve evitar ruídos de console e retornar resultados previsíveis quando sua contraparte nativa estiver ausente.

RecursoComportamento normal do navegador
prepararResolve com available: false e platform: web após o tempo limite.
page.setTitleAtualiza document.title quando o documento está habilitado; relatórios de entrega nativa falsos.
emblemas e estado do itemNão busque ou renderize por padrão. Retorno entregue: falso sem arremesso.
navigation.openUsa location.assign, location.replace ou window.open de acordo com o destino.
navigation.backUsa history.back quando o histórico do navegador está disponível.
compartilharUsa navigator.share e, em seguida, a área de transferência após um gesto do usuário.
notificaçõesDevoluções sem suporte; não substitui o sistema de notificação do navegador.
sensação ao toqueNo-op seguro com entrega: falso.
Os comandos devem resolver para um resultado pequeno, como { delivered: false, reason: 'not-in-app' }. Argumentos inválidos e negações nativas usam digitação SiteToAppError codes.
superfície v1

Referência completa do método.

SiteToApp.ready(options?)

Aguarde o handshake e resolva para o AppContext atual. Sempre resolve; um navegador normal retorna disponível: falso.

SiteToApp.getContext()

Retorne a última plataforma negociada, versões, valores de área segura, esquema de cores e lista de capacidades.

SiteToApp.isAvailable()

Relate de forma síncrona se uma ponte nativa validada está conectada no momento.

SiteToApp.page.setTitle(title, options?)

Atualize document.title, o cabeçalho nativo ou ambos. Títulos vazios são rejeitados.

SiteToApp.page.setLoading(loading)

Mostre ou oculte o indicador de carregamento do shell para uma transição de página ou ação de longa duração.

SiteToApp.page.setPullToRefresh(enabled)

Ative ou desative o pull-to-refresh nativo para telas onde o gesto é apropriado.

SiteToApp.navigation.setBadge(itemId, value)

Defina um emblema de item de navegação configurado. Zero, nulo e falso limpam.

SiteToApp.navigation.watchBadge(itemId, options)

Busque e mapeie um valor de emblema em gatilhos de ciclo de vida ou em um intervalo controlado. Retorna controles de atualização e parada.

SiteToApp.navigation.setActive(itemId)

Selecione um item de navegação nativa configurado sem navegar no site.

SiteToApp.navigation.syncWithLocation(rules)

Observe o histórico do navegador e mantenha o item ativo alinhado às regras de correspondência de URL. Retorna uma função de cancelamento de assinatura.

SiteToApp.navigation.setItem(itemId, state)

Atualize o rótulo, a visibilidade ou o estado ativado de um item configurado existente.

SiteToApp.navigation.open(url, options?)

Abra um URL interno aprovado na visualização da web atual ou um URL HTTPS externo no navegador do sistema.

SiteToApp.navigation.back()

Peça ao shell para voltar, acessando o histórico do navegador quando nenhuma rota nativa estiver disponível.

SiteToApp.share(data)

Abra a planilha de compartilhamento nativa, com navigator.share e substitutos da área de transferência na web.

SiteToApp.notifications.requestPermission()

Solicite permissão de notificação após um gesto do usuário e retorne o status resultante.

SiteToApp.notifications.openSettings()

Abra as configurações do sistema operacional deste aplicativo quando a permissão foi negada anteriormente.

SiteToApp.haptics.impact(style)

Solicite feedback de impacto leve, médio ou forte. Este é um ambiente autônomo quando não há suporte.

SiteToApp.on(event, handler)

Assine um evento de aplicativo validado e receba uma função de cancelamento de assinatura.

SiteToApp.once(event, handler)

Inscreva-se para o próximo evento correspondente e remova o manipulador automaticamente.

Erros de digitação: INVALID_ARGUMENT, UNSUPPORTED, NOT_ALLOWED, TIMEOUT, FETCH_FAILED, PROTOCOL_MISMATCH, e NATIVE_ERROR.

Protocolo de ponte

Um envelope de mensagem pequeno e confirmado.

A camada JavaScript normaliza os detalhes de transporte da plataforma. No aplicativo, as mensagens viajam pelo transporte React Native WebView como JSON serializado por meio de window.ReactNativeWebView.postMessage. O envelope é independente desse transporte.

Site para aplicativo

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

Reconhecimento do aplicativo

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

Aplicativo para site

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() },
});
  • O SDK começa com bridge.hello; o aplicativo responde com versões e recursos de protocolo suportados.
  • Cada comando obtém um ID exclusivo. Os comandos que precisam de confirmação recebem uma resposta referenciando esse ID.
  • O tempo limite de confirmação padrão é de dois segundos. As respostas tardias são ignoradas depois que o tempo limite é estabelecido.
  • As mensagens são apenas JSON, limitadas a 64 KB e analisadas exatamente uma vez em cada lado.
  • Mudanças repetidas de títulos e emblemas são rejeitadas; o último valor válido vence.
  • __receive é apenas de implementação, não enumerável sempre que possível e rejeita mensagens fora do esquema.
Regras de segurança

A ponte é estreita por design.

Uma ponte WebView cria autoridade nativa dentro do conteúdo da web, de modo que o shell do aplicativo trata cada mensagem da página como entrada não confiável, mesmo quando a página pertence a você. Ele impõe estas regras:

1

A ponte é ativada apenas nas origens HTTPS exatas e nos padrões de URL configurados para seu aplicativo e desativada antes de navegar em outro lugar.

2

Os tipos de mensagens são permitidos e cada carga útil é validada em relação ao esquema de protocolo negociado. Os campos desconhecidos são ignorados e os comandos desconhecidos são rejeitados.

3

Credenciais de armazenamento, tokens push, identificadores de dispositivos, cookies de autenticação e caminhos de sistemas de arquivos nativos nunca são expostos ao JavaScript da página.

4

Somente URLs relativos ou destinos HTTPS validados são aceitos. javascript:, data:, file:, intent: e esquemas personalizados são bloqueados, a menos que um comando específico os inclua na lista de permissões.

5

Solicitações de permissão, compartilhamento de substitutos, links de configurações e ações nativas perturbadoras exigem um gesto recente do usuário.

6

Os comandos têm taxa limitada, as mensagens são limitadas a 64 KB e as strings e chamadas nativas têm limites de comprimento e tempos limite.

7

As cargas úteis são editadas dos logs de produção. Os erros de diagnóstico contêm códigos e IDs de mensagens, nunca conteúdo ou segredos do cliente.

8

As solicitações de selo assistidas seguem as regras de busca do navegador. Credenciais da mesma origem são o padrão; URLs de origem cruzada devem passar pelo CORS.

Antes de ir ao vivo

Teste sua integração.

O SDK altera apenas o comportamento dentro do seu aplicativo. Verifique os dois caminhos para que os usuários do aplicativo tenham a experiência nativa e os visitantes do navegador mantenham o site funcionando exatamente como antes.

  • Abra as páginas que chamam o SDK em um navegador móvel normal e confirme que nada quebra quando context.available é falso.
  • Teste no aplicativo em iOS e Android, incluindo redes lentas, estado off-line e retomada após muito tempo em segundo plano.
  • Verifique títulos, emblemas e navegação ativa após recargas e alterações de rota do lado do cliente.
  • Para ações nativas, teste os caminhos de gesto do usuário, permissão negada e sem suporte.
  • Se o seu site usa uma Política de Segurança de Conteúdo, permita a origem do script SDK.

Tem um caso de uso que este contrato perdeu?

Compartilhe o fluxo do site, o comportamento do aplicativo que você precisa e o que deve acontecer em um navegador normal. Isso é suficiente para avaliarmos.

Envie um caso de uso