nexo/agent-roadmap/phase/messaging-runtime/milestones/ios-notification-test.md

5.7 KiB

Milestone: iOS 알림 테스트

위치

  • Roadmap: agent-roadmap/ROADMAP.md
  • Phase: agent-roadmap/phase/messaging-runtime/PHASE.md

목표

Android 중심으로 정리된 nexo 알림 계약을 iOS/APNs 환경에서 어느 수준까지 동일하게 검증할 수 있는지 확인한다. 현재 iOS native plugin은 scaffold/stub 상태이므로 production-ready로 단정하지 않고, 권한 요청, APNs/FCM token, notification open routing, ACK/dismiss 계약을 구현 gap과 smoke 기준으로 나누어 정리한다.

상태

[진행중]

승격 조건

  • 없음

구현 잠금

  • 상태: 잠금
  • 결정 필요:
    • iOS smoke 기준으로 사용할 Apple Developer Team, bundle identifier, provisioning profile 생성/관리 책임을 정한다.
    • APNs 인증 방식은 key 기반인지 certificate 기반인지, 그리고 인증 자산 보관 위치와 접근 책임을 정한다.
    • Firebase iOS app을 새로 만들지 기존 app을 사용할지, GoogleService-Info.plist 제공/보관 방식을 정한다.
    • 실제 기기 smoke를 수행할 기기, Apple 계정, 테스트 앱 설치 방식, evidence 제출 방식을 정한다.
    • CI/headless에서 수행할 검증 범위와 수동 검증으로 남길 APNs delivery 범위를 정한다.

범위

  • iOS plugin scaffold와 apps/flutter-test/ios host 설정의 현재 지원 상태 확인
  • APNs entitlement, Firebase iOS 설정, notification permission, APNs/FCM token 획득과 host handoff 조건 정리
  • iOS foreground/background/terminated notification open routing의 Dart event 계약 확인
  • iOS에서 ACK, dismiss, inline reply가 가능한 native hook과 아직 없는 구현 gap 분리
  • 실제 기기, simulator, headless test runner별 검증 가능/불가 경계와 evidence 위치 정리

기능

Epic: [baseline] iOS 기준선

iOS 알림이 Android와 같은 계약으로 검증되기 전에 필요한 platform baseline을 확인한다.

  • [platform-state] 선행 정리 결과를 바탕으로 packages/messaging_flutter/iosapps/flutter-test/ios의 scaffold, 등록 지점, 남은 no-op gap을 확인한다.
  • [permission-token] APNs entitlement, Firebase config, notification permission, APNs/FCM token 획득과 host handoff 조건을 정리한다.
  • [device-limits] simulator, physical device, CI/headless 환경에서 가능한 검증과 불가능한 검증을 구분한다.

Epic: [contract] iOS 알림 계약

iOS native event가 Dart API와 host routing callback으로 연결되기 위한 계약을 구체화한다.

  • [native-bridge] 선행 정리한 bridge 계약 대비 permission, token refresh, notification opened event를 Flutter method/event channel로 넘기는 iOS 구현 gap을 확인한다.
  • [payload-map] 선행 fixture 계약을 실제 APNs/FCM payload의 server_url, server_id, channel_id, root_id, ack_id 매핑에 대조한다.
  • [ack-dismiss] iOS에서 ACK, dismiss, inline reply를 처리할 수 있는 native hook과 후속 구현이 필요한 gap을 분리한다.

Epic: [smoke] iOS Smoke

구현 gap을 숨기지 않고 iOS에서 반복 가능한 수동/자동 smoke 기준을 만든다.

  • [manual-smoke] 실제 기기 기준 permission, token handoff, foreground/background/open routing smoke checklist와 evidence 경로를 작성한다.
  • [automation-boundary] widget/integration test로 자동화할 항목과 실제 APNs delivery가 필요한 수동 항목을 분리한다.
  • [follow-up] smoke 결과에 따라 iOS native bridge 구현, host 설정 보강, 문서 보강 중 후속 Milestone 후보를 정리한다.

완료 리뷰

  • 상태: 없음
  • 요청일: 없음
  • 완료 근거: 없음
  • 리뷰 필요:
    • 사용자가 완료 결과를 확인했다
    • archive 이동을 승인했다
  • 리뷰 코멘트: 없음

범위 제외

  • Android FCM 구현 변경은 이 Milestone에서 다루지 않는다.
  • macOS, Windows, Linux desktop 알림 검증은 각 OS별 알림 테스트 Milestone에서 다룬다.
  • 멀티앱 channel/tenant/server 분기 모델과 push credential 분리 정책은 멀티앱 채널 모델에서 결정한다.
  • iOS native bridge 전체 구현은 gap 확인 후 별도 구현 Milestone으로 분리할 수 있다.

작업 컨텍스트

  • 관련 경로: packages/messaging_flutter/ios/, packages/messaging_flutter/lib/, packages/messaging_flutter/README.md, apps/flutter-test/ios/, apps/flutter-test/README.md
  • 표준선(선택): iOS scaffold/stub 상태를 먼저 명확히 하고, 가능한 smoke 기준과 후속 구현 gap을 분리한다
  • 민감값 기준: Apple/Firebase/APNs credential, team id, profile, token, private host 값은 tracked 문서에 쓰지 않고 책임 경계와 evidence 위치만 기록한다
  • 선행 작업: 알림 파이프라인 고도화, iOS 알림 선행 정리
  • 후속 작업: 멀티앱 채널 모델
  • 확인 필요: 프로비저닝, APNs 인증, Firebase iOS 설정, 실제 기기/CI smoke 환경 결정
  • 현재 동기화(2026-06-05): packages/messaging_flutter/ios/Classes/NexoMessagingPlugin.swiftapps/flutter-test/ios/RunnerTests/RunnerTests.swift 기준으로 최소 debug/action bridge, device token 저장/조회, auth/signing no-op bridge는 확인됐고, APNs 등록, Firebase token refresh, notification center delegate, ACK, dismiss, inline reply는 구현 gap으로 남아 있다.
  • 현재 동기화(2026-06-05): apps/flutter-test/ios/Runner/Runner.example.entitlements, apps/flutter-test/ios/Runner/GoogleService-Info.example.plist, apps/flutter-test/ios/Fixtures/*.apns, docs/ios-notification-test-guide.md 기준으로 placeholder와 민감값 제외/evidence 경계는 확인됐고, 실제 Apple/Firebase/기기 smoke 결정은 아직 잠금 항목으로 남아 있다.