programing

'requestReview()'는 iOS 14.0에서 더 이상 사용되지 않습니다.

css3 2023. 9. 12. 20:11

'requestReview()'는 iOS 14.0에서 더 이상 사용되지 않습니다.

iOS 14에서 Xcode는 다음과 같은 경고를 표시합니다.

requestReview()'는 iOS 14.0에서 더 이상 사용되지 않습니다.

저는 스토어킷을 사용하여 앱에서 자동으로 리뷰를 요청하고 있습니다.

func requestReview() {
    guard shouldRequestReview else {return}
    SKStoreReviewController.requestReview()
    lastRequest = Date()
}

enter image description here

그 경고를 없애는 방법은?

iOS 16+

이제 환경 값으로 사용할 수 있는 새로운 RequestReviewAction이 있습니다.

private struct ContentView: View {
    @Environment(\.requestReview) private var requestReview

    var body: some View {
        Button("Review") {
            DispatchQueue.main.async {
                requestReview()
            }
        }
    }
}

iOS 14+

퀵 솔루션

if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    DispatchQueue.main.async {
        SKStoreReviewController.requestReview(in: scene)
    }
}

참고: 일부 의견에 따르면 다음과 같이 하면 더 신뢰할 수 있습니다.DispatchQueue.main.async

편리한 솔루션

여기 진정한 원라이너가 있습니다.

SKStoreReviewController.requestReviewInCurrentScene()

하지만 먼저 다음 확장자를 만들어야 합니다.SKStoreReviewController:

extension SKStoreReviewController {
    public static func requestReviewInCurrentScene() {
        if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
            DispatchQueue.main.async {
                requestReview(in: scene)
            }
        }
    }
}

다음과 같은 스위프트 확장이 다른 GitHub 저장소가 있습니다.


설명.

requestReview기능은 iOS 14에서 더 이상 사용되지 않습니다.

@available(iOS, introduced: 10.3, deprecated: 14.0)
open class func requestReview()

당신은 사용해야 합니다.requestReview(in:)대신 기능:

@available(iOS 14.0, *)
open class func requestReview(in windowScene: UIWindowScene)

가능한 해결책

  • 사용자 지정 확장

다음 확장자를 만들 수 있습니다.

extension UIApplication {
    var currentScene: UIWindowScene? {
        connectedScenes
            .first { $0.activationState == .foregroundActive } as? UIWindowScene
    }
}

다음과 같이 사용합니다.

if let scene = UIApplication.shared.currentScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • 범용 원라이너:
if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • 단일 장면 솔루션(iOS용)
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}

iOS(13 이상) 및 macOS용 간단한 솔루션

iOS(Swift 5+):

    if #available(iOS 14.0, *) {
        if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
            SKStoreReviewController.requestReview(in: scene)
        }
    } else if #available(iOS 10.3, *) {
        SKStoreReviewController.requestReview()
    }

macOS: Apple ID를 URL "id123456789"로 바꾸는 것을 잊지 마십시오.

guard let writeReviewURL = URL(string: "https://itunes.apple.com/app/id123456789?action=write-review") else {
      print("Invalid URL")
      return
}
NSWorkspace.shared.open(writeReviewURL)

저는 다른 버전의 ios를 지원하는 번거로움을 덜어주는 작은 포장지를 SKStoreReviewController를 통해 만들었습니다.또한 macOS에서도 작동합니다.

// Review after 3 launches
AppReview.requestIf(launches: 3)

// Review after 5 days
AppReview.requestIf(days: 5)

// Review after 3 launches and 5 days
AppReview.requestIf(launches: 3, days: 5)

https://github.com/mezhevikin/AppReview

iOS 16에는 새로운 방법이 있습니다: https://developer.apple.com/documentation/storekit/requestreviewaction

제 시험에서는 메인 큐에서 그것을 하는 것이 매우 중요합니다.그렇지 않으면 대화를 신뢰할 수 없습니다.

private struct ContentView: View {

    @Environment(\.requestReview) private var requestReview

    var body: some View {
        Button("Ask for Review") {
            DispatchQueue.main.async {
                requestReview()
            }
        }
    }
}

~하듯이SKStoreReviewController.requestReviewios14에서 더 이상 사용되지 않습니다. 를 사용할 수 있습니다.SKStoreReviewController.requestReview(in: scene)ios14부터
샘플코드는아래에있습니다

if #available(iOS 14.0, *) {
    if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
        SKStoreReviewController.requestReview(in: scene)
    }
} else if #available(iOS 10.3, *) {
    SKStoreReviewController.requestReview()
}

언급URL : https://stackoverflow.com/questions/63953891/requestreview-was-deprecated-in-ios-14-0