首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于SKStoreReviewController.requestReview()的回调

关于SKStoreReviewController.requestReview()的回调
EN

Stack Overflow用户
提问于 2019-01-02 15:19:36
回答 2查看 2.7K关注 0票数 6

如果从视图控制器启动的检查弹出显示出来,当弹出窗口由于缺少SKStoreReviewController.requestReview()的回调函数而被取消时,无法将窗口焦点切换回视图控制器。

当弹出的评论被驳回时,我想给becomeFirstResponder()打个电话。有什么想法吗?

有没有一种方法可以扩展SKStoreReviewController并以某种方式添加回调?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-15 22:10:59

警告说,这可能会在某一时刻打破。

步骤1:将此代码添加到您的didFinishLaunchingWithOptions

代码语言:javascript
复制
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let windowClass: AnyClass = UIWindow.self

    let originalSelector: Selector = #selector(setter: UIWindow.windowLevel)
    let swizzledSelector: Selector = #selector(UIWindow.setWindowLevel_startMonitor(_:))

    let originalMethod = class_getInstanceMethod(windowClass, originalSelector)
    let swizzledMethod = class_getInstanceMethod(windowClass, swizzledSelector)

    let didAddMethod = class_addMethod(windowClass, originalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!))

    if didAddMethod {
        class_replaceMethod(windowClass, swizzledSelector, method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!))
    } else {
        method_exchangeImplementations(originalMethod!, swizzledMethod!)
    }

    return true
}

步骤2:添加这个类

代码语言:javascript
复制
class MonitorObject: NSObject {
    weak var owner: UIWindow?

    init(_ owner: UIWindow?) {
        super.init()
        self.owner = owner
        NotificationCenter.default.post(name: UIWindow.didBecomeVisibleNotification, object: self)
    }

    deinit {
         NotificationCenter.default.post(name: UIWindow.didBecomeHiddenNotification, object: self)
    }
}

步骤3:添加这个UIWindow扩展

代码语言:javascript
复制
private var monitorObjectKey = "monitorKey"
private var partialDescForStoreReviewWindow = "SKStore"

extension UIWindow {
    // MARK: - Method Swizzling
    @objc func setWindowLevel_startMonitor(_ level: Int) {
        setWindowLevel_startMonitor(level)

        if description.contains(partialDescForStoreReviewWindow) {
             let monObj = MonitorObject(self)
             objc_setAssociatedObject(self, &monitorObjectKey, monObj, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

第4步:将它添加到控制器的ViewDidLoad中,在您想要的地方

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeHiddenNotification(_:)), name: UIWindow.didBecomeHiddenNotification, object: nil)
}

步骤5:为通知添加回调并检查关联对象是否匹配

代码语言:javascript
复制
@objc func windowDidBecomeHiddenNotification(_ notification: Notification?) {
    if notification?.object is MonitorObject {
        print("hello")
    }
}

现在,当检查对话框关闭时,会触发通知并调用'print("hello")。

票数 2
EN

Stack Overflow用户

发布于 2020-03-06 06:36:13

有时,iOS应用程序会丢失响应链,就像上面显示StoreKit提示的例子一样。我们所能做的就是在UIApplication.sendAction中检测这样的事件,并通过becomeFirstResponder重新激活第一个响应链。UIKit将重新建立第一个响应链,我们可以重新发送相同的事件。

代码语言:javascript
复制
class MyApplication: UIApplication {

    func reactivateResponderChainWhenFirstResponderEventWasNotHandled() {
        becomeFirstResponder()
    }

    override func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool {
        let wasHandled = super.sendAction(action, to: target, from: sender, for: event)
        if wasHandled == false, target == nil {
            reactivateResponderChainWhenFirstResponderEventWasNotHandled()
            return super.sendAction(action, to: target, from: sender, for: event)
        }
        return wasHandled
    }
}

这对我适用于iOS 13,不需要任何私有API访问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54008845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档