Apple Watch에서 손 제스처와 음성으로 AI에게 질문하고, 실시간 스트리밍 답변을 받아보세요.
Qiri는 iOS + watchOS 듀얼 플랫폼 AI 어시스턴트 앱입니다. Apple Watch의 AssistiveTouch(손 제스처) 기능을 활용하여 손목 위에서 음성으로 질문하면, AI가 실시간으로 답변을 스트리밍해 줍니다.
- 음성 질문 입력 — 탭 한 번으로 음성 인식을 시작하고, 말로 질문
- 실시간 스트리밍 답변 — AI의 사고 과정(Thinking)과 최종 답변을 실시간으로 표시
- 단어별 스트리밍 애니메이션 — 답변이 한 단어씩 자연스럽게 나타나는 UI
- 현재 시각 표시 — 메인 화면에서 한국 시간(Asia/Seoul) 실시간 표시
- 온보딩 가이드 — 처음 사용자를 위한 3단계 온보딩 화면
- 자동 재시도 — 네트워크 오류 시 최대 3회 자동 재시도 (2초 간격)
- Apple 로그인 — Apple ID를 통한 간편 인증
- 이용약관 동의 및 디바이스 등록 — 최초 실행 시 약관 동의 후 자동 등록
- 사용 가이드 제공 — 총 4종의 상세 튜토리얼:
- AssistiveTouch 활성화 방법 (4단계)
- AssistiveTouch 제스처 커스텀 설정 (7단계)
- Qiri 사용법 (4단계)
- iOS 단축어 연동 설정 (5단계)
- 사용자 프로필 — 이메일 확인 및 로그아웃
- WatchConnectivity 기반 실시간 양방향 통신
- Apple User ID 자동 동기화
- 디바이스 등록 상태 공유
- 백그라운드 동기화 (Application Context) 지원
스플래시 → 온보딩(3단계) → 메인(시계) → 음성 질문 → AI 사고 표시 → 답변 확인 → 전체 답변 보기
스플래시 → Apple 로그인 → 이용약관 동의 → 메인(가이드 허브) → 각종 튜토리얼 / 사용자 프로필
| 분류 | 기술 |
|---|---|
| UI | SwiftUI |
| 인증 | AuthenticationServices (Apple Sign-In) |
| 네트워크 | URLSession (SSE 스트리밍), Moya |
| Watch 연동 | WatchConnectivity (WCSession) |
| 아키텍처 | MVVM, NotificationCenter 기반 이벤트 드리븐 상태 머신 |
| 데이터 저장 | UserDefaults |
| 최소 지원 | iOS 16.0+ / watchOS 9.0+ |
Qiri-main/
├── Qiri/ # iOS 앱
│ ├── App/
│ │ ├── QiriApp.swift # 앱 진입점
│ │ └── RootView.swift # 상태 머신 (splash→login→conditions→main)
│ ├── Feature/
│ │ ├── Login/ # Apple 로그인
│ │ ├── Splash/ # 스플래시 화면
│ │ ├── Main/ # 메인 허브 (가이드 목록)
│ │ ├── Conditions/ # 이용약관 동의
│ │ ├── User/ # 사용자 프로필
│ │ ├── More/ # 전체 가이드 목록
│ │ └── Learn/ # 튜토리얼 가이드
│ │ ├── Assistive/ # - AssistiveTouch 활성화
│ │ ├── CustomView/ # - 제스처 커스텀 설정
│ │ ├── QiriGuide/ # - Qiri 사용법
│ │ └── ShortcutView/ # - 단축어 연동
│ └── Model/Core/
│ ├── Network/ # API 통신 (Moya, AuthService)
│ └── Extension/ # Color, Date 확장
│
├── Qiri Watch App/ # watchOS 앱
│ ├── App/
│ │ ├── QiriApp.swift # Watch 앱 진입점
│ │ └── RootView.swift # 상태 머신 (splash→onboarding→main→질문→답변)
│ ├── Feature/
│ │ ├── Splash/ # 스플래시
│ │ ├── Onboarding/ # 온보딩 (3단계)
│ │ ├── Main/ # 메인 (시계 + 질문 시작)
│ │ ├── Question/ # 음성 질문 입력
│ │ ├── Thinking/ # AI 사고 과정 표시
│ │ └── Answer/ # 답변 표시 + 전체 답변
│ └── Model/Core/
│ ├── Service/ # WatchSession + 스트리밍 처리
│ └── Extension/ # Notification, Color, Date 확장
│
└── Qiri.xcodeproj/ # Xcode 프로젝트 설정
- Xcode 15.0 이상
- iOS 16.0 이상 (iPhone)
- watchOS 9.0 이상 (Apple Watch)
- Apple Developer 계정 (실기기 테스트 시)
-
저장소 클론
git clone https://github.com/kec08/QiriUpdate cd QiriUpdate -
Xcode에서 프로젝트 열기
open Qiri.xcodeproj
-
의존성 설치
- Xcode가 Swift Package Manager를 통해 Moya 패키지를 자동으로 다운로드합니다.
-
빌드 타겟 선택
- iPhone 앱:
Qiri스킴 선택 - Watch 앱:
Qiri Watch App스킴 선택
- iPhone 앱:
-
실행
- 시뮬레이터 또는 실기기에서 빌드 & 실행 (⌘+R)
- Watch 앱은 페어링된 Apple Watch 또는 Watch 시뮬레이터에서 실행
- 앱을 실행하고 Apple로 로그인합니다.
- 이용약관에 동의하면 디바이스가 자동 등록됩니다.
- 메인 화면에서 가이드를 따라 AssistiveTouch와 단축어를 설정합니다.
- Watch 앱을 실행하고 온보딩을 완료합니다.
- 메인 화면에서 Qiri 영역을 탭합니다.
- 음성으로 질문을 말합니다.
- AI가 실시간으로 답변을 스트리밍합니다.
- "더보기" 로 전체 답변을 확인할 수 있습니다.
- iPhone 가이드를 따라 AssistiveTouch를 설정하면, 손 제스처만으로 Watch를 조작할 수 있습니다.
- 화면을 터치하지 않고도 음성 질문을 시작할 수 있습니다.
URLSession의 URLSessionDataDelegate를 활용하여 서버로부터 SSE(Server-Sent Events) 형식의 응답을 청크 단위로 수신합니다. AI의 사고 과정(<think>...</think>)과 최종 답변을 분리하여 각각의 UI에 실시간으로 표시합니다.
10개의 커스텀 Notification을 정의하여 네트워크 응답, 화면 전환, 오류 처리 등을 이벤트 기반으로 관리합니다. View는 .onReceive로 이벤트를 구독하고 상태를 전환합니다.
- 실시간 메시지:
sendMessage로 활성 상태에서 즉시 통신 - 백그라운드 동기화:
updateApplicationContext로 비활성 상태에서도 데이터 동기화 - 세션 활성화 시 자동으로 User ID를 동기화하여 끊김 없는 경험 제공
이 프로젝트의 라이선스 정보는 프로젝트 소유자에게 문의하세요.
