在 WKWebView 中启用 console.log

本文介绍如何在Swift中使用WKWebView,并实现从JavaScript控制台输出日志信息。通过实现WKScriptMessageHandler协议和重新定义console.log方法,可以在Xcode调试窗口中查看JavaScript日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tags:ios, swift

随着 UIWebView 被Apple 放弃,开发者被迫转向 WKWebView 。可是WKWebView 的完成度极差,还有很多坑。很多人都在和这些坑战斗,比如这里 就列出了不少问题。

最近在和 WKWebView 战斗,需要将 javascript中通过console.log 打印的信息通过控制台输出。研究了一下,方案如下:

Swift 端

首先需要实现 WKScriptMessageHandleruserContentController 方法:

extension ViewController: WKScriptMessageHandler {
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage){
        let body = message.body as! String
        if message.name == "logger" {
            print("JS log:\(body)")
            return
        }
          //Other logic
    }
复制代码

在创建 WKWebVeiw实例时将ViewController 添加到configuration中:

let webConfiguration = WKWebViewConfiguration()
        webConfiguration.userContentController.add(self, name: "logger")
        
        _browser = WKWebView(frame: CGRect.zero, configuration: webConfiguration)
复制代码

Javascript 端

在javascript中重新声明console.log:

<script>
            var console = {};
            console.log = function(message){window.webkit.messageHandlers['logger'].postMessage(message)
            };
</script>
复制代码

这段 javascript 代码可以放在模版文件中,也可以在加载 WKWebView 时动态注入进去。

这样你就可以在 XCode 的调试窗口看到 javascript 输出的信息了:

Happy coding!

转载于:https://juejin.im/post/5a615030f265da3e283a12b7

