独自のアプリケーション内蔵ブラウザを作成

7675 ワード

私たちのプロジェクトでは、多くの場合、微信内蔵ブラウザのようなWebページのロード形式を実現する必要があります.今日は自分で実現しましょう.
新しいプロパティ
iOS 8の後、アップルは新しいウェブブラウザコントロールWKWebViewを発表した.これまでのUIWebViewに比べて、その主な特徴は明らかだ.
  • は、より良い性能、より高い安定性を提供する
  • は、より多くのHTML 5プロパティ
  • をサポートしています.
  • 最大60 fpsのスクロールリフレッシュ率と豊富な内蔵ジェスチャー
  • メモリ使用量は、UIWebViewの1/3-1/4
  • のみの場合があります.
  • Safariと同じJavaScriptエンジン
  • を有する
  • 最大60 fpsのスクロールリフレッシュ率と豊富な内蔵ジェスチャー
  • フレームワーク解読
  • WKBackForwardListこのオブジェクトはブラウザの前に閲覧したページのリストで、WebViewの前進または後退を通じて記録されたいずれかのページにアクセスできます.これはオブジェクトであり、配列
  • ではありません.
  • WKBackForwardListItemこのオブジェクトは、上のWKBackForwardListのうち
  • に含む.
  • WKFrameInfoは、ウェブページの主な構成情報
  • を含む.
  • WKNavigationAction Webページの構造情報、Webページのインタラクション時にトリガーされるナビゲーションタイプ、Webページのリクエスト情報など
  • を含むWebKitフレームワークの重要なファイルです.
  • WKPreferencesここでユーザは、ウェブページのフォントサイズ、JavaScriptインタラクションを許可するかどうかなどの
  • を構成することができる.
  • WKScriptMessageインタラクションにおける重要なファイル原生用JavaScriptインタラクションに関する場合、このファイルは、原生がインタラクション応答を受信した後に呼び出されるインタフェース名および受信情報データ
  • を提供する.
  • WKScriptMessageHandlerインタラクションの重要なファイルには1つの方法しかありません.JavaScriptでインタラクションを行うと、この方法
  • が実行されます.
  • WKSecurityOriginは、要求されたHostアドレス、ポート番号など、主にウェブページのセキュリティ情報を含む
  • WKUserContentControllerインタラクションにおける重要ファイルには、JavaScriptインタラクション時のインタフェースの登録/削除の方法など
  • が含まれる.
  • WKWebViewの重要なファイルには、WKWebViewの初期化、操作方法、および一連のプロパティ
  • が含まれています.
  • WKWebViewConfigurationの重要なファイルWKWebViewの初期化に必要なオブジェクトです.ここでは、WKWebViewの多くのプロパティを事前に構成できます.
  • WKNavigationDelegateの2つのエージェントの1つです.重要なファイルは、WKWebViewの宣言サイクル全体で、ページがロードされるかどうかを決定し、ページがロードされるかどうかを決定し、ページのロードに成功/失敗した場合にトリガーされるエージェントメソッドです.その対応するメソッドでは、必要に応じて
  • を設定できます.
  • WKUIdelegate 2つのエージェントの2つで、重要なファイルWKWebViewページが作成され、ページのポップアップウィンドウに遭遇したときに対応するトリガが発生する方法
  • があります.
    WKNavigationDelegate
    /**
              WKWebView      /  
    
    @param webView      WKWebView  
    @param navigationAction          ,             
    @param decisionHandler        ,           ,        Block,       。      `WKNavigationActionPolicyCancel`,          ,                
    */
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
    
    /**
           ,      /  
    
     @param webView      WKWebView  
     @param navigationResponse            
     @param decisionHandler            ,           ,        Block,       。      `WKNavigationActionPolicyCancel`,          ,                
     */
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
    
    /**
                
    
     @param webView      WKWebView  
     @param navigation       
     */
    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation
    
    /**
                    
    
     @param webView      WKWebView  
     @param navigation       
     */
    - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation
    
    /**
                       
    
     @param webView      WKWebView  
     @param navigation       
     @param error     
     */
    - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error
    
    /**
                 
    
     @param webView      WKWebView  
     @param navigation       
     */
    - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation
    
    /**
                
    
     @param webView      WKWebView  
     @param navigation       
     */
    - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
    
    /**
                       
    
     @param webView      WKWebView  
     @param navigation       
     @param error     
     */
    - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error
    
    /**
              API, AFN、UIWebView     API    
     */
    - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler
    

    WKUIDelegate
    /**
               ,      WebView
     */
    - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
    
    /**
         JavaScript        
    
     @param webView      WKWebView  
     @param message       
     @param frame       
     @param completionHandler        Block,      
     */
    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
    
    /**
         JavaScript        
     */
    - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler
    
    /**
         JavaScript               
     */
    - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler
    

    WKWebViewとKVO
    WKWebViewには、KVOで傍受できるいくつかの属性があります.
    /**
         
     */
    @property (nullable, nonatomic, readonly, copy) NSString *title;
    
    /**
          URL
     */
    @property (nullable, nonatomic, readonly, copy) NSURL *URL;
    
    /**
             
     */
    @property (nonatomic, readonly, getter=isLoading) BOOL loading;
    
    /**
           
     */
    @property (nonatomic, readonly) double estimatedProgress;
    
    /**
                
     */
    @property (nonatomic, readonly) BOOL hasOnlySecureContent;
    
    /**
     ?
     */
    @property (nonatomic, readonly, nullable) SecTrustRef serverTrust
    
    /**
             
     */
    @property (nonatomic, readonly) BOOL canGoBack;
    
    /**
            
     */
    @property (nonatomic, readonly) BOOL canGoForward;
    

    これらのプロパティについては、- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)contextでリスニングできますが、インタフェースの破棄時にリスニングステータスを削除することを忘れないでください.
    WKWebViewとJavaScriptのインタラクション
    以前、WebViewJavaScriptBridgeサードパーティライブラリを使用してJavaScriptとのオリジナルのインタラクションを行ったことがありますが、このサードパーティライブラリを使用すると、WKUIdelegateは自分では手に入らないという問題があります.これ以上呼び出さない限り、筆者自身はWKWebViewとJavaScriptのインタラクションに使用するファイルを簡単に書きました.ソースコードは工事中にあります.
    筆者はWKWebViewとJavaScriptのインタラクションを研究する過程で,多くのピットを発見した.
  • JavaScript側にデータを送信する場合は、- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandlerメソッドを呼び出すことができます.このうちjavaScriptStringは転送するデータです.これは文字列タイプです.NSDictionary/NSarrayなどのタイプを送信する場合は、まずNSStringタイプ
  • に変換する必要があります.
  • JavaScript端の書き方window.webkit.messageHandlers.YourAPI.postMessage(" JS ");、そのうちYourAPIはあなたが登録したインタフェースの名前で、両側は一致しなければならない.括弧の中のものはJSから伝わったデータで、中はNSStringタイプでなければならない.パラメータは
  • しかない.
    サードパーティ製ライブラリ
    このライブラリは私がプロジェクトの必要とWebKitのフレームワークを学ぶ时に书いたもので、もし同じ需要の友达が使うべきならば、もちろんこのライブラリは完璧ではありませんて、后で私は绝えず修正して最も良いことを求めて、Star/issueを歓迎します
    プレビュー図-`Push Style`
    プレビュー図-`Presended Style`
    License
    WebViewBrowser is released under the MIT license. See LICENSE for details.