iOSでのOCとJSのインタラクション(WKWebview-MessageHandler実装)


開発の過程で、iOSでwebページのロードを実現するには主に2つのコントロールがあり、UIWebViewとWKWebviewで、2つのコントロールは具体的な実現方法に対応しています.WKWebViewはアップル社がiOS 8システムで発売したもので、ここでは主にWebKitで更新されたWKWebViewコントロールの新しい特性と使用方法について概説します.
##一、WKWebViewの代理方法
1.WKNavigationDelegate
このエージェントが提供する方法は、ロードプロセス(ページのロード開始、ロード完了、ロード失敗)を追跡し、ジャンプを実行するかどうかを決定するために使用できます.
//          
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;

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

//           
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;

//          
-(void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

ページジャンプのエージェントメソッドには、(ジャンプを受信するかどうかとジャンプするかどうかを決定するかの2つ)の3つがあります.
//               
-(void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;

//       ,      
-(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;

//        ,      
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

2.WKUIDelegate
//      webView
-(WKWebView**)webView:(WKWebView***)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;

以下のエージェントメソッドはいずれもインタフェースポップアッププロンプトボックスに関連しており,webインタフェースに対する3つのプロンプトボックス(警告ボックス,確認ボックス,入力ボックス)はそれぞれ3つのエージェントメソッドに対応している.以下では、警告ボックスの方法のみを列挙します.
-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;

3.WKScriptMessageHandler
//  web             
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;

##二、WKWebViewロードJS
NSString *js = @"";
//   JS      WKUserScript  
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];

//      WKUserScript  ,   WKWebViewConfiguration
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addUserScript:script];

###それでは本題に入ります
####1.まずWebKitライブラリの導入が必要です
 #import 

####2.MessageHandler WKWebViewConfigurationを作成し、各APIに対応するMessageHandlerを構成する
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userContentController = [[WKUserContentController alloc] init];

[userContentController addScriptMessageHandler:self name:@"Share"];
[userContentController addScriptMessageHandler:self name:@"Camera"];
configuration.userContentController = userContentController;

WKPreferences *preferences = [WKPreferences new];
preferences.javaScriptCanOpenWindowsAutomatically = YES;
preferences.minimumFontSize = 40.0;
configuration.preferences = preferences;

####3.WKWebViewの作成
loadFileURLメソッドは、通常、サーバのHTMLページまたはJSをロードするために使用され、loadHTML Stringは通常、ローカルHTMLまたはJSをロードするために使用されます.
NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"WKWebViewMessageHandler" ofType:@"html"];
NSString *fileURL = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
[self.webView loadHTMLString:fileURL baseURL:baseURL];
self.webView.UIDelegate = self;
[self.view addSubview:self.webView];

####4.実装プロトコルメソッド
#pragma mark -- WKScriptMessageHandler
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
   //JS  OC  
   //message.boby  JS       
   NSLog(@"body:%@",message.body);

   if ([message.name isEqualToString:@"Share"]) {
   [self ShareWithInformation:message.body];

} else if ([message.name isEqualToString:@"Camera"]) {
[self camera];
}
}

WKScriptMessageには、2つのキー属性nameとbodyがあります.OCメソッドごとにnameを取ったので,nameに基づいて異なるメソッドを実行することができる.bodyにはJSがOCに渡すパラメータが格納されている.
#pragma mark - Method
-(void)ShareWithInformation:(NSDictionary *)dic
{
   if (![dic isKindOfClass:[NSDictionary class]]) {
   return;
}
   NSString *title = [dic objectForKey:@"title"];
   NSString *content = [dic objectForKey:@"content"];
   NSString *url = [dic objectForKey:@"url"];

   //           
   NSLog(@"     

本文demo