SwiftUI에서 리뷰 요청 대화 상자를 발행

소개



앱의 리뷰는 SKStoreReviewController를 사용하면, OS의 체재에 따른 리뷰 의뢰 다이얼로그를 표시해 줍니다.
애초에 앱의 리뷰 요청은 이 방법 이외에 해서는 안 되는 것 같습니다.

실제로 표시되는 것은 이런 느낌의 대화입니다.



어떻게 SwiftUI에서 사용합니까?



Controller라는 이름대로 UIKit 클래스이므로 UIViewControllerRepresentable로 래핑해야합니다.
거의 공식 샘플 의 원형 파크리입니다만, 나는 StoreReviewView라는 클래스로 랩 해 사용하고 있습니다.
import Foundation
import UIKit
import SwiftUI
import StoreKit

struct StoreReviewView: UIViewControllerRepresentable {
    typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void


    func makeUIViewController(context: UIViewControllerRepresentableContext<StoreReviewView>) -> UIViewController {
        let controller = UIViewController()

        return controller
    }

    func checkAndShowReview() {
        // If the count has not yet been stored, this will return 0
        var count = UserDefaults.standard.integer(forKey: UserDefaults.processCompletedCountKey)
        count += 1
        UserDefaults.standard.set(count, forKey: UserDefaults.processCompletedCountKey)

        // 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: UserDefaults.lastVersionPromptedForReviewKey)

        // Has the process been completed several times and the user has not already been prompted for this version?
        if count >= 4 && currentVersion != lastVersionPromptedForReview {
            let twoSecondsFromNow = DispatchTime.now() + 2.0
            DispatchQueue.main.asyncAfter(deadline: twoSecondsFromNow) {
                SKStoreReviewController.requestReview()
                UserDefaults.standard.set(currentVersion, forKey: UserDefaults.lastVersionPromptedForReviewKey)
            }
        }
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<StoreReviewView>) {
    }
}

extension UserDefaults {
    class var processCompletedCountKey: String {
        return "processCompletedCount"
    }

    class var lastVersionPromptedForReviewKey: String {
        return "lastVersionPromptedForReview"
    }
}

전화하는 방법



대화 상자를 표시하고 싶은 View의 onAppear에서 checkAndShowReview()를 호출합니다.
진짜는 UIKit에서 말하는 viewDidLoad()의 타이밍으로 처리를 실시하고 싶은 곳입니다만, SwiftUI이므로 그것은 할 수 없습니다.
고통의 방법입니다만, onApper로 PID 체크를 실시하는 것으로 표시될 때마다 카운트가 증가하는 것을 방지합니다.
import SwiftUI

struct MainView: View {
    @State private var pid : Int32 = 0

    var body: some View {
        VStack {
            Text("Hello")
        }.onAppear() {
            if(pid != ProcessInfo.processInfo.processIdentifier) {
                StoreReviewView().checkAndShowReview()
                pid = ProcessInfo.processInfo.processIdentifier
            }
        }
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()
    }
}

좋은 웹페이지 즐겨찾기