代码之家  ›  专栏  ›  技术社区  ›  zs2020

关于skstoreReviewController.requestReview()的回调

  •  4
  • zs2020  · 技术社区  · 7 年前

    如果从视图控制器启动的查看弹出窗口出现,则当弹出窗口由于缺少以下回调功能而被取消时,无法将窗口焦点切换回视图控制器: SKStoreReviewController.requestReview() .

    我想打个电话给 becomeFirstResponder() 当审查弹出窗口被取消时。有什么想法吗?

    有没有办法延长 skstorereview控制器 然后添加一个回调?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Dylan    7 年前

    警告:这可能会在某个时刻中断。

    步骤1:将此代码添加到DidFinishLaunchWithOptions中

    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:添加此类

    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扩展

    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中

    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:添加通知的回调并检查关联对象是否匹配

    @objc func windowDidBecomeHiddenNotification(_ notification: Notification?) {
        if notification?.object is MonitorObject {
            print("hello")
        }
    }
    

    现在,当审查对话框关闭时,将触发通知并调用“打印”(“hello”)。