feat(review): 集成iOS应用内评分功能
- 新增iOS原生模块AppStoreReviewManager,封装StoreKit评分请求 - 实现appStoreReviewService服务层,管理评分请求时间间隔(14天) - 在关键用户操作后触发评分请求:完成挑战、记录服药、记录体重、记录饮水 - 优化通知设置页面UI,改进设置项布局和视觉层次 - 调整用药卡片样式,优化状态显示和文字大小 - 新增配置检查脚本check-app-review-setup.sh - 修改喝水提醒默认状态为关闭 评分请求策略: - 仅iOS 14.0+支持 - 自动控制请求频率,避免过度打扰用户 - 延迟1秒执行,不阻塞主业务流程 - 所有评分请求均做错误处理,确保不影响核心功能
This commit is contained in:
85
ios/OutLive/AppStoreReviewManager.swift
Normal file
85
ios/OutLive/AppStoreReviewManager.swift
Normal file
@@ -0,0 +1,85 @@
|
||||
//
|
||||
// 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user