블로그 목록
apps

expo-store-review로 인앱 리뷰 요청하기 — 스토어로 안 튕기고 별점 받기

앱을 출시하고 나니 리뷰 수가 안 늘었다. "리뷰 남겨주세요" 배너를 눌러 스토어로 튕겨보내는 방식을 썼는데, 스토어 페이지까지 가서 별점을 다시 찾아 누르는 사람은 거의 없었다. 이탈만 늘었다.

애플과 구글 둘 다 앱 안에서 바로 별점을 받을 수 있는 네이티브 리뷰 다이얼로그를 제공한다. 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가 노출을 제어하니 결과를 신뢰하지 말 것, 그리고 사용자가 기분 좋은 순간에만 조심히 띄울 것. 배너로 스토어 튕기던 시절보다 리뷰가 확실히 늘었다.