iOS에서 StoreKit 이용해 리뷰 요청하기

사용자들은 불만이 있지 않으면 리뷰를 잘 남기지 않는 경향이 있다.
그래서 앱 내에서 적절한 때에 리뷰를 요청할 필요가 있다.

iOS에서는 사용자가 앱에 대한 만족감이 높을 때 앱의 사용을 방해하지 않는 선에서 평가와 리뷰를 요청하도록 가이드 한다.
SKStoreReviewController API(iOS 10.3+)를 사용하면 사용자는 앱을 종료하지 않고 표준 프롬프트를 통해 평가를 제출할 수 있다.
유의할 것은, 프롬프트가 1년에 최대 3번까지만 표시된다.
그러므로 다음 권고사항을 지켜서 최적의 시점에 요청하도록 해야겠다.

  1. 같은 버전의 앱에 대한 리뷰를 요청하지 않도록 번들 버전을 확인한다.
  2. 유저가 특정한 태스크를 몇 회 이상 완수했을 때 요청할지 결정한다.
  3. 사용자가 태스크 완료 후 바로 다른 태스크로 이동하고자 할 때 방해가 되지 않도록 완료 화면에 몇 초 멈추어 있을 때 요청한다.

이와 같은 권고 사항을 지키면 요청을 띄우는 것이 매우 딜레이 되고, 그 덕분에 앱을 실제로 충분히 경험한 사용자에게 유의미한 평가를 받을 수 있다.

My Code

나는 이와 같은 권고를 참고해 샘플 코드를 나에게 맞게 수정하여 다음과 같이 구현했다.

// Request Review
if self.histories.count > 2 {
    // Get the current bundle version for the app
    let infoDictionaryKey = kCFBundleVersionKey as String
    guard let currentVersion = 
        Bundle.main.object(forInfoDictionaryKey: infoDictionaryKey) as? String
        else { fatalError("Expected to find a bundle version in the info dictionary") }

    let lastVersionPromptedForReview = 
        UserDefaults.standard.string(forKey: UserDefaultsKeys.reviewRequestedVer)

    // Has the process been completed several times and the user has not already been prompted for this version?
    if currentVersion != lastVersionPromptedForReview {
        let halfSecondsFromNow = DispatchTime.now() + 0.5
        DispatchQueue.main.asyncAfter(deadline: halfSecondsFromNow) {
            SKStoreReviewController.requestReview()
            UserDefaults.standard.set(currentVersion, forKey: UserDefaultsKeys.reviewRequestedVer)
        }
    }
}
  1. 이미 리뷰를 요청한 번들 버전인지 확인, 요청 시 현재 번들 버전을 UserDefaults에 저장.
  2. 태스크를 세 번 이상 완수했을 때 요청. 나는 하루에 한 번 사용하는 앱을 구현 중이라, 3일 사용했으면 충분하다고 생각한다.
  3. 샘플 코드에서는 2초 후 요청하도록 되어있지만, 나는 앱 내에 메인 태스크가 한가지 뿐이라 완수 후 바로 앱을 종료할 확률이 높아 0.5초 후 요청하도록 했다.

     

References

  1. Human Interface Guidelines - Ratings and Reviews
  2. Requesting App Store Reviews Sample Code