WebChromeClient的onConsoleMessage无法捕获嵌套对象,如何提取ckSession?
解决WebView捕获控制台日志时解析嵌套对象获取ckSession的问题
核心原因
Web端直接打印JavaScript对象时,Android的onConsoleMessage收到的是字符串拼接结果,对象会被默认转为[object Object],无法直接获取内部属性。
解决方案
方案1:修改Web端日志输出(优先推荐)
在Web端打印日志时,将对象转为JSON字符串,确保Native端能拿到完整的结构化数据:
// Web端代码示例 const sendCKSessionData = { isICDP: false, ckSession: '46__53__AZ5uHA2kBwzzONCyVNuHNutNbV3SLzNYjfC+s30sru...', permissions: [], appInfo: {} }; // 使用JSON.stringify将对象转为字符串后打印 console.log(`sendCKSession ${JSON.stringify(sendCKSessionData)}`);
方案2:Native端解析JSON字符串
在Android代码中,解析收到的JSON字符串并提取ckSession:
this.setWebChromeClient(object : WebChromeClient() { override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean { val logMessage = consoleMessage.message() // 过滤出sendCKSession相关日志 if (logMessage.startsWith("sendCKSession ")) { val jsonContent = logMessage.substringAfter("sendCKSession ") try { // 使用Gson解析JSON(需添加Gson依赖) val jsonObject = com.google.gson.Gson().fromJson(jsonContent, com.google.gson.JsonObject::class.java) val ckSessionValue = jsonObject.get("ckSession")?.asString Log.d("WebView Console Logs", "提取到ckSession: $ckSessionValue") } catch (e: com.google.gson.JsonSyntaxException) { Log.e("WebView Console Logs", "JSON解析失败: ${e.localizedMessage}") } } else { Log.d("WebView Console Logs", logMessage) } return true } })
添加Gson依赖
在Module级别的build.gradle(或build.gradle.kts)中添加依赖:
dependencies { implementation 'com.google.code.gson:gson:2.10.1' }
方案3:注入JS自动转换对象(无需修改Web端)
如果无法修改Web端代码,可以通过WebView注入JavaScript,重写console.log方法,自动将对象转为JSON字符串:
// 在WebView加载页面完成后注入JS webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) view?.evaluateJavascript(""" // 保存原始console.log方法 const originalConsoleLog = console.log; // 重写console.log,自动转换对象为JSON console.log = function(...args) { const formattedArgs = args.map(item => { if (typeof item === 'object' && item !== null) { return JSON.stringify(item); } return item; }); // 调用原始方法打印格式化后的内容 originalConsoleLog.apply(console, formattedArgs); }; """) { result -> Log.d("WebView", "日志转换JS注入结果: $result") } } }
注入后,Web端所有console.log打印的对象都会被转为JSON字符串,Native端可以按方案2的方式解析提取ckSession。
内容的提问来源于stack exchange,提问作者Mohamed Wasiq
相关产品推荐
相关产品推荐

