배경 및 동기 (Context / Why)
- iOS는 포그라운드 상태일 때 기본적으로 알림을 자동 표시하지 않음 →
UNUserNotificationCenterDelegate.willPresent
에서 직접 제어해야 함
- 초기 구현에서는
AVAudioPlayer
를 활용해 포그라운드에서도 소리를 강제 재생하는 방식을 검토했음
- 그러나 이 방식은 사용자의 무음 모드 설정을 무시하고, 무음 상태에서도 소리가 울려 일관성이 깨짐
- 한편 [ADR-012] Suspended 상태 대응을 위한 백그라운드 알람 정책 에서 이미 “연속 로컬 알림”을 채택했으며, 백그라운드에서는 무조건 로컬 알림만 사용 가능함
- 따라서 포그라운드에서도 백그라운드와 동일하게 로컬 알림만 사용해야, 기기 설정(소리/무음, 햅틱 여부)과 일관성 있는 사용자 경험을 제공할 수 있음
대안 검토 (Considered Alternatives)
- 오디오 플레이어 강제 재생 방식
- 방법: 포그라운드에서만
AVAudioPlayer
를 이용해 소리를 직접 재생
- 장점: 앱이 무음 모드라도 강제로 소리를 낼 수 있음
- 단점:
- 무음 모드를 무시하여 사용자 기대와 불일치
- 백그라운드와 정책이 달라져, 앞뒤가 다른 동작 경험 발생
- “포그라운드만 다른 방식”이라는 예외 케이스가 생김
- 결론: 사용자 설정을 무시하고 백그라운드와 불일치 → 기각
- 로컬 알림 방식 (채택)
- 방법: 포그라운드에서도
willPresent
를 통해 로컬 알림을 그대로 노출
- 장점:
- 백그라운드와 일관된 정책 (둘 다 로컬 알림)
- 사용자 기기 설정(소리/무음, 햅틱 여부)을 그대로 존중
- iOS 표준 기능이므로 안정적, 심사 리스크 없음
- 단점: 앱 내부에서 “무조건 소리/무조건 진동”과 같은 완벽한 제어는 불가능
결정 내용 (Decision)
- 포그라운드 알람 정책은 로컬 알림 일원화로 확정
- 동작 규칙:
- 소리 모드: 로컬 알림이 소리+진동으로 표시됨
- 무음 모드: 소리 없이 진동만 (또는 설정에 따라 무음) 표시됨
- 무음 + 햅틱 꺼짐: 시각적 알림(배너)만 표시됨
- 구현 방식:
LocalNotificationDelegate.willPresent
에서 index 0 알림만 표시, 나머지는 suppress + 일괄 정리
- 오디오 플레이어는 사용하지 않음
- 모든 경우에서 사용자 기기의 시스템 설정과 일관성을 유지
결정의 영향 (Consequences)
- 긍정적 영향
- 포그라운드/백그라운드 정책이 완전히 일관됨 → 사용자 혼란 최소화
- 무음 모드 등 시스템 설정을 그대로 따르므로, 예측 가능한 사용자 경험 제공
- AVAudioPlayer 의존 제거로 코드 단순화, 유지보수성 향상
- 알려진 제약
- 앱 내부에서 진동만/소리만을 완벽히 강제할 수 없음 → 시스템 설정에 종속
- 일부 사용자 요구(“무음 모드여도 소리 울리게 해주세요”)는 충족 불가 → 정책적으로 배제