WKWebViewdeの簡単な使用とWebページとのインタラクション

7704 ワード

いくつかのAppとWebのインタラクションの方法を整理して、自分で使って他の人と見るのが便利です
一、WKWebView
Xcode 8のリリース後、コンパイラはiOS 7をサポートしなくなったため、私たちのappも最低サポートiOS 8に変更しました.0は、ウェブと対話する必要がある以上、iOS 8.0を使用してから発売する新しいコントロールWKWebViewを選択することになる.UIWebViewに比べて、WKWebViewには多くのメリットがあります.
より多くのHTML 5*の機能をサポート
*パフォーマンス、安定性の向上により、メモリ消費量を大幅に削減
プロトコルの方法と機能がより細かく
*ロードの進行状況などを取得できます.
二、WKWebViewの使い方の紹介
注:ここではWKWebViewの基本的な使い方を簡単に紹介します.その他の具体的な使い方は公式ドキュメントを参照してください.
WebKitの導入が必要

#import


インスタンス化


- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration ;


HTMLページのロード

WKWebViewConfiguration *config =[[WKWebView Configuration alloc]init];

WKWebView *webView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:config];

NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];

[webView loadRequest:request];

[self.view addSubview:webView];


ここではloadRequestだけでいいですUIWebViewと同様に、2つの一般的なエージェントについて簡単に説明します.
三、WKWebViewエージェントWKWebViewには2つのエージェントがあります.


@property (nullable, nonatomic, weak) id navigationDelegate;



@property(nullable, nonatomic, weak) id  UIDelegate;


WKNavigationDelegateプロトコルWKNavigationDelegate主な処理ページジャンプ関連イベント

//          

- (void)webView:(WKWebView *)webViewdecidePolicyForNavigationAction:(WKNavigationAction *)navigationActiondecisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler;

//             

- (void)webView:(WKWebView *)webViewdecidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponsedecisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler;

//         

- (void)webView:(WKWebView *)webViewdidStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation;

//           

- (void)webView:(WKWebView *)webViewdidReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation*)navigation;

//       

- (void)webView:(WKWebView *)webViewdidFailProvisionalNavigation:(null_unspecified WKNavigation *)navigationwithError:(NSError *)error;

//             (    )

- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation*)navigation;

//    

- (void)webView:(WKWebView *)webViewdidFinishNavigation:(null_unspecified WKNavigation *)navigation;

//              

- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecifiedWKNavigation *)navigation withError:(NSError *)error;

// webView           (         )

- (void)webView:(WKWebView *)webViewdidReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengecompletionHandler:(void(^)(NSURLSessionAuthChallengeDisposition disposition,NSURLCredential * _Nullable credential))completionHandler;

// webView web          。(iOS 9.0  )

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView ;


WKUIdelegateプロトコルWKUIDelegateは、警告ボックス、ダイアログボックスなど、主にページ上のイベントを処理します.
一般的な方法:

//       

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString*)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void(^)(void))completionHandler;

//       

- (void)webView:(WKWebView *)webViewrunJavaScriptConfirmPanelWithMessage:(NSString
*)messageinitiatedByFrame:(WKFrameInfo *)frame completionHandler:(void(^)(BOOLresult))completionHandler;

//      

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString*)prompt defaultText:(nullable NSString *)defaultTextinitiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *_Nullable result))completionHandler;


四、WKWebViewとJSのインタラクション
インタラクション方式
iOS 8.0より前UIWebViewでは、OCでJSコードを呼び出すしかないが、JSはOCコードを直接呼び出すことができず、特別な要求を約定し、UIWebViewのプロトコルメソッドで要求をブロックすることでJS対OCの呼び出しを実現する必要がある.
しかし、WKWebViewを使用すると便利で、約束されたScriptMessage(スクリプト情報に直訳し、本稿ではJSイベントと暫定する)の傍受を直接追加することができ、JS呼び出しOCを実現することができる.
すべての操作はWKUserContentControllerによって処理される.
WKUSerContentControlの入手方法WKUserContentControllerWKWebViewConfigurationの属性で、WKWebViewConfigurationWKWebViewの属性(つまりWKWebViewがインスタンス化されたときに渡されたconfiguration)である.

WKUserContentController*conntentController = self.webView.configuration.userContentController;


WKUSerContentControllerについて詳しく説明します.
五、WKUSerContentControl&JS呼び出しOC



@interface WKUserContentController : NSObject

WKUserContentControllerは、JavaScriptがWebビューにメッセージを送信する方法を提供する.
関連メソッドの紹介

//  ScriptMessage(JS  )    

-(void)addScriptMessageHandler:(id)scriptMessageHandler name:(NSString *)name;

//    ScriptMessage(JS  )  

- (void)removeScriptMessageHandlerForName:(NSString*)name;


JSコールOC
ScriptMessage(JSイベント)の追加削除
まずJSコードにあらかじめ約束したScriptMessage(JSイベント)への呼び出しを加える.

window.webkit.messageHandlers..postMessage(       )


同時にOC側はこのJSイベントの傍受に参加する必要がある
たとえば、@closeWindowというメッセージを渡します.

window.webkit.messageHandlers.closeWindow.postMessage()


OC側に@closeWindowというJSの傍受を追加

[conntentControlleraddScriptMessageHandler:self name:@"closeWindow"];


ここでは、@「closeWindow」へのリスニングを追加します.しかし、このJSイベントをキャプチャする際にどのように処理する必要があるかは、対応するプロトコルメソッドで実現する必要があり、scriptMessageHandlerはプロトコルWKScriptMessageHandlerを実現する必要がある
後で紹介します.
@closeWindowというJSイベントのリスニングを削除

[conntentControllerremoveScriptMessageHandlerForName:@"closeWindow"];


WKScriptMessageHandlerプロトコル

//      ScriptMessage(JS  )   

-(void)userContentController:(WKUserContentController *)userContentControllerdidReceiveScriptMessage:(WKScriptMessage *)message;


たとえば、@closeWindowという名前のイベントを処理します.

-(void)userContentController:(WKUserContentController *)userContentControllerdidReceiveScriptMessage:(WKScriptMessage *)message

{

//message.name ScriptMessage   

if([message.name isEqualToString:@"closeWindow"]) {

//   do something

//message.body  ScriptMessage       

}

}


六、OC呼び出しJSUIWebViewと同様にWKWebViewはJSメソッドを直接呼び出すことができる
WKWebViewメソッド

-

(void)evaluateJavaScript:(NSString*)javaScriptString

completionHandler:(void (^ _Nullable)(_Nullable id, NSError* _Nullable

error))completionHandler;


同様にJS側のメソッド名と対応操作のkey値を事前に知る必要がある
例:
Webのある処理の完了を通知する
約定されたJS関数名はfunctionであり、約定された操作名をactionとして実行する必要がある場合、以下のように呼び出される.

[self.webViewevaluateJavaScript:@"function('action')" completionHandler:nil];


七、同期タイトルWKWebViewが存在するUIViewController(ビューコントローラ)はUINavigationControllerナビゲーションコントローラが存在する場合があります.この場合、ジャンプしたページに応じてタイトルを変更する必要がある場合があります.この場合、KVO WKWebViewtitleでよく、最新のtitleUIViewControllertitleでいいです.

[self.webViewaddObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNewcontext:NULL];


-(void)observeValueForKeyPath:(nullable

NSString *)keyPath ofObject:(nullableid)object change:(nullable

NSDictionary *)changecontext:(nullable void *)context

{

if([keyPath isEqualToString:@"title"]){

self.navigationItem.title =self.webView.title;

}

}