You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:45:04