Last active
March 29, 2019 12:49
-
-
Save Pranit-Harekar/63ae81801e1fa02479fe98ae24030c54 to your computer and use it in GitHub Desktop.
keyboardDisplayRequiresUserAction extension for Webkit class [iOS 12.2 updated]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Foundation | |
| import WebKit | |
| typealias OldClosureType = @convention(c) (Any, Selector, UnsafeRawPointer, Bool, Bool, Any?) -> Void | |
| typealias NewClosureType = @convention(c) (Any, Selector, UnsafeRawPointer, Bool, Bool, Bool, Any?) -> Void | |
| extension WKWebView{ | |
| var keyboardDisplayRequiresUserAction: Bool? { | |
| get { | |
| return self.keyboardDisplayRequiresUserAction | |
| } | |
| set { | |
| self.setKeyboardRequiresUserInteraction(newValue ?? true) | |
| } | |
| } | |
| func setKeyboardRequiresUserInteraction( _ value: Bool) { | |
| guard let WKContentView: AnyClass = NSClassFromString("WKContentView") else { | |
| print("keyboardDisplayRequiresUserAction extension: Cannot find the WKContentView class") | |
| return | |
| } | |
| // For iOS 10, * | |
| let sel_10: Selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:") | |
| // For iOS 11.3, * | |
| let sel_11_3: Selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:") | |
| // For iOS 12.2, * | |
| let sel_12_2: Selector = sel_getUid("_elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:") | |
| if let method = class_getInstanceMethod(WKContentView, sel_10) { | |
| let originalImp: IMP = method_getImplementation(method) | |
| let original: OldClosureType = unsafeBitCast(originalImp, to: OldClosureType.self) | |
| let block : @convention(block) (Any, UnsafeRawPointer, Bool, Bool, Any?) -> Void = { (me, arg0, arg1, arg2, arg3) in | |
| original(me, sel_10, arg0, !value, arg2, arg3) | |
| } | |
| let imp: IMP = imp_implementationWithBlock(block) | |
| method_setImplementation(method, imp) | |
| } | |
| if let method = class_getInstanceMethod(WKContentView, sel_11_3) { | |
| let originalImp: IMP = method_getImplementation(method) | |
| let original: NewClosureType = unsafeBitCast(originalImp, to: NewClosureType.self) | |
| let block : @convention(block) (Any, UnsafeRawPointer, Bool, Bool, Bool, Any?) -> Void = { (me, arg0, arg1, arg2, arg3, arg4) in | |
| original(me, sel_11_3, arg0, !value, arg2, arg3, arg4) | |
| } | |
| let imp: IMP = imp_implementationWithBlock(block) | |
| method_setImplementation(method, imp) | |
| } | |
| if let method = class_getInstanceMethod(WKContentView, sel_12_2) { | |
| let originalImp: IMP = method_getImplementation(method) | |
| let original: NewClosureType = unsafeBitCast(originalImp, to: NewClosureType.self) | |
| let block : @convention(block) (Any, UnsafeRawPointer, Bool, Bool, Bool, Any?) -> Void = { (me, arg0, arg1, arg2, arg3, arg4) in | |
| original(me, sel_12_2, arg0, !value, arg2, arg3, arg4) | |
| } | |
| let imp: IMP = imp_implementationWithBlock(block) | |
| method_setImplementation(method, imp) | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment