Bplogger

Pulse Log iOS 배포 설계

1. 목표

Android에서 배포 중인 Pulse Log와 같은 앱을 iOS에서도 배포한다. 첫 iOS 버전은 Android 앱의 핵심 경험을 최대한 동일하게 제공하는 것을 목표로 한다.

가장 중요한 제약은 다음과 같다.

2. 권장 접근

첫 iOS 배포는 Kotlin Multiplatform shared 모듈을 만든 뒤, iOS 앱이 그 공통 로직을 사용하는 구조를 권장한다.

이유:

3. 프로젝트 구조

기본안:

shared/
  src/commonMain/
  src/commonTest/
  src/androidMain/
  src/iosMain/

ios/
  PulseLog/
    PulseLog.xcodeproj
    PulseLog/
      App/
      Features/
      Domain/
      Data/
      DesignSystem/
      Resources/
    PulseLogTests/
    PulseLogUITests/

대안:

선택 기준:

현재 권장안은 shared/ KMP 모듈과 ios/ Xcode 프로젝트를 같은 저장소에 둔다. 단, Android app 모듈은 phase별로 작게 연결하고 기존 Android 동작을 보존한다.

4. iOS 기술 스택

첫 배포에서는 저장소 복잡도를 낮추기 위해 iOS native 저장소 또는 KMP 저장소 중 하나를 선택한다. Android 기존 Room DB는 유지한다. 의료 기록 성격상 추후 schema migration 가능성이 필요하므로 단순 JSON은 프로토타입에만 적합하다.

5. 화면 동등성

iOS 화면은 Android의 현재 화면 구조를 기준으로 한다.

5.1 메인

5.2 입력

5.3 캘린더

5.4 그래프

5.5 설정

5.6 내보내기

6. 데이터 모델

iOS 데이터 모델은 Android 의미와 맞춘다.

DailyHealthRecord
  dateIso: String
  morningSystolic: Int?
  morningDiastolic: Int?
  morningMeasuredAtEpochMs: Int64?
  eveningSystolic: Int?
  eveningDiastolic: Int?
  eveningMeasuredAtEpochMs: Int64?
  weightKg: Double?
  weightMeasuredAtEpochMs: Int64?
  createdAtEpochMs: Int64
  updatedAtEpochMs: Int64

NotificationSettings
  id: Int
  morningEnabled: Bool
  morningTime: String
  eveningEnabled: Bool
  eveningTime: String
  updatedAtEpochMs: Int64

iOS에는 repeatEnabled, repeatCount를 새 기능으로 만들지 않는다. Android에는 기존 DB 호환 때문에 필드가 남아있지만 앱에서는 false/0으로 저장한다.

7. 알림 설계

검증 기준:

8. App Store 준비

필수 준비:

Apple Developer Program은 공식 안내 기준 연 99 USD 멤버십이다. TestFlight는 App Store Connect에서 베타 테스트를 관리하는 Apple 공식 배포 경로다. 건강 및 개인정보 데이터는 App Store Review Guidelines와 App Privacy 문구가 앱 실제 동작과 일치해야 한다.

참고:

9. iOS 하네스

첫 iOS 구현부터 shared에 다음 경계를 둔다.

테스트 우선순위:

  1. 입력 검증 정책
  2. 날짜와 캘린더 상태 정책
  3. 그래프 기간 계산
  4. 저장/삭제 repository 동작
  5. 알림 표시 생략 정책
  6. ViewModel 상태 전이
  7. 주요 UI smoke test

상세 공통화 전략은 Android/iOS 공통 코드 설계를 기준으로 한다.

10. 단계별 계획

Phase iOS-0. 준비

Phase iOS-1. 공통 로직

Phase iOS-2. UI 껍데기

Phase iOS-3. 로컬 저장

Phase iOS-4. 알림과 내보내기

Phase iOS-5. 테스트와 TestFlight

Phase iOS-6. App Store 제출