WKWebViewdeの簡単な使用とWebページとのインタラクション
7704 ワード
いくつかのAppとWebのインタラクションの方法を整理して、自分で使って他の人と見るのが便利です
一、WKWebView
Xcode 8のリリース後、コンパイラはiOS 7をサポートしなくなったため、私たちのappも最低サポートiOS 8に変更しました.0は、ウェブと対話する必要がある以上、iOS 8.0を使用してから発売する新しいコントロール
より多くのHTML 5*の機能をサポート
*パフォーマンス、安定性の向上により、メモリ消費量を大幅に削減
プロトコルの方法と機能がより細かく
*ロードの進行状況などを取得できます.
二、WKWebViewの使い方の紹介
注:ここでは
WebKitの導入が必要
インスタンス化
HTMLページのロード
ここではloadRequestだけでいいです
三、WKWebViewエージェント
WKNavigationDelegateプロトコル
WKUIdelegateプロトコル
一般的な方法:
四、WKWebViewとJSのインタラクション
インタラクション方式
iOS 8.0より前
しかし、
すべての操作は
WKUSerContentControlの入手方法
WKUSerContentControllerについて詳しく説明します.
五、WKUSerContentControl&JS呼び出しOC
関連メソッドの紹介
JSコールOC
ScriptMessage(JSイベント)の追加削除
まずJSコードにあらかじめ約束したScriptMessage(JSイベント)への呼び出しを加える.
同時にOC側はこのJSイベントの傍受に参加する必要がある
たとえば、@closeWindowというメッセージを渡します.
OC側に@closeWindowというJSの傍受を追加
ここでは、@「closeWindow」へのリスニングを追加します.しかし、このJSイベントをキャプチャする際にどのように処理する必要があるかは、対応するプロトコルメソッドで実現する必要があり、
後で紹介します.
@closeWindowというJSイベントのリスニングを削除
WKScriptMessageHandlerプロトコル
たとえば、@closeWindowという名前のイベントを処理します.
六、OC呼び出しJS
WKWebViewメソッド
同様にJS側のメソッド名と対応操作のkey値を事前に知る必要がある
例:
Webのある処理の完了を通知する
約定されたJS関数名はfunctionであり、約定された操作名をactionとして実行する必要がある場合、以下のように呼び出される.
七、同期タイトル
一、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の入手方法
WKUserContentController
はWKWebViewConfiguration
の属性で、WKWebViewConfiguration
はWKWebView
の属性(つまり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呼び出しJS
UIWebView
と同様に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 WKWebView
のtitle
でよく、最新のtitle
をUIViewController
のtitle
でいいです.
[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;
}
}