Live Activity
아키텍처
ActivityKit 연동, 상태 머신, 데이터 흐름 상세
아키텍처
전체 데이터 흐름
React Native 앱에서 잠금 화면 위젯까지 데이터가 전달되는 경로입니다.
ActivityKit 연동
라이브러리 구조
react-native-live-activity/├── src/│ ├── index.ts # 공개 API 진입점│ ├── ReactNativeLiveActivity.types.ts # 공유 타입 정의│ ├── LiveActivityManager.ts # Android 스텁 구현│ ├── LiveActivityManager.ios.ts # iOS 실제 구현│ ├── ReactNativeLiveActivityModule.ts # Android 스텁 모듈│ └── ReactNativeLiveActivityModule.ios.ts # iOS 네이티브 모듈 바인딩└── ios/└── ReactNativeLiveActivityModule.swift # Swift 네이티브 구현
플랫폼별 파일 선택
React Native / Expo의 플랫폼별 파일 해석 규칙에 따라 자동으로 올바른 구현이 선택됩니다.
| 파일 | 플랫폼 | 설명 |
|---|---|---|
LiveActivityManager.ios.ts | iOS | ActivityKit을 사용하는 실제 구현 |
LiveActivityManager.ts | Android | 아무 동작도 하지 않는 스텁 |
ReactNativeLiveActivityModule.ios.ts | iOS | Swift 네이티브 모듈 바인딩 |
ReactNativeLiveActivityModule.ts | Android | Promise.resolve()를 반환하는 스텁 |
접수 상태 머신
병원 접수는 다음 상태 전이를 따릅니다.
상태별 Live Activity 표시
| 상태 | 잠금 화면 표시 | 대기 인원 표시 |
|---|---|---|
pending | 접수 대기 중 | - |
waiting | N명 대기 중 | displayTreatWaiting 값 |
inProgress | 진료 중 | - |
completed | 완료 | - |
병원별 그룹화 관리
requestLiveActivities는 hospitalID를 기준으로 접수를 그룹화하여 Live Activity를 관리합니다.
hospitalID를 지정하지 않으면 각 접수 id를 기준으로 개별 관리됩니다.
Push 알림 업데이트 흐름
사용자가 앱을 사용하지 않는 상태에서도 Live Activity를 업데이트할 수 있습니다.
Widget Extension 구조
Xcode에서 추가하는 위젯 익스텐션은 ActivityAttributes를 정의해야 합니다. 이 구조는 ReceptionStateLiveActivityItem의 데이터와 일치해야 합니다.
// Swift 위젯 익스텐션 예시import ActivityKitimport WidgetKitimport SwiftUIstruct ReceptionActivityAttributes: ActivityAttributes {public struct ContentState: Codable, Hashable {var patientName: Stringvar hospitalName: String?var displayTreatWaiting: Intvar state: String}var id: Stringvar hospitalID: String?var link: String?}@mainstruct ReceptionWidget: Widget {var body: some WidgetConfiguration {ActivityConfiguration(for: ReceptionActivityAttributes.self) { context in// 잠금 화면 UIReceptionLockScreenView(context: context)} dynamicIsland: { context in// Dynamic Island UIDynamicIsland {// 확장된 영역} compactLeading: {Image(systemName: "clock")} compactTrailing: {Text("\(context.state.displayTreatWaiting)")} minimal: {Image(systemName: "clock")}}}}
Android 스텁 구현
Android에서는 모든 메서드가 즉시 완료되는 스텁으로 구현됩니다. 이를 통해 플랫폼 조건 분기 없이 동일한 코드를 사용할 수 있습니다.
// Android에서의 스텁 동작class LiveActivityManager {async requestLiveActivities(_items): Promise<void> {// 아무 동작 없이 즉시 반환}async updateReceptionState(_receiptInfo): Promise<void> {// 아무 동작 없이 즉시 반환}async endAllActivities(): Promise<void> {// 아무 동작 없이 즉시 반환}async areActivitiesEnabled(): Promise<boolean> {return false; // 항상 false 반환}}
Android 스텁 구현 덕분에 Platform.OS === 'ios' 조건 없이 동일한 코드로 양 플랫폼을 지원할 수 있습니다. 단, areActivitiesEnabled()를 통해 기능 활성화 여부를 먼저 확인하는 것을 권장합니다.