map.html?key=f3323c24769b10828db07f07c0fcec0d&points=%5B%7B%22lng%22%3A106.235589%2C%22lat%22%3A38.45766%2C%22name%22%3A%22%E8%B5%B7%E7%82%B9%22%7D%2C%7B%22lng%22%3A106.287761%2C%22lat%22%3A38.4710595%2C%22name%22%3A%22%E9%BC%93%E6%A5%BC%22%7D%5D&markers=%5B%7B%22lng%22%3A106.28776197503275%2C%22lat%22%3A38.47105952636814%2C%22title%22%3A%22%E9%BC%93%E6%A5%BC%22%7D%2C%7B%22lng%22%3A106.01313200136352%2C%22lat%22%3A38.434956774850576%2C%22title%22%3A%22%E8%A5%BF%E5%A4%8F%E9%99%B5%22%7D%2C%7B%22lng%22%3A106.235068%2C%22lat%22%3A38.484468%2C%22title%22%3A%22%E5%AE%81%E5%A4%8F%E5%8D%9A%E7%89%A9%E9%A6%86%22%7D%2C%7B%22lng%22%3A106.123554%2C%22lat%22%3A38.231086%2C%22title%22%3A%22%E5%AE%81%E5%A4%8F%E5%B7%A5%E5%A7%94%E7%BA%AA%E5%BF%B5%E9%A6%86%22%7D%2C%7B%22lng%22%3A105.975629%2C%22lat%22%3A38.244193%2C%22title%22%3A%22%E9%97%BD%E5%AE%81%E6%96%B0%E8%B2%8C%E5%B1%95%E7%A4%BA%E4%B8%AD%E5%BF%83%22%7D%2C%7B%22lng%22%3A106.381172%2C%22lat%22%3A38.566882%2C%22title%22%3A%22%E7%81%B5%E6%AD%A6%E5%B8%82%E5%9B%BD%E5%AE%B6%E7%94%9F%E6%80%81%E6%96%87%E6%98%8E%E6%95%99%E8%82%B2%E5%9F%BA%E5%9C%B0%22%7D%2C%7B%22lng%22%3A106.584342%2C%22lat%22%3A38.159979%2C%22title%22%3A%22%E5%9B%BD%E5%AE%B6%E8%83%BD%E6%BA%90%E9%9B%86%E5%9B%A2%E5%AE%81%E5%A4%8F%E7%85%A4%E4%B8%9A%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E5%AE%9E%E8%B7%B5%E6%95%99%E8%82%B2%E5%9F%BA%E5%9C%B0%22%7D%5D:107 Uncaught ReferenceError: uni is not defined at sendMessageToUniApp (map.html?key=f3323c24769b10828db07f07c0fcec0d&points=%5B%7B%22lng%22%3A106.235589%2C%22lat%22%3A38.45766%2C%22name%22%3A%22%E8%B5%B7%E7%82%B9%22%7D%2C%7B%22lng%22%3A106.287761%2C%22lat%22%3A38.4710595%2C%22name%22%3A%22%E9%BC%93%E6%A5%BC%22%7D%5D&markers=%5B%7B%22lng%22%3A106.28776197503275%2C%22lat%22%3A38.47105952636814%2C%22title%22%3A%22%E9%BC%93%E6%A5%BC%22%7D%2C%7B%22lng%22%3A106.01313200136352%2C%22lat%22%3A38.434956774850576%2C%22title%22%3A%22%E8%A5%BF%E5%A4%8F%E9%99%B5%22%7D%2C%7B%22lng%22%3A106.235068%2C%22lat%22%3A38.484468%2C%22title%22%3A%22%E5%AE%81%E5%A4%8F%E5%8D%9A%E7%89%A9%E9%A6%86%22%7D%2C%7B%22lng%22%3A106.123554%2C%22lat%22%3A38.231086%2C%22title%22%3A%22%E5%AE%81%E5%A4%8F%E5%B7%A5%E5%A7%94%E7%BA%AA%E5%BF%B5%E9%A6%86%22%7D%2C%7B%22lng%22%3A105.975629%2C%22lat%22%3A38.244193%2C%22title%22%3A%22%E9%97%BD%E5%AE%81%E6%96%B0%E8%B2%8C%E5%B1%95%E7%A4%BA%E4%B8%AD%E5%BF%83%22%7D%2C%7B%22lng%22%3A106.381172%2C%22lat%22%3A38.566882%2C%22title%22%3A%22%E7%81%B5%E6%AD%A6%E5%B8%82%E5%9B%BD%E5%AE%B6%E7%94%9F%E6%80%81%E6%96%87%E6%98%8E%E6%95%99%E8%82%B2%E5%9F%BA%E5%9C%B0%22%7D%2C%7B%22lng%22%3A106.584342%2C%22lat%22%3A38.159979%2C%22title%22%3A%22%E5%9B%BD%E5%AE%B6%E8%83%BD%E6%BA%90%E9%9B%86%E5%9B%A2%E5%AE%81%E5%A4%8F%E7%85%A4%E4%B8%9A%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E5%AE%9E%E8%B7%B5%E6%95%99%E8%82%B2%E5%9F%BA%E5%9C%B0%22%7D%5D:107:32) at t.<anonymous> (map.html?key=f3323c24769b10828db07f07c0fcec0d&points=%5B%7B%22lng%22%3A106.235589%2C%22lat%22%3A38.45766%2C%22name%22%3A%22%E8%B5%B7%E7%82%B9%22%7D%2C%7B%22lng%22%3A106.287761%2C%22lat%22%3A38.4710595%2C%22name%22%3A%22%E9%BC%93%E6%A5%BC%22%7D%5D&markers=%5B%7B%22lng%22%3A106.28776197503275%2C%22lat%22%3A38.47105952636814%2C%22title%22%3A%22%E9%BC%93%E6%A5%BC%22%7D%2C%7B%22lng%22%3A106.01313200136352%2C%22lat%22%3A38.434956774850576%2C%22title%22%3A%22%E8%A5%BF%E5%A4%8F%E9%99%B5%22%7D%2C%7B%22lng%22%3A106.235068%2C%22lat%22%3A38.484468%2C%22title%22%3A%22%E5%AE%81%E5%A4%8F%E5%8D%9A%E7%89%A9%E9%A6%86%22%7D%2C%7B%22lng%22%3A106.123554%2C%22lat%22%3A38.231086%2C%22title%22%3A%22%E5%AE%81%E5%A4%8F%E5%B7%A5%E5%A7%94%E7%BA%AA%E5%BF%B5%E9%A6%86%22%7D%2C%7B%22lng%22%3A105.975629%2C%22lat%22%3A38.244193%2C%22title%22%3A%22%E9%97%BD%E5%AE%81%E6%96%B0%E8%B2%8C%E5%B1%95%E7%A4%BA%E4%B8%AD%E5%BF%83%22%7D%2C%7B%22lng%22%3A106.381172%2C%22lat%22%3A38.566882%2C%22title%22%3A%22%E7%81%B5%E6%AD%A6%E5%B8%82%E5%9B%BD%E5%AE%B6%E7%94%9F%E6%80%81%E6%96%87%E6%98%8E%E6%95%99%E8%82%B2%E5%9F%BA%E5%9C%B0%22%7D%2C%7B%22lng%22%3A106.584342%2C%22lat%22%3A38.159979%2C%22title%22%3A%22%E5%9B%BD%E5%AE%B6%E8%83%BD%E6%BA%90%E9%9B%86%E5%9B%A2%E5%AE%81%E5%A4%8F%E7%85%A4%E4%B8%9A%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E5%AE%9E%E8%B7%B5%E6%95%99%E8%82%B2%E5%9F%BA%E5%9C%B0%22%7D%5D:193:7) at f.emit (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:209434) at z.eval (eval at nS (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:195319), <anonymous>:1:6153) at f.emit (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:209434) at z.emit (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:985864) at n.ci (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:727096) at n.fireEvent (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:723206) at n.tt (maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster:1:724624)// 绑定聚合点点击事件 cluster.on('click', function(e) { console.log(e, 'bbbbb'); const clusterData = e.clusterData; sendMessageToUniApp({ type: 'clusterClick', count: clusterData.length, center: clusterData.center }); }); function sendMessageToUniApp(data) { const payload = JSON.stringify(data); console.log('uni', window, uni); if (window.uni && uni.postMessage) { console.log('uni', window, uni); uni.postMessage({ data: payload }); } else if (window.parent) { console.log('window', window); window.parent.postMessage({ type: 'webviewMessage', data: payload }, '*'); } }
最新发布
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值