marcuswestin / WebViewJavascriptBridge

An iOS/OSX bridge for sending messages between Obj-C and JavaScript in UIWebViews/WebViews
http://marcuswest.in
MIT License
14.27k stars 2.98k forks source link

WebKit Page Cache下的`pageshow` 事件问题 #401

Open 77tb opened 4 years ago

77tb commented 4 years ago

iOS 13系统下App使用WKWebView展示网页。

现假设有两个页面foo.htmlbar.html,都引入了WebViewJavascriptBridge。其中,foo.html中有如下代码:

window.addEventListener("pageshow", myLoadHandler, false);

现进行这些操作:

结果发现:

回退到foo.htmlmyLoadHandler 只在第一次被触发,之后几次都不会了

这个不符合 Apple的WebKit Page Cache(其他浏览器叫Back-Forward Cache、bfcache等)的正常行为(应该是每次都触发 pageshow)。

经过实验,可能是因为WebViewJavascriptBridgeinjectJavascriptFile注入js的时候WebViewJavascriptBridge_js方法中创建了一个隐藏的iframe引起:

messagingIframe = document.createElement('iframe');
messagingIframe.style.display = 'none';
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
document.documentElement.appendChild(messagingIframe);

不知道在现有设计下是否有解决方案? 或者是否考虑在 WKWebView 下使用 WKUserContentController.addScriptMessageHandler 来实现,从而绕开 iframe 的方案?

housenkui commented 4 years ago

我已经重构了这个库. 如果您遇到麻烦,可以尝试使用它. 下载地址: https://github.com/housenkui/WebViewJavascriptBridge 它更轻,使用更简单. 10分钟之内应该可以完成接入.