문서로 돌아가기
아키텍처

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 앱은 보안 인증을 위해 PKCE 흐름과 함께 Auth0를 사용합니다:

Authentication Flow

  1. 사용자가 로그인을 탭하면 앱이 코드 검증자와 챌린지를 생성
  2. ASWebAuthenticationSession이 Auth0 로그인 페이지를 열음
  3. 사용자가 인증하면 Auth0가 인증 코드와 함께 리디렉션
  4. 앱이 코드 검증자를 사용하여 코드를 토큰으로 교환
  5. 토큰이 iOS 키체인에 안전하게 저장됨

토큰 관리

  • API 요청에 사용되는 액세스 토큰
  • 자동 갱신을 위해 저장된 리프레시 토큰
  • 만료 전에 토큰 갱신 트리거
  • 로그아웃 시 키체인에서 모든 토큰 삭제

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을 선택하는 데 사용됩니다.