iOS App (вузол)
Доступність: внутрішнє preview. iOS-застосунок ще не розповсюджується публічно.Що він робить
- Підключається до Gateway через WebSocket (LAN або tailnet).
- Надає можливості вузла: Canvas, знімок екрана, захоплення з камери, геолокація, режим розмови, Voice wake.
- Отримує команди
node.invokeі повідомляє події стану вузла.
Вимоги
- Gateway запущений на іншому пристрої (macOS, Linux або Windows через WSL2).
- Мережевий шлях:
- Та сама LAN через Bonjour, або
- Tailnet через unicast DNS-SD (приклад домену:
openclaw.internal.), або - Ручне задання host/port (резервний варіант).
Швидкий старт (pair + connect)
- Запустіть Gateway:
- У застосунку iOS відкрийте Settings і виберіть знайдений gateway (або ввімкніть Manual Host і введіть host/port).
- Схваліть запит pairing на хості шлюзу:
requestId.
Перед схваленням знову виконайте openclaw devices list.
- Перевірте підключення:
Push через relay для офіційних збірок
Офіційні розповсюджувані збірки iOS використовують зовнішній push relay замість публікації сирого токена APNs у шлюз. Вимога на боці Gateway:- iOS-застосунок реєструється в relay за допомогою App Attest і receipt застосунку.
- Relay повертає непрозорий relay handle разом із send grant, обмеженим областю реєстрації.
- iOS-застосунок отримує ідентичність pair-ованого gateway і включає її в реєстрацію relay, тож relay-backed реєстрація делегується саме цьому gateway.
- Застосунок передає цю relay-backed реєстрацію pair-ованому gateway через
push.apns.register. - Gateway використовує збережений relay handle для
push.test, фонових пробуджень і wake nudges. - Base URL relay шлюзу має збігатися з URL relay, вбудованим в офіційну/TestFlight збірку iOS.
- Якщо застосунок пізніше підключиться до іншого gateway або до збірки з іншим base URL relay, він оновить relay-реєстрацію замість повторного використання старої прив’язки.
- Жодного relay-токена для всього розгортання.
- Жодного прямого ключа APNs для relay-backed надсилання в офіційних/TestFlight збірках.
- Встановіть офіційну/TestFlight збірку iOS.
- Задайте
gateway.push.apns.relay.baseUrlна шлюзі. - Pair-уйте застосунок зі шлюзом і дочекайтеся завершення підключення.
- Застосунок автоматично публікує
push.apns.register, щойно матиме токен APNs, сесію оператора буде підключено, а реєстрація relay завершиться успішно. - Після цього
push.test, пробудження для перепідключення та wake nudges зможуть використовувати збережену relay-backed реєстрацію.
OPENCLAW_APNS_RELAY_BASE_URLяк і раніше працює як тимчасове перевизначення env для gateway.
Потік автентифікації та довіри
Relay існує, щоб забезпечити дві умови, які прямий APNs-on-gateway не може надати для офіційних збірок iOS:- Лише справжні збірки OpenClaw для iOS, розповсюджені через Apple, можуть використовувати hosted relay.
- Gateway може надсилати relay-backed push лише для iOS-пристроїв, які виконали pairing саме з цим gateway.
-
iOS app -> gateway- Спочатку застосунок виконує pairing зі шлюзом через звичайний потік автентифікації Gateway.
- Це дає застосунку автентифіковану сесію вузла та автентифіковану сесію оператора.
- Сесія оператора використовується для виклику
gateway.identity.get.
-
iOS app -> relay- Застосунок викликає кінцеві точки реєстрації relay через HTTPS.
- Реєстрація включає App Attest proof і receipt застосунку.
- Relay перевіряє bundle ID, App Attest proof і Apple receipt та вимагає офіційний/production шлях розповсюдження.
- Саме це блокує локальні Xcode/dev збірки від використання hosted relay. Локальна збірка може бути підписана, але вона не задовольняє вимогу офіційного підтвердження розповсюдження через Apple, яку очікує relay.
-
делегування ідентичності gateway- Перед реєстрацією relay застосунок отримує ідентичність pair-ованого gateway через
gateway.identity.get. - Застосунок включає цю ідентичність gateway у payload реєстрації relay.
- Relay повертає relay handle і send grant, обмежений областю реєстрації, делеговані цій ідентичності gateway.
- Перед реєстрацією relay застосунок отримує ідентичність pair-ованого gateway через
-
gateway -> relay- Gateway зберігає relay handle і send grant з
push.apns.register. - Для
push.test, пробуджень перепідключення і wake nudges gateway підписує запит на надсилання власною ідентичністю пристрою. - Relay перевіряє і збережений send grant, і підпис gateway щодо делегованої ідентичності gateway з реєстрації.
- Інший gateway не може повторно використати цю збережену реєстрацію, навіть якщо якимось чином отримає handle.
- Gateway зберігає relay handle і send grant з
-
relay -> APNs- Relay володіє production-обліковими даними APNs і сирим токеном APNs для офіційної збірки.
- Gateway ніколи не зберігає сирий токен APNs для relay-backed офіційних збірок.
- Relay надсилає фінальний push до APNs від імені pair-ованого gateway.
- Щоб production-облікові дані APNs не потрапляли на шлюзи користувачів.
- Щоб не зберігати сирі токени APNs офіційних збірок на gateway.
- Щоб дозволити використання hosted relay лише для офіційних/TestFlight збірок OpenClaw.
- Щоб один gateway не міг надсилати push-пробудження на iOS-пристрої, що належать іншому gateway.
apps/ios/fastlane/.env зберігає лише
облікові дані App Store Connect / TestFlight, такі як ASC_KEY_ID і ASC_ISSUER_ID; він не налаштовує
пряму доставку APNs для локальних збірок iOS.
Рекомендоване зберігання на хості gateway:
.p8 і не розміщуйте його в checkout репозиторію.
Шляхи виявлення
Bonjour (LAN)
iOS-застосунок шукає_openclaw-gw._tcp у local. і, якщо налаштовано, у тому самому
домені wide-area DNS-SD discovery. Gateway у тій самій LAN автоматично з’являються через local.;
міжмережеве виявлення може використовувати налаштований wide-area домен без зміни типу beacon.
Tailnet (міжмережевий)
Якщо mDNS заблоковано, використовуйте зону unicast DNS-SD (виберіть домен; приклад:openclaw.internal.) і Tailscale split DNS.
Див. Bonjour для прикладу CoreDNS.
Ручний host/port
У Settings увімкніть Manual Host і введіть host шлюзу + port (типово18789).
Canvas + A2UI
iOS-вузол рендерить canvas у WKWebView. Використовуйтеnode.invoke, щоб керувати ним:
- Canvas host Gateway обслуговує
/__openclaw__/canvas/і/__openclaw__/a2ui/. - Він обслуговується HTTP-сервером Gateway (той самий port, що й
gateway.port, типово18789). - iOS-вузол автоматично переходить до A2UI під час підключення, коли рекламується URL canvas host.
- Поверніться до вбудованого scaffold за допомогою
canvas.navigateі{"url":""}.
Canvas eval / snapshot
Voice wake + talk mode
- Voice wake і режим розмови доступні в Settings.
- iOS може призупиняти фонове аудіо; розглядайте голосові функції як best-effort, коли застосунок не активний.
Поширені помилки
NODE_BACKGROUND_UNAVAILABLE: переведіть iOS-застосунок на передній план (команди canvas/camera/screen цього потребують).A2UI_HOST_NOT_CONFIGURED: Gateway не оголосив URL canvas host; перевіртеcanvasHostу конфігурації Gateway.- Запит pairing ніколи не з’являється: виконайте
openclaw devices listі схваліть його вручну. - Повторне підключення не працює після перевстановлення: токен pairing у Keychain було очищено; виконайте pairing вузла знову.