Open 77tb opened 4 years ago
iOS 13系统下App使用WKWebView展示网页。
WKWebView
现假设有两个页面foo.html和bar.html,都引入了WebViewJavascriptBridge。其中,foo.html中有如下代码:
foo.html
bar.html
WebViewJavascriptBridge
window.addEventListener("pageshow", myLoadHandler, false);
现进行这些操作:
WKWebView.goBack
结果发现:
回退到foo.html时 myLoadHandler 只在第一次被触发,之后几次都不会了
myLoadHandler
这个不符合 Apple的WebKit Page Cache(其他浏览器叫Back-Forward Cache、bfcache等)的正常行为(应该是每次都触发 pageshow)。
pageshow
经过实验,可能是因为WebViewJavascriptBridge在injectJavascriptFile注入js的时候WebViewJavascriptBridge_js方法中创建了一个隐藏的iframe引起:
injectJavascriptFile
WebViewJavascriptBridge_js
messagingIframe = document.createElement('iframe'); messagingIframe.style.display = 'none'; messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE; document.documentElement.appendChild(messagingIframe);
不知道在现有设计下是否有解决方案? 或者是否考虑在 WKWebView 下使用 WKUserContentController.addScriptMessageHandler 来实现,从而绕开 iframe 的方案?
我已经重构了这个库. 如果您遇到麻烦,可以尝试使用它. 下载地址: https://github.com/housenkui/WebViewJavascriptBridge 它更轻,使用更简单. 10分钟之内应该可以完成接入.
iOS 13系统下App使用
WKWebView
展示网页。现假设有两个页面
foo.html
和bar.html
,都引入了WebViewJavascriptBridge
。其中,foo.html
中有如下代码:window.addEventListener("pageshow", myLoadHandler, false);
现进行这些操作:
foo.html
中的某个链接进入bar.html
,然后WKWebView.goBack
后退到foo.html
。结果发现:
这个不符合 Apple的WebKit Page Cache(其他浏览器叫Back-Forward Cache、bfcache等)的正常行为(应该是每次都触发
pageshow
)。经过实验,可能是因为
WebViewJavascriptBridge
在injectJavascriptFile
注入js的时候WebViewJavascriptBridge_js
方法中创建了一个隐藏的iframe引起:不知道在现有设计下是否有解决方案? 或者是否考虑在 WKWebView 下使用 WKUserContentController.addScriptMessageHandler 来实现,从而绕开 iframe 的方案?