App para iOS (Nó)
Disponibilidade: visualização interna. O app para iOS ainda não é distribuído publicamente.O que ele faz
- Conecta-se a um Gateway por WebSocket (LAN ou tailnet).
- Expõe capacidades de nó: Canvas, snapshot da tela, captura de câmera, localização, modo de conversa, ativação por voz.
- Recebe comandos
node.invokee relata eventos de status do nó.
Requisitos
- Gateway em execução em outro dispositivo (macOS, Linux ou Windows via WSL2).
- Caminho de rede:
- Mesma LAN via Bonjour, ou
- Tailnet via DNS-SD unicast (domínio de exemplo:
openclaw.internal.), ou - Host/porta manual (fallback).
Início rápido (parear + conectar)
- Inicie o Gateway:
- No app para iOS, abra Settings e escolha um gateway descoberto (ou habilite Manual Host e insira host/porta).
- Aprove a solicitação de pareamento no host do gateway:
requestId será criado.
Execute openclaw devices list novamente antes da aprovação.
- Verifique a conexão:
Push com relay para builds oficiais
Builds oficiais distribuídos do iOS usam o relay externo de push em vez de publicar o token bruto de APNs para o gateway. Requisito no lado do gateway:- O app para iOS registra-se no relay usando App Attest e o recibo do app.
- O relay retorna um identificador opaco de relay junto com uma permissão de envio com escopo de registro.
- O app para iOS busca a identidade do gateway pareado e a inclui no registro do relay, para que o registro com relay seja delegado a esse gateway específico.
- O app encaminha esse registro com relay ao gateway pareado com
push.apns.register. - O gateway usa esse identificador de relay armazenado para
push.test, ativações em segundo plano e sinais de ativação. - A URL base do relay no gateway deve corresponder à URL do relay incorporada no build oficial/TestFlight do iOS.
- Se o app depois se conectar a um gateway diferente ou a um build com uma URL base de relay diferente, ele atualiza o registro do relay em vez de reutilizar o vínculo antigo.
- Nenhum token de relay para toda a implantação.
- Nenhuma chave APNs direta para envios oficiais/TestFlight com relay.
- Instale o build oficial/TestFlight do iOS.
- Defina
gateway.push.apns.relay.baseUrlno gateway. - Pareie o app com o gateway e deixe-o concluir a conexão.
- O app publica
push.apns.registerautomaticamente depois que tiver um token de APNs, a sessão do operador estiver conectada e o registro no relay for bem-sucedido. - Depois disso,
push.test, ativações de reconexão e sinais de ativação podem usar o registro com relay armazenado.
OPENCLAW_APNS_RELAY_BASE_URLainda funciona como substituição temporária via variável de ambiente para o gateway.
Fluxo de autenticação e confiança
O relay existe para impor duas restrições que APNs direto no gateway não consegue oferecer para builds oficiais de iOS:- Apenas builds genuínos do OpenClaw para iOS distribuídos pela Apple podem usar o relay hospedado.
- Um gateway só pode enviar pushes com relay para dispositivos iOS que tenham sido pareados com esse gateway específico.
-
app para iOS -> gateway- O app primeiro pareia com o gateway pelo fluxo normal de autenticação do Gateway.
- Isso dá ao app uma sessão autenticada de nó e uma sessão autenticada de operador.
- A sessão de operador é usada para chamar
gateway.identity.get.
-
app para iOS -> relay- O app chama os endpoints de registro do relay por HTTPS.
- O registro inclui prova de App Attest e o recibo do app.
- O relay valida o bundle ID, a prova de App Attest e o recibo da Apple, e exige o caminho de distribuição oficial/de produção.
- É isso que impede builds locais de Xcode/dev de usarem o relay hospedado. Um build local pode ser assinado, mas não satisfaz a prova de distribuição oficial da Apple que o relay espera.
-
delegação de identidade do gateway- Antes do registro no relay, o app busca a identidade do gateway pareado em
gateway.identity.get. - O app inclui essa identidade do gateway na carga de registro do relay.
- O relay retorna um identificador de relay e uma permissão de envio com escopo de registro delegados a essa identidade do gateway.
- Antes do registro no relay, o app busca a identidade do gateway pareado em
-
gateway -> relay- O gateway armazena o identificador de relay e a permissão de envio de
push.apns.register. - Em
push.test, ativações de reconexão e sinais de ativação, o gateway assina a solicitação de envio com sua própria identidade de dispositivo. - O relay verifica tanto a permissão de envio armazenada quanto a assinatura do gateway em relação à identidade do gateway delegada no registro.
- Outro gateway não pode reutilizar esse registro armazenado, mesmo que de alguma forma obtenha o identificador.
- O gateway armazena o identificador de relay e a permissão de envio de
-
relay -> APNs- O relay é o proprietário das credenciais de produção do APNs e do token bruto de APNs para o build oficial.
- O gateway nunca armazena o token bruto de APNs para builds oficiais com relay.
- O relay envia o push final ao APNs em nome do gateway pareado.
- Para manter credenciais de produção do APNs fora dos gateways dos usuários.
- Para evitar armazenar tokens brutos de APNs de builds oficiais no gateway.
- Para permitir o uso do relay hospedado apenas para builds oficiais/TestFlight do OpenClaw.
- Para impedir que um gateway envie pushes de ativação para dispositivos iOS pertencentes a outro gateway.
apps/ios/fastlane/.env armazena apenas
autenticação do App Store Connect / TestFlight, como ASC_KEY_ID e ASC_ISSUER_ID; ele não configura
a entrega direta por APNs para builds locais de iOS.
Armazenamento recomendado no host do gateway:
.p8 nem o coloque dentro do checkout do repositório.
Caminhos de descoberta
Bonjour (LAN)
O app para iOS navega em_openclaw-gw._tcp em local. e, quando configurado, no mesmo
domínio de descoberta DNS-SD de área ampla. Gateways na mesma LAN aparecem automaticamente a partir de local.;
a descoberta entre redes pode usar o domínio de área ampla configurado sem alterar o tipo de beacon.
Tailnet (entre redes)
Se o mDNS estiver bloqueado, use uma zona DNS-SD unicast (escolha um domínio; exemplo:openclaw.internal.) e Tailscale split DNS.
Consulte Bonjour para o exemplo com CoreDNS.
Host/porta manual
Em Settings, habilite Manual Host e insira o host + porta do gateway (padrão18789).
Canvas + A2UI
O nó do iOS renderiza um canvas em WKWebView. Usenode.invoke para controlá-lo:
- O host de canvas do Gateway serve
/__openclaw__/canvas/e/__openclaw__/a2ui/. - Ele é servido pelo servidor HTTP do Gateway (mesma porta de
gateway.port, padrão18789). - O nó do iOS navega automaticamente para A2UI ao conectar quando uma URL de host de canvas é anunciada.
- Volte ao scaffold interno com
canvas.navigatee{"url":""}.
Avaliação / snapshot do canvas
Ativação por voz + modo de conversa
- A ativação por voz e o modo de conversa estão disponíveis em Settings.
- O iOS pode suspender o áudio em segundo plano; trate os recursos de voz como melhor esforço quando o app não estiver ativo.
Erros comuns
NODE_BACKGROUND_UNAVAILABLE: traga o app para iOS para o primeiro plano (comandos de canvas/câmera/tela exigem isso).A2UI_HOST_NOT_CONFIGURED: o Gateway não anunciou uma URL de host de canvas; verifiquecanvasHostem Configuração do Gateway.- O prompt de pareamento nunca aparece: execute
openclaw devices liste aprove manualmente. - A reconexão falha após reinstalação: o token de pareamento do Keychain foi limpo; pareie o nó novamente.