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:用户首次点击侧边菜单,SPA能执行对应页面导航操作,但通过postMessage发送的消息未被原生应用接收,无任何日志或报错,用户无反馈
- 问题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
相关产品推荐
相关产品推荐

