如何检测WKWebView内TextField被点击及用户开始/停止输入的状态
WKWebView输入框开始/停止输入事件监听方案
方案1:JS注入 + WKScriptMessageHandler 通信(无私有API,审核兼容)
该方案为苹果官方允许的WKWebView交互方式,完全针对WKWebView内的输入事件,不会和原生输入框的事件冲突,也不需要监听全局键盘通知。
- 第一步:初始化WKWebView时配置自定义交互逻辑
let config = WKWebViewConfiguration() let userContent = WKUserContentController() // 注册消息处理器,接收JS侧传来的输入状态变更通知 userContent.add(self, name: "inputStateChange") // 注入监听输入事件的JS代码,页面加载完成后注入 let jsCode = """ // 用事件委托监听整个文档的focus、blur事件,兼容动态生成的输入框 document.addEventListener('focus', (e) => { const tag = e.target.tagName.toLowerCase(); // 只匹配输入框、文本域,或者contenteditable为true的可编辑元素 if (tag === 'input' || tag === 'textarea' || e.target.isContentEditable) { window.webkit.messageHandlers.inputStateChange.postMessage({type: 'begin'}); } }, true); document.addEventListener('blur', (e) => { const tag = e.target.tagName.toLowerCase(); if (tag === 'input' || tag === 'textarea' || e.target.isContentEditable) { window.webkit.messageHandlers.inputStateChange.postMessage({type: 'end'}); } }, true); """ let userScript = WKUserScript(source: jsCode, injectionTime: .atDocumentEnd, forMainFrameOnly: false) userContent.addUserScript(userScript) config.userContentController = userContent let webView = WKWebView(frame: .zero, configuration: config)
- 第二步:实现WKScriptMessageHandler代理,接收输入状态变更
extension YourViewController: WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { guard message.name == "inputStateChange", let body = message.body as? [String: String], let type = body["type"] else { return } switch type { case "begin": // WKWebView内输入框开始输入的逻辑 print("用户开始在WKWebView输入框输入") case "end": // WKWebView内输入框结束输入的逻辑 print("用户停止在WKWebView输入框输入") default: break } } }
注意:如果需要监听iframe内的输入事件,把
forMainFrameOnly参数设为false即可覆盖所有子帧。
方案2:KVO监听属性(存在审核风险,不推荐上架使用)
WKWebView存在未公开的私有属性_hasActiveFocusedNode,可以通过KVO监听该属性的值变化来判断是否有输入框处于激活状态,但该属性属于私有API,上架有被苹果拒绝的风险,仅可用于内部测试场景。
监听的keypath为_hasActiveFocusedNode,值为true时代表开始输入,false时代表结束输入。
内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

