機能
- WebSocket 経由で Gateway に接続します(LAN または tailnet)。
- ノード機能を公開します: Canvas、Screen snapshot、Camera capture、Location、Talk mode、Voice wake。
node.invokeコマンドを受信し、ノードステータスイベントを報告します。- Agents サーフェス(Files)から、選択したエージェントのワークスペースを読み取り専用で閲覧します: ディレクトリのドリルダウン、シンタックスハイライト付きテキストプレビュー、画像プレビュー、共有シートへのエクスポート。書き込み操作はありません。プレビューは gateway によってサイズ制限されます。
- ペアリング済み gateway ごとに、最近のチャットセッションとトランスクリプトの小さな読み取り専用オフラインキャッシュを保持します: コールドオープンでは最後に認識されているトランスクリプトを即座に描画し、gateway が応答すると更新します。最近のチャットは切断中も閲覧可能で、リセット/忘れる操作により保護されたローカルキャッシュが消去されます。
- 切断中に送信されたテキストメッセージを、gateway ごとの永続的な送信箱にキューイングします(最大 50 件): キュー内の吹き出しはトランスクリプトに表示され、再接続時に順番どおり冪等なリトライでフラッシュされ、正規の履歴で送信が確認されるまで永続化され、リトライ/削除アクションを表示する前にバックオフ付きで再試行し、48 時間オフラインの後は送信せず期限切れになります。リセット/忘れる操作では、キャッシュとともにキューもクリアされます。
- 必要に応じてアシスタントメッセージを読み上げます: Chat でメッセージを長押しし、Listen を選択します。アプリは、設定済みの TTS プロバイダーで対応 Gateway の
tts.speakクリップを再生し、Gateway 音声が利用できない、または再生できない場合はデバイス上の音声にフォールバックします。セッション切り替えまたはバックグラウンド化で再生は停止します。
要件
- 別のデバイス(macOS、Linux、または WSL2 経由の Windows)で Gateway が実行されていること。
- ネットワーク経路:
- Bonjour 経由の同一 LAN、または
- ユニキャスト DNS-SD 経由の Tailnet(ドメイン例:
openclaw.internal.)、または - 手動ホスト/ポート(フォールバック)。
クイックスタート(ペアリング + 接続)
- スマートフォンから到達できるルートで、認証済み Gateway を起動します。Tailscale Serve が推奨されるリモート経路です:
gateway.bind: "lan"
を使用します。デフォルトのループバックバインドはスマートフォンから到達できません。
Gateway がまだ構成されていない場合は、まず openclaw onboard を実行して、setup-code
の作成でトークンまたはパスワード認証経路を利用できるようにします。
- Control UI を開き、Nodes を選択して、 Devices カードの Pair mobile device をクリックします。
- iOS アプリで、Settings -> Gateway を開き、QR コードをスキャンする(または セットアップコードを貼り付ける)ことで接続します。 セットアップコードに LAN と Tailscale Serve の両方のルートが含まれている場合、アプリは それらを順番にプローブし、最初に到達可能なエンドポイントを保存します。
- 公式アプリは自動的に接続します。Devices に保留中の リクエストが表示される場合は、承認前にそのロールとスコープを確認します。
operator.admin を持つペアリング済みセッションが必要です。
ターミナルのフォールバックとして、iOS アプリで検出済み gateway を選択する(または
Manual Host を有効にしてホスト/ポートを入力する)し、Gateway ホストでリクエストを承認します:
requestId が作成されます。承認前に openclaw devices list を再度実行します。
任意: iOS ノードが常に厳密に制御されたサブネットから接続する場合、明示的な CIDR または正確な IP を指定して、初回ノード自動承認をオプトインできます:
role: node ペアリングにのみ適用されます。Operator/browser ペアリング、およびロール、スコープ、メタデータ、公開鍵の変更はいずれも、引き続き手動承認が必要です。
- 接続を確認します:
公式ビルドの Relay-backed push
公式配布 iOS ビルドは、raw APNs トークンを gateway に公開する代わりに、外部 push relay を使用します。公開リリースレーンからの公式 App Store ビルドは、https://ios-push-relay.openclaw.ai のホスト型 relay を使用します。このベース URL は App Store 配布用にハードコードされており、どのオーバーライドも読み取りません。
カスタム relay デプロイには、relay URL が gateway relay URL と一致する、意図的に分離された iOS ビルド/デプロイ経路が必要です。App Store リリースレーンでは、カスタム relay URL は決して受け入れられません。カスタム relay ビルドを使用している場合は、一致する gateway relay URL を設定します:
- iOS アプリは App Attest と StoreKit app transaction JWS を使用して relay に登録します。
- relay は不透明な relay handle と、登録スコープの send grant を返します。
- iOS アプリはペアリング済み gateway identity(
gateway.identity.get)を取得し、relay 登録に含めるため、relay-backed registration はその特定の gateway に委任されます。 - アプリはその relay-backed registration を
push.apns.registerでペアリング済み gateway に転送します。 - gateway は保存された relay handle を
push.test、バックグラウンドウェイク、wake nudges に使用します。 - アプリが後で別の gateway または異なる relay base URL のビルドに接続した場合、古いバインディングを再利用せず relay 登録を更新します。
- 公式 iOS アプリをインストールします。
- 任意: 意図的に分離されたカスタム relay ビルドを使用している場合にのみ、gateway に
gateway.push.apns.relay.baseUrlを設定します。 - アプリを gateway にペアリングし、接続完了まで待ちます。
- アプリは APNs token を取得し、operator session が接続され、relay 登録が成功すると、
push.apns.registerを公開します。 - その後、
push.test、再接続ウェイク、wake nudges は保存済みの relay-backed registration を使用できます。
バックグラウンド alive ビーコン
iOS が silent push、background refresh、または significant-location event でアプリを起こすと、アプリは短いノード再接続を試み、その後event: "node.presence.alive" で node.event を呼び出します。gateway は、認証済みノードデバイス identity が判明した後にのみ、ペアリング済みノード/デバイス metadata にこれを lastSeenAtMs/lastSeenReason として記録します。
アプリは、gateway response に handled: true が含まれる場合にのみ、background wake が正常に記録されたものとして扱います。古い gateway は { "ok": true } で node.event を確認応答する場合があります。この response は互換性がありますが、永続的な last-seen update としてはカウントされません。
互換性メモ:
OPENCLAW_APNS_RELAY_BASE_URLは、gateway の一時的な env override として引き続き機能します(gateway.push.apns.relay.baseUrlが config-first の経路です)。- App Store リリースビルドの push mode はホスト型 relay host をハードコードしており、relay-URL override を決して読み取りません。
OPENCLAW_PUSH_RELAY_BASE_URLbuild-time env var は、local/sandbox iOS build modes にのみ影響します。
認証と信頼フロー
relay は、公式 iOS ビルドに対して direct APNs-on-gateway では提供できない 2 つの制約を強制するために存在します:- Apple を通じて配布された正規の OpenClaw iOS ビルドだけが、ホスト型 relay を使用できます。
- gateway は、その特定の gateway とペアリングした iOS デバイスに対してのみ relay-backed push を送信できます。
iOS app -> gateway: アプリは通常の Gateway auth flow を通じて gateway とペアリングし、認証済みノードセッションと認証済みオペレーターセッションを取得します。オペレーターセッションはgateway.identity.getを呼び出します。iOS app -> relay: アプリは App Attest proof と StoreKit app transaction JWS を使用し、HTTPS 経由で relay registration endpoints を呼び出します。relay は bundle ID、App Attest proof、Apple distribution proof を検証し、official/production distribution path を要求します。これにより、local Xcode/dev builds は official Apple distribution proof を満たせないため、hosted relay を使用できません。gateway identity delegation: relay 登録の前に、アプリはgateway.identity.getからペアリング済み gateway identity を取得し、relay registration payload に含めます。relay は、その gateway identity に委任された relay handle と registration-scoped send grant を返します。gateway -> relay: gateway はpush.apns.registerから relay handle と send grant を保存します。push.test、再接続ウェイク、wake nudges では、gateway が自身の device identity で送信リクエストに署名します。relay は、保存された send grant と gateway signature の両方を、登録時に委任された gateway identity に照らして検証します。別の gateway は、たとえ何らかの方法で handle を取得したとしても、その保存済み登録を再利用できません。relay -> APNs: relay は production APNs credentials と公式ビルド用の raw APNs token を所有します。gateway は relay-backed 公式ビルドの raw APNs token を保存しません。relay はペアリング済み gateway に代わって最終的な push を APNs に送信します。
apps/ios/fastlane/.env は APP_STORE_CONNECT_KEY_ID や APP_STORE_CONNECT_ISSUER_ID などの App Store Connect auth のみを保存します。local iOS builds の direct APNs delivery は構成しません。
~/.openclaw/credentials/ 配下の他の provider credentials と整合する、推奨 gateway-host storage:
.p8 ファイルをコミットしたり、repo checkout 配下に置いたりしないでください。
検出経路
Bonjour(LAN)
iOS アプリはlocal. 上の _openclaw-gw._tcp と、構成されている場合は同じ wide-area DNS-SD discovery domain を参照します。同一 LAN の gateway は local. から自動的に表示されます。クロスネットワーク検出では、beacon type を変更せずに構成済みの wide-area domain を使用できます。
Tailnet(クロスネットワーク)
mDNS がブロックされている場合は、ユニキャスト DNS-SD ゾーン(ドメインを選択、例:openclaw.internal.)と Tailscale split DNS を使用します。CoreDNS の例については Bonjour を参照してください。
手動ホスト/ポート
Settings で Manual Host を有効にし、gateway host + port(デフォルト18789)を入力します。
複数の gateway
アプリはペアリングしたすべての gateway のレジストリを保持するため、再度ペアリングせずに切り替えられます:- 設定 -> Gateway には、アクティブなGatewayがマークされた ペアリング済みGateway リストが表示されます。項目をタップすると切り替わります。アプリは現在のセッションを終了し、選択したGatewayへ再接続します。複数のGatewayがペアリングされている場合、接続行の横にクイック切り替えメニューが表示されます。
- 認証情報、TLS 信頼判断、Gatewayごとの設定、キャッシュされたチャット履歴はGatewayごとに保存されます。切り替えてもGateway間で状態が混ざることはなく、プッシュ登録はアクティブなGatewayに従います。
- ペアリング済みGatewayをスワイプするか、コンテキストメニューを使用して 忘れる を選択すると、その認証情報、デバイストークン、TLS ピン、キャッシュされたチャットが削除されます。
- 検出されたGatewayへ切り替えるには、そのGatewayがネットワーク上で見えている必要があります。手動Gatewayは保存済みのホストとポートで再接続します。
Canvas + A2UI
iOS ノードは WKWebView canvas をレンダリングします。操作するにはnode.invoke を使用します。
- Gateway canvas ホストは、Gateway HTTP サーバー(
gateway.portと同じポート、デフォルトは18789)から/__openclaw__/canvas/と/__openclaw__/a2ui/を提供します。 - iOS ノードは、接続時のデフォルトビューとして組み込みスキャフォールドを保持します。
canvas.a2ui.pushとcanvas.a2ui.resetは、バンドルされたアプリ所有の A2UI ページを使用します。 - リモートGateway A2UI ページは iOS ではレンダリング専用です。ネイティブ A2UI ボタンアクションは、バンドルされたアプリ所有ページからのものだけが受け付けられます。
- 組み込みスキャフォールドに戻るには、
canvas.navigateと{"url":""}を使用します。
Computer Use との関係
iOS アプリはモバイルノードサーフェスであり、Codex Computer Use バックエンドではありません。Codex Computer Use とcua-driver mcp は、MCP ツールを通じてローカルの macOS デスクトップを制御します。iOS アプリは、canvas.*、camera.*、screen.*、location.*、talk.* などの OpenClaw ノードコマンドを通じて iPhone の機能を公開します。
エージェントはノードコマンドを呼び出すことで、OpenClaw 経由で iOS アプリを操作できますが、これらの呼び出しはGatewayノードプロトコルを通り、iOS のフォアグラウンド/バックグラウンド制限に従います。ローカルデスクトップ制御には Codex Computer Use を使用し、iOS ノード機能についてはこのページを使用してください。
Canvas eval / snapshot
音声ウェイク + talk モード
- 音声ウェイクと talk モードは設定で利用できます。
- OpenAI realtime Talk は、
talk.realtime.transportがwebrtcの場合、クライアント所有の WebRTC を使用します。明示的なgateway-relay設定は引き続きGateway所有です。Talk モードを参照してください。 - Talk 対応 iOS ノードは
talkcapability を公開し、talk.ptt.start、talk.ptt.stop、talk.ptt.cancel、talk.ptt.onceを宣言できます。Gateway は、信頼された Talk 対応ノードに対して、これらのプッシュツートークコマンドをデフォルトで許可します。 - iOS はバックグラウンド音声を一時停止する場合があります。アプリがアクティブでない場合、音声機能はベストエフォートとして扱ってください。
よくあるエラー
NODE_BACKGROUND_UNAVAILABLE: iOS アプリをフォアグラウンドにしてください(canvas/camera/screen コマンドにはこれが必要です)。A2UI_HOST_UNAVAILABLE: バンドルされた A2UI ページにアプリの WebView から到達できませんでした。アプリを Screen タブでフォアグラウンドにしたまま再試行してください。- ペアリングプロンプトが表示されない:
openclaw devices listを実行し、手動で承認してください。 - Watch に iPhone の状態が表示されない:
watch.statusで iPhone がwatchPaired: trueおよびwatchAppInstalled: trueを報告していることを確認してください。ペアリングが false の場合は、Apple の Watch アプリで Watch をペアリングしてください。インストールが false の場合は、My Watch -> Available Apps からコンパニオンをインストールしてください。どちらかを変更した後、Watch で OpenClaw を一度開いてください。即時到達性には引き続き両方のアプリが実行中である必要がありますが、 キューに入った更新は後でバックグラウンドで届く場合があります。 - 再インストール後に再接続に失敗する: Keychain のペアリングトークンがクリアされています。ノードを再ペアリングしてください。