SwiftUI에서 리뷰 요청 대화 상자를 발행
10991 단어 SwiftUISKStoreReviewController
소개
앱의 리뷰는 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()
}
}
Reference
이 문제에 관하여(SwiftUI에서 리뷰 요청 대화 상자를 발행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/noby111/items/d048787118144d107569
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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()
}
}
Reference
이 문제에 관하여(SwiftUI에서 리뷰 요청 대화 상자를 발행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/noby111/items/d048787118144d107569
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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()
}
}
Reference
이 문제에 관하여(SwiftUI에서 리뷰 요청 대화 상자를 발행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noby111/items/d048787118144d107569텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)