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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:32:36