启动iOS 10.3时,Apple会将评论提示(评级此应用程序)限制为每年3次,并且可以在用户设置中将其关闭。
问:我们如何检测到3次限制已经达到或者用户是否关闭了RTA所以在应用程序中我不会显示弹出窗口:“你喜欢这个应用吗?如果有,你能写吗?评论?[是/否]“因为那时,如果用户点击是,则不会显示任何内容。官方文档中的信息确实不多:https://developer.apple.com/reference/storekit/skstorereviewcontroller
虽然您应该在应用的用户体验流程中调用此方法,但评级/审核请求视图的实际显示受App Store策略的约束。由于此方法可能会或可能不会显示警报,因此在响应按钮点击或其他用户操作时调用它是不合适的。
答案 0 :(得分:9)
询问用户是否喜欢该应用可能会导致您的应用被拒绝。这是一个例子: https://twitter.com/pietbrauer/status/791883047373246464
如果链接在此处死亡,则摘录为Apples响应:
3.2.2 ...您的应用包含可以操纵App Store上的用户评论或图表排名的内容和功能。具体来说,您的应用会过滤用户评论,并且仅指导打算为您的应用评分4到5星的用户在App Store上完成评分...
我个人认为,如果你真的试图解决用户问题,这仍然是一个有效的策略,并且仍然给他们一个机会在之后进行审核,但问题仍然是Apple会不会这样看待。
[SKStoreReviewController requestReview]
进行审核。SKStoreReviewController
的文档建议使用action=write-review
作为查询参数直接转到评论页面。这是一个简单的实现:
// make sure we the current iOS version supports in app reviews
if ([SKStoreReviewController class])
{
NSUInteger windowCount = [UIApplication sharedApplication].windows.count;
[SKStoreReviewController requestReview];
// give the review controller some time to display the popup
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (windowCount < [UIApplication sharedApplication].windows.count)
{
// assume review popup showed instead of some other system alert
// for example show "thank you"
}
else
{
// open app store to leave review
NSURL *reviewUrl = [NSURL URLWithString:@"{your-app-url}?action=write-review"];
[[UIApplication sharedApplication] openURL:reviewUrl];
}
});
}
注意:我还没有将此代码提交到App Store,所以这只是理论上的。
答案 1 :(得分:6)
好吧,您可以尝试触发请求并查看但只要没有回调以及其他正式方法如何检测在您调用请求方法时是否已显示评级警报。
有a way around however - 其中一个StoreKit
类可以调整,以便您可以在评级对话框打开时观察。
UIWindow
- 检查周围提到的方法可能也很有用,但调用方法调用可能更可靠。
你也可以使用像AppRating
这样的评级管理器作为pod,它可以为你管理这些内容,但只能通过计算呼叫并记住它来实现这一目标。
答案 2 :(得分:1)
基于之前对“嗅探”窗口计数的变化做出的回答,这里有一个适用于 Swift 5.4、iOS 10.3 到 14.4 的版本:
func currentWindowCount() -> Int { UIApplication.shared.windows.count }
let initialWindowCount = currentWindowCount()
if #available(iOS 14.0, *) {
if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
SKStoreReviewController.requestReview(in: scene)
}
} else {
SKStoreReviewController.requestReview()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let actuallyShowedPrompt = initialWindowCount < currentWindowCount()
if actuallyShowedPrompt {
// do stuff
}
}
答案 3 :(得分:0)
在苹果官方示例中:
他们正在这样做:
let twoSecondsFromNow = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: twoSecondsFromNow) { [navigationController] in
if navigationController?.topViewController is ProcessCompletedViewController {
SKStoreReviewController.requestReview()
UserDefaults.standard.set(currentVersion, forKey: UserDefaultsKeys.lastVersionPromptedForReviewKey)
}
}
我不知道为什么他们不能简单地从SKStoreReviewController.requestReview()
返回BOOL。