ios - 检测 iOS 10.3 应用评级对话框显示的机制?

标签 ios storekit skstorereviewcontroller

TL;DR:在 iOS 上是否有某种方法可以检测 iOS 10.3 中添加的 Storekit App Rating 对话框的存在/显示?

我最近添加了对新 app rating dialog 的支持我的应用程序使用:

[SKStoreReviewController requestReview];

但是,我知道有一些使用注意事项(如 documented here ),即在调用上述函数时可能会或可能不会显示对话框,除非客户已经对应用程序进行了评级或客户已关闭对话 3 次。

我还知道 Apple 不希望用户操作直接调用对话框的显示,因此要报告对话框的存在:

Although you should call this method when it makes sense in the user experience flow of your app, the actual display of a rating/review request view is governed by App Store policy. Because this method may or may not present an alert, it's not appropriate to call it in response to a button tap or other user action.

但这并不能阻止 UX 团队将这些按钮放在图形设计中并询问“我们可以知道是否显示了对话框”吗?

那么,我的问题是,是否有其他间接方式可以确定此对话框的呈现方式?

我最近一直在使用 Appium 对 Android 和 iOS 应用程序进行一些自动化测试,并使用 Xpaths 来查找 native UI 元素,所以我想知道是否可以在 iOS 应用程序的上下文中实现相同的目的。

最佳答案

你的问题让我开始思考,这比我想象的要容易。

我的第一个想法是检查与 UIWindow 相关的东西 - 快速浏览 the documentation透露,有 UIWindow 相关的通知 - 太棒了!我做了一个快速项目,订阅了所有项目并展示了审查 Controller 。这在日志中弹出:

method : windowDidBecomeVisibleNotification:  
object -> <SKStoreReviewPresentationWindow: 0x7fe14bc03670; baseClass = UIApplicationRotationFollowingWindow; frame = (0 0; 414 736); opaque = NO; gestureRecognizers = <NSArray: 0x61800004de30>; layer = <UIWindowLayer: 0x61800003baa0>>

因此,为了检测是否显示了审查 Controller ,您需要订阅一个通知并检查它的 object 属性以找出它的类:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(windowDidBecomeVisibleNotification:)
                                                 name:UIWindowDidBecomeVisibleNotification
                                               object:nil];
}

- (void)windowDidBecomeVisibleNotification:(NSNotification *)notification {
    if ([notification.object isKindOfClass:NSClassFromString(@"SKStoreReviewPresentationWindow")]) {
        NSLog(@"the review request was shown!");
    }
}

请记住 SKStoreReviewPresentationWindow 不可公开访问 - 因此您不能简单地编写 [SKStoreReviewPresentationWindow class],然后使用 NSClassFromString 欺骗系统 就是这样 - 欺骗系统。不幸的是,另一个最有趣的通知 UIWindowDidResignKey 没有发出 - 我希望主窗口会退出,但不幸的是没有。一些进一步的调试还表明主窗口仍然是关键的并且没有隐藏。您当然可以尝试将 notification.object[UIApplication sharedApplication].window 进行比较,但还显示了其他窗口 - UITextEffectsWindowUIRemoteKeyboardWindow,尤其是当第一次显示警报时,它们都不是公开的。

我认为这个解决方案是一个 hack - 它很容易被 Apple 更改而破坏它。但最重要的是,这可能是审查期间拒绝的理由,因此使用风险自负。我在 iPhone 7+ 模拟器、iOS 10.3、Xcode 8.3.2 上对此进行了测试


现在,既然我们现在知道可以有点检测是否显示了审查 Controller ,一个更有趣的问题是如何检测它是否显示.你需要引入一些超时,之后你会做一些事情,因为没有显示警报。这感觉就像您的应用程序被挂起,因此这对您的用户来说是一种糟糕的体验。另外,我注意到审查 Controller 没有立即显示,所以苹果不建议在按下按钮后显示它更有意义。

关于ios - 检测 iOS 10.3 应用评级对话框显示的机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43745157/

相关文章:

ios - 使用 Swift 从 Firebase 数据库创建过滤 TableView 的最佳方法是什么

ios - WatchKit NSAppTransportSecurity 错误

ios - iOS 应用程序的收据验证码,不起作用

iphone - SKStoreProductViewController 和 GKHostedAuthenticateViewController 没有 iPhone 横向模式

iphone - 尝试使用 AdMob 运行应用时出现奇怪的错误

ios - ld : -bundle and -bitcode_bundle cannot be used together

ios - 沙盒应用程序内购买恢复以前登录的 Apple 帐户的购买

android - 是否存在适用于 Android 的相当于 IOS 的 SKStoreReviewController 的类?

ios - 仅使用 SKStoreReviewController 或 iOS 中的替代品对应用进行评分

ios - 为什么 SKStoreReviewController 不允许我提交评论?