我一直在尝试在UINavigationController中堆叠WKWebViews,作为制作比PhoneGap更原生的混合应用程序的方法。它广泛使用 - 当WKWebView访问链接时我挂钩到decisionPolicyForNavigationAction,并推送一个带有它想要的链接的新ViewController。
但页面加载速度很慢。我已经做了我能想到的所有事情来加速它 - 它使用loadHTMLString而不是确保一切都是本地的请求 - 我甚至试图剥离CSS和JS来看看它是否能加速,但没有骰子。对于一个简短的,仅限HTML,本地存储的页面,它仍然需要至少500毫秒才能显示在空的WKWebView中。我可以从调试中看出延迟不是从磁盘读取HTML,而是在loadHTMLString()和didFinishNavigation()之间的时间。
有没有人有任何解决这个问题的策略?我试着预加载视图,只是我不知道用户要点击哪个链接所以我不知道要预加载什么。
答案 0 :(得分:3)
临时答案 - 我提前创建了下一个视图,然后使用evaluateJavaScript
运行document.body.innerHTML = "content"
- 它没有半秒延迟。当然,这意味着比我更早地创建一个WKWebview,但希望这不是一个性能杀手。
答案 1 :(得分:2)
<强>更新强>
WKWebView和UIWebView在首次运行时都会延迟。使用WKWebView时更加明显。我已经实现了一个预热Web视图的类来解决这个问题。您可以在此处找到此解决方案的Swift版本:https://github.com/bernikovich/WebViewWarmUper
原始回答:
首次运行时看起来WKWebView / UIWebView会延迟。我已经创建了一个简单的类来提高Web视图的加载速度和预热。您可以尝试示例项目:https://github.com/bernikovich/NSTViewWarmuper(不再提供)
答案 2 :(得分:0)
我的方式是减少原生和更多的网络。 1.制定单页应用,例如http://m.ftchinese.com/phone.html 2.将每个资源(JS,CSS,Graphics作为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.我已经在网络应用程序上工作了很多年,所以它非常稳定。 2.可以在Android,Windows Phone和Blackberry上使用相同的方法。 3. SPA没有分页加载。感觉非常顺畅。