17

我一直在尝试在 UINavigationController 中堆叠 WKWebViews 作为制作比 PhoneGap 更原生的混合应用程序的方法。它广泛适用 - 当 WKWebView 命中链接时,我会连接到 decisionPolicyForNavigationAction,并使用它想要的链接推送一个新的 ViewController。

但是页面加载很慢。我已经做了我能想到的一切来加速它——它使用 loadHTMLString 而不是请求来确保一切都是本地的——我什至尝试去掉 CSS 和 JS 以查看是否可以加快速度,但没有骰子。一个短的、仅 HTML 的、本地存储的页面仍然需要至少 500 毫秒才能出现在空的 WKWebView 中。我可以从调试中看出延迟不是从磁盘读取 HTML,而是 loadHTMLString() 和 didFinishNavigation() 之间的时间。

有没有人有任何解决这个问题的策略?我会尝试预加载视图,只是我不知道用户要点击哪个链接,所以我不知道要预加载什么。

4

3 回答 3

3

一个临时答案 - 我提前创建了下一个视图,然后使用evaluateJavaScript运行document.body.innerHTML = "content"- 它没有半秒延迟。当然,这意味着比我更早地创建 WKWebview,但希望这不是性能杀手。

于 2014-11-01T22:26:45.763 回答
2

更新:

WKWebView 和 UIWebView 在第一次运行时都会延迟。使用 WKWebView 时更明显。我已经实现了预热 web 视图的类来解决这个问题。您可以在此处找到此解决方案的 Swift 版本:https ://github.com/bernikovich/WebViewWarmUper

原答案:

第一次运行时看起来像 WKWebView/UIWebView 延迟。我创建了一个简单的类,用于通过预热来提高 Web 视图的加载速度。您可以尝试示例项目:https ://github.com/bernikovich/NSTViewWarmuper (不再可用)

于 2017-02-08T09:25:12.847 回答
0

我的方法是少用原生,多用网络。1. 开发一个单页应用程序,例如http://m.ftchinese.com/phone.html 2. 将所有资源(JS、CSS、Graphics as Base64)捆绑到一个文件中。3. 将该文件保存到我的 Xcode 项目并使用该文件启动应用程序,将 baseURL 设置为http://m.ftchinese.com/phone.html

这里的代码:

let templatepath = NSBundle.mainBundle().pathForResource("index", ofType: "html")!
let base = NSURL(string: "http://m.ftchinese.com")
var s = NSString(contentsOfFile:templatepath, encoding:NSUTF8StringEncoding, error:nil)!
self.webView!.loadHTMLString(s, baseURL:base)

这有一些好处: 1. 我已经在 web 应用程序上工作了很多年,所以它非常稳定。2. 相同的方法可用于 Android、Windows Phone 和 Blackberry。3. SPA 没有分页加载。感觉非常顺滑。

于 2015-01-06T13:57:06.323 回答