앱을 출시하고 나니 리뷰 수가 안 늘었다. "리뷰 남겨주세요" 배너를 눌러 스토어로 튕겨보내는 방식을 썼는데, 스토어 페이지까지 가서 별점을 다시 찾아 누르는 사람은 거의 없었다. 이탈만 늘었다.
애플과 구글 둘 다 앱 안에서 바로 별점을 받을 수 있는 네이티브 리뷰 다이얼로그를 제공한다. iOS는 SKStoreReviewController, 안드로이드는 In-App Review API인데, Expo에서는 expo-store-review로 이 둘을 한 번에 감쌀 수 있다.
설치
npx expo install expo-store-review
리뷰 요청 띄우기
핵심은 requestReview() 한 줄이다. 근데 그냥 부르면 안 되고, 이 기기에서 리뷰 요청이 가능한 상태인지 먼저 확인해야 한다.
import * as StoreReview from 'expo-store-review';
async function askForReview() {
// 시뮬레이터, 스토어 미설치 환경 등에서는 false
if (await StoreReview.isAvailableAsync()) {
await StoreReview.requestReview();
}
}
여기서 중요한 걸 하나 알아둬야 한다. requestReview()는 다이얼로그가 실제로 떴는지 알려주지 않는다. OS가 자체 판단으로 노출 여부를 결정하기 때문이다. iOS는 같은 사용자에게 1년에 최대 3번까지만 이 프롬프트를 보여주고, 그 이상은 조용히 무시한다. 그러니 "요청했으니 떴겠지"라고 가정하고 뒤에 별도 화면을 붙이면 안 된다.
언제 띄워야 하나
앱을 켜자마자 리뷰창을 띄우는 앱을 보면 바로 별 하나 주고 싶어진다. 사용자가 긍정적인 순간, 즉 어떤 작업을 성공적으로 끝낸 직후에 띄우는 게 정석이다. 결제 완료, 레벨 클리어, 세 번째 방문 같은 시점.
async function onTaskCompleted() {
const count = await getCompletedCount(); // 로컬 저장소에서 누적 횟수
// 아무 때나 말고, 충분히 쓴 뒤 한 번만 시도
if (count === 5) {
await askForReview();
}
}
OS가 빈도를 알아서 제한해주긴 하지만, 앱 쪽에서도 "몇 번 이상 썼을 때 한 번만" 같은 조건을 걸어두는 게 좋다. 안 그러면 아까운 노출 횟수를 아무 감흥 없는 순간에 다 써버린다.
개발 중 테스트
시뮬레이터에서는 다이얼로그가 안 뜨는 경우가 많아서, 실제로 봤는지 확인하려면 실기기 + TestFlight(iOS)나 내부 테스트 트랙(안드로이드)에서 돌려봐야 한다. 대신 개발 중엔 스토어 페이지로 보내는 fallback을 하나 두면 흐름 확인은 된다.
if (await StoreReview.hasAction()) {
// requestReview 또는 스토어 딥링크 중 가능한 방식
await StoreReview.requestReview();
}
핵심은 세 가지다. 앱을 벗어나지 않게 네이티브 다이얼로그를 쓸 것, OS가 노출을 제어하니 결과를 신뢰하지 말 것, 그리고 사용자가 기분 좋은 순간에만 조심히 띄울 것. 배너로 스토어 튕기던 시절보다 리뷰가 확실히 늘었다.