ドキュメントに戻る
アーキテクチャ

iOSクライアントアーキテクチャ

Swiftワークフロー、Auth0ログインフロー、デバイスリンクセッション管理。

12分 で読めます

PlanToCode iOSアプリは、リンクされたデスクトップセッションに接続するコンパニオンクライアントです。デスクトップをプライマリプランニングワークスペースとして維持しながら、ターミナル出力、ジョブステータス、音声文字起こしへのモバイルアクセスを提供します。

iOSアプリインターフェース

デバイスリンクとターミナルビューを表示するiOSアプリのスクリーンショット。

PlanToCode iOSアプリのスクリーンショット
Click to expand
iOSアプリスクリーンショットのプレースホルダー。

Swiftパッケージ構造

iOSアプリはSwiftパッケージに整理されています:

Core

mobile/ios/Core/

ビジネスロジックとAPIクライアント

  • WorkflowManager
  • APIClient
  • MobileSessionManager
  • DeviceLinkClient

Security

mobile/ios/Security/

認証と資格情報ストレージ

  • Auth0Manager
  • KeychainHelper
  • TokenStore

VibeUI

mobile/ios/VibeUI/

SwiftUIコンポーネントとデザインシステム

  • TerminalView
  • JobListView
  • SettingsView
  • DeviceLinkView

Auth0 PKCE統合

iOSアプリはセキュアな認証のためにAuth0とPKCEフローを使用します:

Authentication Flow

  1. ユーザーがサインインをタップ、アプリがコード検証子とチャレンジを生成
  2. ASWebAuthenticationSessionがAuth0ログインページを開く
  3. ユーザーが認証、Auth0が認可コードでリダイレクト
  4. アプリがコード検証子を使用してコードをトークンに交換
  5. トークンはiOS Keychainに安全に保存

トークン管理

  • アクセストークンはAPIリクエストに使用
  • リフレッシュトークンはサイレント更新用に保存
  • 有効期限前にトークン更新がトリガー
  • ログアウト時にKeychainからすべてのトークンをクリア

WebSocketリレー経由のデバイスリンク

iOSはサーバーのWebSocketリレーを通じてデスクトップセッションに接続します:

リンクプロトコル

  1. デスクトップがリンクコードを生成しQRを表示
  2. iOSがQRをスキャンまたはコードを手動入力
  3. 両方が資格情報で/ws/device-linkに接続
  4. サーバーが検証しリレーを確立
  5. 双方向通信が有効化

メッセージタイプ

  • terminal_output: デスクトップターミナルからのPTY出力
  • job_status: バックグラウンドジョブステータス更新
  • session_sync: セッション状態同期
  • rpc_command: モバイルからデスクトップへのコマンド

再接続処理

WebSocket接続は自動再接続、指数バックオフ、セッション状態回復でネットワーク中断を処理します。

RPCコマンドルーティング

iOSはリンクされたデスクトップにコマンドを送信できます:

サポートされるコマンド

  • send_terminal_input: ターミナルにキーストロークを送信
  • request_job_status: 特定ジョブのステータスを取得
  • start_voice_transcription: モバイルで録音を開始
  • sync_session: 完全なセッション状態をリクエスト

実装

コマンドはWebSocket経由で送信されるJSON-RPCメッセージです。デスクトップはコマンドを検証し、結果を非同期で返します。

オフラインアクションキュー

切断中に実行されたアクションは同期用にキューに入れられます:

キューアーキテクチャ

  • アクションはローカルSQLiteデータベースに保存
  • 再接続時にキューを処理
  • サーバータイムスタンプで競合を解決
  • 失敗したアクションをユーザーに報告

サポートされるオフラインアクション

  • 音声文字起こし録音(ローカルに保存)
  • セッションメモと注釈
  • 設定変更

SQLiteローカルストレージ

iOSはローカル永続化にSQLiteを使用します:

データベーススキーマ

~/Documents/plantocode.sqlite
  • linked_devices: デスクトップ接続
  • offline_queue: 保留中の同期アクション
  • cached_sessions: 最近のセッションデータ
  • transcriptions: ローカル音声録音

マイグレーション

スキーマバージョンはuser_version pragmaで追跡。マイグレーションはアプリ起動時に実行されます。

モバイルセッション

MobileSessionManagerがセッション状態を調整します:

Session Lifecycle

  1. 起動時に最後のアクティブセッションをロード
  2. 利用可能な場合はリンクされたデスクトップに接続
  3. WebSocket経由でセッション更新をサブスクライブ
  4. オフラインアクセス用にセッションデータをキャッシュ

ワークフローエントリーポイント

モバイルからアクセス可能な主要ワークフロー:

  • ターミナル監視: 出力を表示、入力を送信
  • ジョブステータス: バックグラウンドジョブの進行状況を追跡
  • 音声キャプチャ: モバイルで録音と文字起こし
  • セッションブラウジング: プランと履歴を確認

リージョン設定

iOSはAPIルーティングのユーザーリージョン設定を尊重します:

リージョンはUserDefaultsに保存され、すべてのリクエストでapi-eu.plantocode.comまたはapi-us.plantocode.comの選択に使用されます。