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との対話方法
  • //  js  
     open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil)
    
  • WKWebViewは、2つのエージェントを提供しています.navigationDelegateとUDelegate.
  • 注意:今後の開発において、代理方法のblockフィードバックがhandlerのものであれば、必ずこのフィードバックを実現します.そうでなければ、直接にエラーを報告します.
  • WKNavigationDelegateとWKUIDelegateの代理方法
  • //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つのピット