Skip to content

[NM-560] 식별 · 타이머 완료 후 스토어 리뷰 요청 - #200

Merged
ParkMazorika merged 6 commits into
developfrom
feature/NM-560-store-review
Oct 20, 2026
Merged

ParkMazorika merged 6 commits into
developfrom
feature/NM-560-store-review

Conversation

@ParkMazorika

@ParkMazorika ParkMazorika commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

변경 요약

식별 · 타이머를 끝낸 뒤 조건을 보고 앱스토어 평가 창을 요청한다. 창을 띄울지는 OS가 정한다.
기록에 관한건 UserDefaults에 json 형태로 저장

변경 내용

  • 판단 — Core/StoreReview/StoreReview.swift 새 파일
    • StoreReviewPolicy: 묶음 1 · 2 · 3 + 마지막 요청 후 30일. 화면과 떼어 순수 함수로 둠
    • StoreReview: 기록(UserDefaults, 기기에만) · 판단 · 요청(AppStore.requestReview(in:))
묶음 조건 쓰는 시점
1 식별 누적 3회 · 첫 사용 후 3일 · 이번 확정을 모두 수정 없이 · 오늘 한도 안내 안 봄 식별
2 최근 7일 중 3일 사용(앱 · 위젯 · 워치) · 식별 + 타이머 합쳐 3회 식별 · 타이머
3 첫 사용 후 3일 · 타이머 누적 5회 타이머
  • 요청 시점
    • 식별 — 기록 저장 성공 → 들어온 화면으로 돌아온 직후
    • 타이머 — 앱 안 만료 카드 완료 직후 / 앱 밖(시스템 알람 · 워치)에서 끝내면 다음에 앱을 열 때(콜드런치는 탭바가 뜬 뒤)
      • 앱을 열 때는 sceneDidBecomeActive 가 받은 씬에 띄우고, 씬이 없으면 표시를 남겨 다음 활성화 때 본다
  • 기록 지점
    • 첫 실행 · 앱을 연 날 — SceneDelegate.sceneDidBecomeActive
    • 위젯 · 워치로 쓴 날 — 큐에 남은 위젯 시작 · 앱 밖 완료 시각, 워치 명령을 받은 시각. 위젯만 며칠 쓰고 앱을 열어도 쓴 날로 센다
    • 첫 사용 시각도 같다 — 위젯으로 먼저 쓰고 앱은 나중에 열면 그 위젯 사용이 첫 사용
    • 타이머 시작 — DefaultTimerUseCase.timerStarted(앱 · 워치 · 위젯 딥링크) + 위젯 백그라운드 시작은 지연 분석 큐를 꺼낼 때
    • 수정 없음 — DrugIdentificationVC.allConfirmedUnedited(): 확정한 알약 조건이 모두 모델값. 수동 추가는 수정으로 본다
    • 한도 안내를 본 날 — presentLimitAlert

참고

  • 기존 사용자는 업데이트 후 처음 쓴 때(앱 · 위젯 · 워치)가 「첫 사용」이고 횟수도 0부터 센다

테스트

  • 로컬 빌드 (App 스킴, 시뮬레이터)
  • Core 단위 테스트 — StoreReviewPolicyTests 14개(묶음별 · 묶음 1은 식별 · 묶음 3은 타이머 시점만 · 30일 · 7일 창 · 위젯만 3일 쓰고 4일째 열기 · 앱 밖 완료는 띄울 씬이 없으면 남김)
  • 시뮬레이터 (iPhone 17 Pro iOS 27 + Apple Watch SE 3, Debug — 부를 때마다 평가 창이 뜬다)

타이머

시작 끝낸 곳 앱 상태 평가 창
앱 앱 안 만료 카드 완료 앞 ✅ 바로
앱 알람 배너 ✕ · 잠금화면 「밀어서 중단」 백그라운드 → 열기 ✅ 열 때
잠금화면 위젯 잠금화면 「밀어서 중단」 백그라운드 → 열기 / 종료 → 콜드런치 ✅ 열 때 / 탭바가 뜬 뒤
워치 앱 · 워치 위젯 워치 완료 백그라운드 → 열기 ✅ 열 때
앱 앱 안 완료 — 조건 미달 앞 ✅ 안 뜸

시작 횟수는 앱 · 위젯 딥링크 · 워치에서 바로, 잠금화면 위젯은 다음 앱 활성화 때 큐에서 올라갔다.

