Skip to content

[GMSS-289]알림 권한을 온보딩 대신 새 대화 생성 시 OS 상태에 맞춰 요청 - #81

Open
soyeonLee126 wants to merge 1 commit into
developfrom
missing-permission
Open

soyeonLee126 wants to merge 1 commit into
developfrom
missing-permission

Conversation

@soyeonLee126

Copy link
Copy Markdown
Collaborator

작업 개요

온보딩에서 건너뛰기를 누르면 알림 권한 안내를 보지 않았는데도 "안내함"으로 저장되어, 이후 권한 요청이 다시 나가지 않았습니다. 이를 고치면서 요청 시점과 기준을 함께 정리했습니다.

  • 요청 시점을 온보딩에서 새 대화를 만들 때로 옮겼습니다. 서버는 끝내지 않은 대화도 시간이 지나면 카드로 만들어 알림을 보냅니다. 그래서 대화를 처음 만들 때 묻는 것이 알림이 필요한 시점과 맞습니다. 온보딩 단계에서는 사용자가 앱을 아직 모르기 때문이기도 합니다.
  • 안내를 띄울지는 OS 권한 팝업 상태에 맞춰 판단합니다. 안내 다이얼로그는 OS가 실제로 시스템 팝업을 띄울 수 있을 때만 뜹니다.

작업 유형

  • feat: 새 기능
  • fix: 버그 수정
  • refactor: 리팩토링 (동작 변경 없음)
  • build: 빌드/의존성 설정
  • chore: 기타 (문서, 설정 등)
  • test: 테스트 추가/수정

변경 사항

  • 온보딩

    • 권한 안내 다이얼로그를 없앴습니다. 시작하기와 건너뛰기 모두 바로 메인으로 이동합니다.
    • 메인에 들어올 때 시스템 팝업을 바로 띄우던 요청도 함께 없앴습니다.
  • 채팅방

    • 홈에서 새 대화를 만들고 채팅방에 들어오면 안내 다이얼로그를 띄웁니다. 목록에서 기존 대화를 열 때는 묻지 않습니다.
    • 안내 다이얼로그의 버튼은 확인 하나입니다. 누르면 시스템 팝업이 뜨고, 거절은 시스템 팝업에서만 받습니다. 바깥을 눌러 닫으면 아무것도 기록하지 않습니다.
    • 권한 로직은 NotificationPermissionPromptViewModel로 분리했습니다. ChatRoomViewModel은 새 대화 진입만 알립니다(NewConversationOpened).
  • 안내 조건(ShouldPromptNotificationPermissionUseCase)

    • 권한이 없고, 거절 이력이 없거나 OS가 한 번 더 물을 수 있다고 알려 줄 때(shouldShowRequestPermissionRationale == true) 띄웁니다.
    • 거절 이력은 시스템 팝업 결과가 거절이고 rationale이 true일 때만 남깁니다. OS가 첫 거절로 센 경우입니다.
    상황 거절 이력 다음 새 대화
    처음 없음 묻습니다
    한 번 거절 남김 한 번 더 묻습니다
    두 번 거절 있음 묻지 않습니다
    시스템 팝업을 고르지 않고 닫음 남기지 않음 다시 묻습니다
  • NotificationPermissionDialog를 core/ui로 옮기고 문자열 키를 notification_permission_*로 바꿨습니다. 안내 문구 중 비동의를 해도 앱을 이용할 수 있어요.는 허용하지 않아도 앱을 이용할 수 있어요.로 바꿨습니다.

  • DataStore 이력의 메모리 캐시를 없앴습니다. 메인 진입 요청이 없어져서, 캐시로 막던 동시 읽기 상황이 더 이상 생기지 않습니다.

  • 테스트: 안내 조건(use case), 프롬프트 ViewModel, 새 대화 진입 알림 테스트를 추가하고 수정했습니다.

상태로 남긴 값

  • DataStore notification_permission_prompted: 시스템 팝업에서 한 번 거절했는지 저장합니다. OS는 "한 번도 묻지 않음"과 "영구 거절"을 둘 다 rationale false로 알려 줘서 구분할 수 없습니다. 그래서 이 값은 앱이 직접 남겨야 합니다.
  • NotificationPermissionPromptViewModel의 다이얼로그 표시 여부: 새 대화인지는 채팅방에 들어오는 순간에만 알 수 있어서, 다른 값에서 계산해 낼 수 없습니다.

관련 이슈

  • 없음

관련 작업 (Notion)

  • GMSS-289

스크린샷 / 동작 화면

  • 없음

체크리스트

  • base 브랜치가 develop으로 설정되어 있다
  • 로컬 빌드 및 실행을 확인했다
  • 커밋 메시지가 컨벤션(feat:, fix: 등)을 따른다
  • 불필요한 로그/주석/디버그 코드를 제거했다
  • 리뷰어가 이해할 수 있도록 설명을 작성했다

리뷰 요청 사항

  • 이력 키는 기존 키를 그대로 쓰고 마이그레이션은 하지 않았습니다. 업데이트 전에 온보딩에서 동의, 비동의, 건너뛰기를 고른 사용자는 이미 이력이 남아 있습니다. 이 사용자들이 시스템 팝업을 본 적이 없다면 앞으로도 묻지 않습니다.
  • 새 대화를 만들고 30초 안에 채팅방에 들어가지 못하면, 그 대화에서는 묻지 않고 다음 새 대화에서 묻습니다.
  • OS 동작은 버전과 제조사에 따라 다를 수 있습니다. Android 13 이상에서 다음 경우를 함께 봐 주시면 좋겠습니다.
    • 첫 거절 뒤에 rationale이 true가 되고, 두 번째 거절 뒤에 false가 되는지
    • 시스템 팝업을 고르지 않고 닫았을 때 거절로 세지 않는지
    • 허용했다가 설정에서 끈 뒤에 어떻게 동작하는지
  • 안내 다이얼로그는 새 대화의 캐릭터 댓글이 나타나기 시작할 때 함께 뜹니다.

- 온보딩 건너뛰기 시 알림 권한 요청이 다시 나가지 않던 문제 수정
- 안내 노출 여부를 OS 권한 팝업 상태에 맞춤
- 첫 거절 여부는 OS가 제공하지 않아 DataStore에 저장함
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant