MAUI iOS中访问RequestReviewAction方法(替代过时SKStoreReviewController)
在MAUI C#中实现iOS 18+应用评分请求(替代SKStoreReviewController)
由于iOS 18.0起SKStoreReviewController已过时,苹果推荐使用SwiftUI的RequestReviewAction。在MAUI C#中可通过平台特定代码块或依赖服务实现,以下是具体方案:
方案一:平台特定代码块(快速实现,无需额外架构)
直接在MAUI共享项目中编写条件编译代码,兼容iOS 18及以下版本:
using UIKit; #if IOS18_0_OR_GREATER using SwiftUI; #endif // 调用此方法触发评分请求 private void TriggerAppReview() { #if IOS18_0_OR_GREATER // 获取当前活跃窗口与根视图控制器 var windowScene = UIApplication.SharedApplication.ConnectedScenes .OfType<UIWindowScene>() .FirstOrDefault(); var keyWindow = windowScene?.Windows.FirstOrDefault(w => w.IsKeyWindow); var rootVC = keyWindow?.RootViewController; if (rootVC == null) return; // 创建空SwiftUI视图的HostingController,用于获取RequestReviewAction环境变量 var hostingVC = new UIHostingController<EmptyReviewView>(new EmptyReviewView()); // 临时展示HostingController(用户无感知),调用评分请求后立即关闭 rootVC.Present(hostingVC, animated: false, () => { hostingVC.View.RequestReview(); hostingVC.DismissViewController(true, null); }); // 定义空SwiftUI视图内部类 private class EmptyReviewView : View { } #else // iOS 18以下版本使用旧API StoreKit.SKStoreReviewController.RequestReview(); #endif }
方案二:依赖服务(符合MAUI架构规范)
1. 共享项目定义接口
在MAUI共享项目中创建评分服务接口:
public interface IAppReviewService { void RequestReview(); }
2. iOS平台实现服务
在Platforms/iOS目录下创建实现类,并注册依赖服务:
using Foundation; using SwiftUI; using UIKit; [assembly: Dependency(typeof(IOSAppReviewService))] namespace YourAppNamespace.Platforms.iOS { public class IOSAppReviewService : IAppReviewService { public void RequestReview() { var windowScene = UIApplication.SharedApplication.ConnectedScenes .OfType<UIWindowScene>() .FirstOrDefault(); var keyWindow = windowScene?.Windows.FirstOrDefault(w => w.IsKeyWindow); var rootVC = keyWindow?.RootViewController; if (rootVC == null) return; var hostingVC = new UIHostingController<EmptyReviewView>(new EmptyReviewView()); rootVC.Present(hostingVC, animated: false, () => { hostingVC.View.RequestReview(); hostingVC.DismissViewController(true, null); }); } private class EmptyReviewView : View { } } }
3. 共享项目调用服务
在需要触发评分的位置调用:
DependencyService.Get<IAppReviewService>()?.RequestReview();
注意事项
- 若iOS项目未引用SwiftUI,可在
Platforms/iOS/YourApp.csproj中添加:<FrameworkReference Include="SwiftUI" /> - 严格遵循苹果调用规则:每365天最多触发3次评分请求,不可在应用启动等非用户主动操作场景调用
- 测试时需使用TestFlight或App Store Connect测试版本,模拟器可能无法弹出评分窗口
内容的提问来源于stack exchange,提问作者Luke Vo
相关产品推荐
相关产品推荐

