WKWebViewの使用
5810 ワード
WKWebViewはiOS 8.0以降に導入されたもので、iOS 7.0に適合しないパートナーはこのWKWebViewというコントロールを使ってみてもいいです.
WKWebViewとUICbViewの簡単な比較 UICWebViewの欠点:ロード速度が遅く、メモリが多く、もしページをロードしすぎると、メモリを過剰に使用してシステムにキラルされるかもしれません. WKWebViewの利点:1.性能、安定性、メモリ占有率が大きく向上しました.2.JavascriptのNitroライブラリをロードして使用することを許可する3.より多くのHTML 5特性をサポートする4.60 fpsまでのスクロールリフレッシュ率と内蔵ジェスチャー.5.ネットワークのロードの進捗状況を監視し、ついに本当の進捗状況を実現しました.WKWebViewを利用してWeChatのようなウェブページのロードの進捗状況バーがH 5インターフェースに与える影響を実現しました.WKWebViewは300 msのclickイベントを除去して遅延します.スライドページjsが掛けられた問題も修復されました.3.WKWebviewでは、ページAはページBにジャンプしてからページAに戻ります.ScriptとAjaxは再実行されません.(ページreloadをトリガすることもありません.)しかし、ページのPageshow pageHideなどをトリガします.4.WKWebviewでは、ページでキーボードを入力すると、JQueryのresizeイベントが発生しますが、UICWebViewではできません.5.WKWebviewでは、window unloadイベントはリフレッシュだけでトリガされ、ページを終了したり、他のページにジャンプしたりしてもトリガできません.6.WKWebviewでは、ごく少数の場合、特定のページクリックイベントが無効になります.WKWebViewを具体的に使うには、いくつかの適材が必要です.具体的には、WeChatの適合文書を参照することができます.iOS WKWebviewページ開発適合ガイド WKWebViewの使用紹介まずWebKitフレーム を導入する. WKWebViewが提供するJSとの対話方法 WKWebViewは、2つのエージェントを提供しています.navigationDelegateとUDelegate. 注意:今後の開発において、代理方法のblockフィードバックがhandlerのものであれば、必ずこのフィードバックを実現します.そうでなければ、直接にエラーを報告します. WKNavigationDelegateとWKUIDelegateの代理方法
WKWebViewはios 8.0以降に発売されたが、キャッシュをクリアする機能はios 9.0以降に発売された.システムのバージョンを判断すると、プログラムが崩壊する恐れがあります.
WebKitフレームワークは、ドメインをまたぐセキュリティチェックの制限を行いました.例えばHTTPページからHTTPSに対する要求は無効です.しかし、WebKitはドメインをまたぐセキュリティチェックの制限を行いました.ドメインをまたぐことは許されません.
参考文献:1.UICWebViewとWKWebViewの使用とjsのインタラクション2.WKWebViewのWeChatは3.iOS 9 WKWebViewに適合し、キャッシュ4.WKWebViewをクリアするために歩いた10つのピット
WKWebViewとUICbViewの簡単な比較
// js
open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil)
//MARK: ,
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
//MARK:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
decisionHandler(.allow)
}
//MARK:
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
}
//MARK:
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
}
//MARK:
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
}
//MARK:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
}
//MARK:
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
}
WKWebview ,js alert , WKUIDelegate runJavaScriptAlertPanelWithMessage message , alert。 Confirm prompt alert , alert 。
// js alert
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
completionHandler()
printlndebug("alert:\(message)")
// let alert = UIAlertController(title: "", message: message, preferredStyle: .alert)
// alert.addAction(UIAlertAction(title: " ", style: .default, handler: nil))
// self.present(alert, animated: true, completion: nil)
}
// js confirm
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
// let alert = UIAlertController(title: "", message: message, preferredStyle: .alert)
// let ok = UIAlertAction(title: " ", style: .default) { (action) in
// completionHandler(true)
// }
// let cancel = UIAlertAction(title: " ", style: .cancel) { (action) in
// completionHandler(false)
// }
// alert.addAction(ok)
// alert.addAction(cancel)
// self.present(alert, animated: true, completion: nil)
printlndebug("confirm:\(message)")
}
// js prompt
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
printlndebug("prompt:\(prompt)")
}
WKWebViewの整理キャッシュ問題についてWKWebViewはios 8.0以降に発売されたが、キャッシュをクリアする機能はios 9.0以降に発売された.システムのバージョンを判断すると、プログラムが崩壊する恐れがあります.
if #available(iOS 9.0, *) {
let types:Set = [WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeDiskCache]
let dateFrom = Date(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: types, modifiedSince: dateFrom, completionHandler: {
})
} else {
// Fallback on earlier versions
let libraryPath = NSSearchPathForDirectoriesInDomains(.userDirectory, .userDomainMask, true).last
if let cookies = libraryPath?.appending("/Cookies") {
do {
try FileManager.default.removeItem(atPath: cookies)
} catch {
}
}
}
WKWebViewのクロスドメイン問題について:WebKitフレームワークは、ドメインをまたぐセキュリティチェックの制限を行いました.例えばHTTPページからHTTPSに対する要求は無効です.しかし、WebKitはドメインをまたぐセキュリティチェックの制限を行いました.ドメインをまたぐことは許されません.
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
var policy = WKNavigationActionPolicy.allow
if let url = navigationAction.request.url,WKNavigationType.linkActivated == navigationAction.navigationType && url.scheme == "https" {
UIApplication.shared.open(url, options: [:], completionHandler: { (flag) in
policy = WKNavigationActionPolicy.cancel
})
}
decisionHandler(policy)
}
もっと多いWKWebViewを使うには注意が必要なピットについては、ご参考ください.参考文献:1.UICWebViewとWKWebViewの使用とjsのインタラクション2.WKWebViewのWeChatは3.iOS 9 WKWebViewに適合し、キャッシュ4.WKWebViewをクリアするために歩いた10つのピット