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

WKWebView点击菜单二次触发页面重载及postMessage失效问题排查

问题排查:WKWebView与Angular SPA的postMessage及页面重载异常

问题背景

因公司安全政策限制,无法提供完整代码,以下为流程概述及通用代码片段。

场景

  • 带侧边菜单的原生Swift应用,通过WKWebView加载基于Angular 15 + ui-router的单页应用(SPA)
  • 初始加载URL为无哈希的完整路径,示例:https://server.com/path/index.html?flag=value
  • 页面加载完成后,从服务器拉取配置并完成初始化,自动导航至默认状态,最终URL变为:https://server.com/path/index.html?flag=value#/page/main
  • SPA通过window.webkit.messageHandlers.webViewEvent.postMessage()接口向原生应用发送配置数据
  • 原生应用接收数据后,构建包含完整哈希路径的侧边菜单选项,示例链接:https://server.com/path/index.html?flag=value#page/blah

问题表现

  1. 问题1:用户首次点击侧边菜单,SPA能执行对应页面导航操作,但通过postMessage发送的消息未被原生应用接收,无任何日志或报错,用户无反馈
  2. 问题2:再次点击同一菜单选项时,SPA触发全页面重载(不符合SPA无刷新特性),重新拉取配置后,postMessage消息能成功被原生应用接收

特殊情况

该问题仅在特定iOS环境中出现,Android及低版本iOS测试环境下表现正常。

已排查情况

排查过相关技术资料,但未找到有效排查方向。

相关代码片段

前端发送消息代码

callback = (messageToPost: WebViewMessage): void => {  
   this.browserWindow?.webkit?.messageHandlers?.webViewEvent?.postMessage(messageToPost);
};
callback(JSON.stringify(message));

原生接收消息代码

func didReceiveWKScriptMessage(_ message: WKScriptMessage, url: URL?) {
    if message.name == WKWebViewConfiguration.ScriptName.jsWebViewEvent,
                let baseResponse: BaseMessageEventResponse = message.decode() {
        switch baseResponse.messageType {
        
        case .the_message:
            if let messageResponse: TheType = message.decode(),
               // 首次点击时从未执行到此处
            }
}
extension WebBrokerWebViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {        
    viewModel.inputs.didReceiveWKScriptMessage(message, url: message.webView?.url)
}
}

内容的提问来源于stack exchange,提问作者Silvio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:32:34