// // AppStoreReviewManager.swift // OutLive // // iOS 原生模块:应用内评分管理 // 使用 StoreKit 的 SKStoreReviewController 来请求应用评分 // import Foundation import StoreKit import React @objc(AppStoreReviewManager) class AppStoreReviewManager: NSObject { @objc static func moduleName() -> String! { return "AppStoreReviewManager" } /// 请求应用内评分 /// 这是唯一的公开方法,由 JavaScript 层调用 /// 注意:iOS 系统会自动管理评分请求的频率限制 @objc func requestReview( _ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock ) { DispatchQueue.main.async { // 检查 iOS 版本(SKStoreReviewController 需要 iOS 14.0+) if #available(iOS 14.0, *) { // 获取当前活动的场景 if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene { // 请求评分 SKStoreReviewController.requestReview(in: scene) resolver([ "success": true, "message": "Review request sent successfully" ]) } else { rejecter( "NO_SCENE", "Unable to find active window scene", nil ) } } else { // iOS 14 以下不支持,返回错误 rejecter( "VERSION_NOT_SUPPORTED", "SKStoreReviewController requires iOS 14.0 or later", nil ) } } } /// 检查是否可以请求评分 /// 虽然 iOS 系统会自动限制,但这个方法可以让 JS 层做额外判断 @objc func canRequestReview( _ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock ) { // iOS 14.0+ 支持应用内评分 if #available(iOS 14.0, *) { resolver([ "canRequest": true, "systemVersion": UIDevice.current.systemVersion ]) } else { resolver([ "canRequest": false, "systemVersion": UIDevice.current.systemVersion, "reason": "Requires iOS 14.0 or later" ]) } } @objc static func requiresMainQueueSetup() -> Bool { return true } }