iOSアプリ(ノード)
提供状況: 内部プレビュー。iOSアプリはまだ一般公開されていません。できること
- WebSocket経由でGatewayに接続する(LANまたはtailnet)。
- ノード機能を提供する: Canvas、画面スナップショット、カメラキャプチャ、位置情報、Talk mode、Voice wake。
node.invokeコマンドを受信し、ノード状態イベントを報告する。
要件
- 別のデバイス上で動作しているGateway(macOS、Linux、またはWSL2経由のWindows)。
- ネットワーク経路:
- 同じLAN上でBonjourを使用、または
- ユニキャストDNS-SD経由のtailnet(ドメイン例:
openclaw.internal.)、または - 手動のホスト/ポート指定(フォールバック)。
クイックスタート(ペアリング + 接続)
- Gatewayを起動します:
- iOSアプリでSettingsを開き、検出されたgatewayを選択します(またはManual Hostを有効にしてhost/portを入力します)。
- Gatewayホスト上でペアリングリクエストを承認します:
requestId が作成されます。
承認前にもう一度 openclaw devices list を実行してください。
- 接続を確認します:
公式ビルド向けのrelayベースpush
公式に配布されるiOSビルドでは、生のAPNs トークンをgatewayへ公開する代わりに、外部push relayを使用します。 Gateway側の要件:- iOSアプリはApp Attestとアプリレシートを使用してrelayに登録します。
- relayは、不透明なrelay handleと、登録スコープのsend grantを返します。
- iOSアプリはペアリング済みgateway identityを取得し、それをrelay登録に含めることで、そのrelayベース登録をその特定のgatewayに委譲します。
- アプリは、そのrelayベース登録を
push.apns.registerでペアリング済みGatewayへ転送します。 - Gatewayは、
push.test、バックグラウンドwake、wake nudgeに対して、その保存されたrelay handleを使用します。 - Gateway relay base URLは、公式/TestFlight iOSビルドに組み込まれたrelay URLと一致している必要があります。
- 後でアプリが別のGatewayや、異なるrelay base URLを持つビルドに接続した場合、古い紐付けを再利用するのではなく、relay登録を更新します。
- デプロイ全体で共通のrelayトークンは不要。
- 公式/TestFlightのrelayベース送信に直接のAPNsキーは不要。
- 公式/TestFlight iOSビルドをインストールします。
- gatewayで
gateway.push.apns.relay.baseUrlを設定します。 - アプリをgatewayにペアリングし、接続完了まで待ちます。
- APNsトークンがあり、operatorセッションが接続済みで、relay登録が成功した後、アプリは自動的に
push.apns.registerを公開します。 - その後、
push.test、再接続wake、wake nudgeで、保存されたrelayベース登録を使用できます。
OPENCLAW_APNS_RELAY_BASE_URLは、gatewayの一時的なenvオーバーライドとして引き続き使用できます。
認証と信頼のフロー
relayが存在するのは、公式iOSビルドに対して直接APNs-on-gatewayでは提供できない2つの制約を 強制するためです:- Apple経由で配布された真正なOpenClaw iOSビルドだけがホスト型relayを使用できる。
- Gatewayは、その特定の gatewayとペアリングしたiOSデバイスに対してのみrelayベースpushを送信できる。
-
iOS app -> gateway- アプリはまず通常のGateway認証フローを通じてgatewayとペアリングします。
- これにより、アプリは認証済みノードセッションと認証済みoperatorセッションを取得します。
- operatorセッションは
gateway.identity.getの呼び出しに使用されます。
-
iOS app -> relay- アプリはHTTPS経由でrelay登録エンドポイントを呼び出します。
- 登録にはApp Attestの証明とアプリレシートが含まれます。
- relayはbundle ID、App Attest証明、Appleレシートを検証し、 公式/本番の配布経路を要求します。
- これにより、ローカルのXcode/devビルドはホスト型relayを使用できません。ローカルビルドは 署名されている場合がありますが、relayが要求する公式なApple配布証明を満たしません。
-
gateway identity delegation- relay登録前に、アプリは
gateway.identity.getからペアリング済みgateway identityを取得します。 - アプリはそのgateway identityをrelay登録ペイロードに含めます。
- relayは、そのgateway identityに委譲されたrelay handleと登録スコープのsend grantを返します。
- relay登録前に、アプリは
-
gateway -> relay- Gatewayは、
push.apns.registerからrelay handleとsend grantを保存します。 push.test、再接続wake、wake nudgeでは、Gatewayは 自身のdevice identityで送信リクエストに署名します。- relayは、保存済みsend grantとGateway署名の両方を、登録時に委譲された gateway identityに対して検証します。
- たとえ別のGatewayがそのhandleを何らかの形で取得したとしても、その保存済み登録を再利用することはできません。
- Gatewayは、
-
relay -> APNs- relayは、本番APNs認証情報と、公式ビルド用の生のAPNsトークンを保持します。
- Gatewayは、relayベースの公式ビルドに対して生のAPNsトークンを保存しません。
- relayは、ペアリング済みGatewayを代理して最終的なpushをAPNsへ送信します。
- 本番APNs認証情報をユーザーのgatewayから切り離すため。
- 公式ビルドの生のAPNsトークンをgatewayに保存しないようにするため。
- 公式/TestFlightのOpenClawビルドに対してのみホスト型relay利用を許可するため。
- あるgatewayが、別のgatewayに属するiOSデバイスへwake pushを送れないようにするため。
apps/ios/fastlane/.env には
ASC_KEY_ID や ASC_ISSUER_ID のようなApp Store Connect / TestFlight認証のみが保存され、
ローカルiOSビルド向けの直接APNs配信は設定しません。
推奨されるgateway-hostでの保存方法:
.p8 ファイルをコミットしたり、リポジトリのチェックアウト配下に置いたりしないでください。
検出経路
Bonjour(LAN)
iOSアプリはlocal. 上の _openclaw-gw._tcp をブラウズし、設定されている場合は同じ
広域DNS-SD検出ドメインもブラウズします。同じLAN上のGatewayは local. から自動的に表示されます。
ネットワークをまたぐ検出では、ビーコン種別を変更せずに、設定済みの広域ドメインを使用できます。
tailnet(ネットワークをまたぐ場合)
mDNSがブロックされている場合は、ユニキャストDNS-SDゾーン(ドメインを選択。例:openclaw.internal.)とTailscale split DNSを使用します。
CoreDNSの例については Bonjour を参照してください。
手動host/port
Settingsで Manual Host を有効にし、gatewayのhost + port(デフォルト18789)を入力します。
Canvas + A2UI
iOSノードはWKWebView canvasをレンダリングします。これを操作するにはnode.invoke を使います:
- Gateway canvas hostは
/__openclaw__/canvas/と/__openclaw__/a2ui/を提供します。 - これはGateway HTTPサーバーから配信されます(
gateway.portと同じポート。デフォルト18789)。 - iOSノードは、canvas host URLが通知されると接続時に自動でA2UIへ移動します。
canvas.navigateと{"url":""}で組み込みscaffoldに戻れます。
Canvas eval / snapshot
Voice wake + Talk mode
- Voice wakeとTalk modeはSettingsで利用できます。
- iOSではバックグラウンド音声が中断される場合があるため、アプリがアクティブでないときの音声機能はベストエフォートとして扱ってください。
よくあるエラー
NODE_BACKGROUND_UNAVAILABLE: iOSアプリをフォアグラウンドにしてください(canvas/camera/screenコマンドには必要です)。A2UI_HOST_NOT_CONFIGURED: Gatewayがcanvas host URLを通知していません。 Gateway configuration のcanvasHostを確認してください。- ペアリングプロンプトが表示されない:
openclaw devices listを実行して手動で承認してください。 - 再インストール後に再接続できない: Keychainのペアリングトークンが消去されています。ノードを再ペアリングしてください。