식별

상황 평가 창
묶음 1 — 수정 없이 선택 → 완료 ✅ 들어온 화면으로 돌아온 직후
묶음 1 조건에서 모양을 바꾸고 선택 (묶음 2 · 3 불충족) ✅ 안 뜸 — 식별 횟수만 오름
이어서 수정 없이 선택 ✅ 뜸
묶음 2 — 최근 7일 중 3일 사용, 모양을 바꾸고 선택 ✅ 뜸

위젯 사용일 — 위젯으로 3 · 2 · 1일 전에 쓰고 오늘 앱을 처음 연 상황: ✅ 콜드런치에 뜸. 쓴 날 4일(같은 날 시작 · 완료는 하루), 첫 사용이 3일 전으로 당겨짐. 수정 전이면 쓴 날이 하루라 안 뜨는 상황

테스트 방법 — 3일 · 30일 조건은 앱을 끈 상태에서 기기의 리뷰 기록(storeReview.record)을 고치고 cfprefsd 를 재시작해 만들었다. 앱 실행 중 defaults write 로 바꾸면 앱에 반영되지 않을 때가 있어 쓰지 않았다.

  • 실기기 — 잠금화면 위젯 시작 → 알람 끄기 → 앱 열기, 위젯만 며칠 쓰고 앱 열기

체크리스트

  • PR 제목이 [NM-XXX] 요약 형식
  • 브랜치명 <type>/NM-XXX-요약 형식
  • 커밋 메시지 [NM-XXX] type: 요약 형식
  • 셀프 리뷰 완료

함께 고친 기존 버그 — 위젯으로 시작한 타이머를 잠금화면에서 꺼도 앱에 남는다

  • 증상: 잠금화면 위젯으로 시작한 타이머를 알람에서 끄면 앱에 만료 카드가 다시 뜨고, timer_complete · 리뷰 요청이 빠졌다
  • 원인: 알람 완료 버튼은 예약할 때 정한 인텐트를 이름으로 찾아 앱에서 실행한다. 위젯이 예약한 알람의 TimerWidgetStopIntent 는 위젯에만 있어 앱이 찾지 못했다(Could not find an intent with identifier TimerWidgetStopIntent)
  • 수정: 같은 이름의 인텐트를 앱에도 넣었다 — App/Sources/Widget/TimerWidgetStopIntent.swift
완료 인텐트 붙는 알람 들어 있는 곳
TimerStopIntent 앱이 예약한 알람 앱
TimerWidgetStopIntent 위젯이 예약한 알람 위젯(예약용) + 앱(실행용, 이번에 추가)

둘 다 하는 일(타이머 삭제 · 완료 기록)은 같다. 위젯은 TimerFeature 를 링크하지 않아 따로 만들었고, 위젯 · 앱 정의의 이름 · 매개변수가 같아야 한다.

다만 두 인텐트는 합치는 것이 가능해 불필요한 분기이다.

@ParkMazorika ParkMazorika self-assigned this Oct 20, 2026
@ParkMazorika ParkMazorika added the enhancement New feature or request label Oct 20, 2026
ParkMazorika and others added 2 commits October 21, 2026 01:27
LiveActivityIntent 는 앱 프로세스에서 실행되는데 TimerWidgetStopIntent 가 위젯 타깃에만 있어
잠금화면 위젯으로 시작한 타이머를 앱 밖에서 끄면 저장소에 남고 timer_complete · 리뷰 요청이 빠졌다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ParkMazorika and others added 3 commits October 21, 2026 03:30
위젯만 며칠 쓰고 앱을 열면 앱을 연 하루로만 세져 묶음 2(최근 7일 중 3일)를 못 채웠다.
큐에 남은 위젯 시작 · 앱 밖 완료 시각과 워치 사용 시각을 그날로 센다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
위젯으로 타이머를 쓴 날은 앱을 쓴 날로 본다 — 위젯으로 먼저 쓰고 앱은 나중에 열어도
그 위젯 사용이 첫 사용이다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re-review

# Conflicts:
#	Projects/Features/DrugIdentificationFeature/Sources/DrugIdentificationScene/VC/DrugIdentificationVC.swift
@ParkMazorika
ParkMazorika merged commit f7176fb into develop Oct 20, 2026
@ParkMazorika
ParkMazorika deleted the feature/NM-560-store-review branch October 20, 2026 19:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant