관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 별점 팝업, 리뷰 요청 팝업 띄우는 방법 StoreKit, SKStoreReviewController 본문

iOS 응용 (swift)

[iOS - swift] 별점 팝업, 리뷰 요청 팝업 띄우는 방법 StoreKit, SKStoreReviewController

jake-kim 2022. 5. 4. 00:40

5번 클릭 시 리뷰 팝업 노출되도록 구현

* StoreKit을 이용한 결제 구현 방법은 이 포스팅 글 참고

별점, 평가 팝업 표출 주의사항

  • 애플 문서대로, 사용자에게 앱에대한 충분한 경험을 부여하지 않은 경우 팝업을 띄우지 말 것
    • ex) 처음 앱을 킨 경우나 onboarding화면에 팝업 x

 

  • 평가 요청 주기는 최소 1~2주 텀으로 요청할 것 (자주 요청 시 부정적인 인식)

 

  • 시스템에서 제공하는 Rating 프롬프트
    • 365일 기간 내에 앱당 3번만 노출로 제공
    • 사용자가 설정 앱에서 평가 프롬프트 수신 거부도 따로 가능
    • 시스템의 평가 프롬프트는 필요한 정보만 표시하고 사용자에게 친숙하므로, 되도록이면 시스템에서 제공하는것을 사용할 것

StoreKit

  • 인앱 구매나, 앱 스토어와의 인터렉션과 관련된 기능을 지원하는 framework
    • In-App Purchase
    • Ad Network Attribution
    • Apple Music
    • Recommendations and Reviews
  • 별점 팝업도 StoreKit에서 제공해주는 SKStoreReviewController를 사용하면 편리하게 가능

https://developer.apple.com/documentation/storekit

별점 팝업 (리뷰 요청) 띄우는 방법

ex) 특정 버튼을 5번 이상 클릭하고 버전 별점 팝업 띄우기

  • static으로 사용하기 위해서 enum으로 정의
import StoreKit

enum AppStoreReviewManager {

}
  • 사용하는쪽에서 버튼이 눌릴 경우 해당 유틸을 호출하여 사용
@objc private func didTapButton() {
  AppStoreReviewManager.requestReviewIfAppropriate()
}
  • AppStoreReviewManager에서 버튼이 눌린 횟수까지 카운팅하도록 설정하기 위해서 필요한 프로퍼티 정의
  //  AppStoreReviewManager.swift
  
  private static let minimumReviewWorthyActionCount = 5
  private static var actionCount: Int {
    get { UserDefaults.standard.integer(forKey: "actionCount") }
    set { UserDefaults.standard.set(newValue, forKey: "actionCount") }
  }
  • 메소드 정의
//  AppStoreReviewManager.swift

static func requestReviewIfAppropriate() {
	
}
  • 해당 메소드가 불릴 때 카운트를 올려주는 코드
// in requestReviewIfAppropriate()

self.actionCount += 1
guard self.actionCount >= minimumReviewWorthyActionCount else { return }
  • 버전 정보를 불러와서 해당 버전이 최초 버전이거나 현재 버전과 지난 버전이 다른 경우 리뷰를 새로 요청해야 하므로 분기문 추가
    • lastVersion과 같은 값은, 별점 팝업에서 yes 버튼을 누른 경우, 값 입력
// in requestReviewIfAppropriate()

let bundleVersionKey = kCFBundleVersionKey as String // "CFBundleVersion"
let currentVersion = Bundle.main.object(forInfoDictionaryKey: bundleVersionKey) as? String // build version
let lastVersion = UserDefaults.standard.string(forKey: "lastVersion")
guard lastVersion == nil || lastVersion != currentVersion else { return }
  • SKStoreReviewController.requestReview() 를 사용하여 리뷰 팝업 띄우기
if #available(iOS 14.0, *) {
  guard let scene = UIApplication
    .shared
    .connectedScenes
    .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
  else { return }
  SKStoreReviewController.requestReview(in: scene)
} else {
  SKStoreReviewController.requestReview()
}

* 주의

  • requestReview()를 요청해도 애플의 내부 코드에 의해서 요청이 무시될 수 있므로, "리뷰 요청하기" 버튼과 같은 것을 만들고 리뷰 팝업이 뜨게끔하는 코드를 짜지 말것
  • TestFlight에서 리뷰 요청 테스트를 마음껏 가능 (리뷰를 해도 실제 반영 x)
  • requestReview()을 여러번 요청해도 production환경에서는 일년에 3번 제한되고 requestReview()를 요청하는 일년 중 3번 랜덤으로 노출(debug환경에서는 계속 노출)

 

* 전체 코드: https://github.com/JK0369/ExRatingPopup

 

* 참고

https://www.hackingwithswift.com/example-code/uikit/how-to-ask-users-to-review-your-app-using-skstorereviewcontroller

https://developer.apple.com/documentation/storekit

https://www.raywenderlich.com/9009-requesting-app-ratings-and-reviews-tutorial-for-ios

https://developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/ratings-and-reviews/

Comments