H 5 jsとiOS WKWebViewのインタラクション
6673 ワード
WKWebViewのメリット
1 HTML 5の機能をより多くサポート2公式に発表された60 fpsまでのスクロール・リフレッシュ率と内蔵ジェスチャー3 UIWebViewDelegateとUIWebViewを14種類と3つのプロトコルに分割し、従来は4 Safariと同じJavaScriptエンジン5を実現するのに不便だった多くの機能がより少ないメモリを消費
クラス#クラス#
プロトコル
ロードモード
プロトコル方法の説明
ObjcとJSのインタラクション
WKWebViewのUIdelegateは、JSのalert,confirm,promptメソッドをフロントエンドで容易にブロックできる3つのプロトコルメソッドを提供しています.それ以外に、ObjcとJSは以下のように相互に呼び出すことができる.
1.Objc呼び出しJS
iOS側がJSにデータを送信したい場合は、次の方法を呼び出して送信する必要があります.
2.JS呼び出しObjc
JS側がObjcにいくつかのデータを送信するには、次の方法を呼び出して送信する必要があります.この場合、WKScriptMessageHandlerが使用されます.
対応するJSコード
1 HTML 5の機能をより多くサポート2公式に発表された60 fpsまでのスクロール・リフレッシュ率と内蔵ジェスチャー3 UIWebViewDelegateとUIWebViewを14種類と3つのプロトコルに分割し、従来は4 Safariと同じJavaScriptエンジン5を実現するのに不便だった多くの機能がより少ないメモリを消費
クラス#クラス#
WKBackForwardList: web , 。
WKBackForwardListItem: webview 。
WKFrameInfo: 。
WKNavigation: 。
WKNavigationAction: , 。
WKNavigationResponse: , 。
WKPreferences: webview 。
WKProcessPool: web 。
WKUserContentController: JavaScript post script 。
WKScriptMessage: 。
WKUserScript: 。
WKWebViewConfiguration: webview 。
WKWindowFeatures: 。
プロトコル
WKNavigationDelegate: 。
WKScriptMessageHandler: 。
WKUIDelegate: 。
ロードモード
//
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:webView];
//
WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc] init];
webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:webView];
プロトコル方法の説明
#pragma mark - 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 {
}
//
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
}
// ,
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSLog(@"%@",navigationResponse.response.URL.absoluteString);
//
decisionHandler(WKNavigationResponsePolicyAllow);
//
//decisionHandler(WKNavigationResponsePolicyCancel);
}
// ,
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSLog(@"%@",navigationAction.request.URL.absoluteString);
//
decisionHandler(WKNavigationActionPolicyAllow);
//
decisionHandler(WKNavigationActionPolicyCancel);
}
#pragma mark - WKUIDelegate
// WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
return [[WKWebView alloc]init];
}
//
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
completionHandler(@"http");
}
//
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
completionHandler(YES);
}
//
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
NSLog(@"%@",message);
completionHandler();
}
ObjcとJSのインタラクション
WKWebViewのUIdelegateは、JSのalert,confirm,promptメソッドをフロントエンドで容易にブロックできる3つのプロトコルメソッドを提供しています.それ以外に、ObjcとJSは以下のように相互に呼び出すことができる.
1.Objc呼び出しJS
iOS側がJSにデータを送信したい場合は、次の方法を呼び出して送信する必要があります.
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
// Objc JS setName
[self.webView evaluateJavaScript:@"setname(' ')" completionHandler:^(id obj, NSError *error) {
}];
// setname JS , ‘ ’ JS 。 setname json array , format string , evaluate 。
NSString * para = [NSString stringWithFormat:@"setname('%@')", json];
[self.webView evaluateJavaScript:para completionHandler:^(id obj, NSError *error) {
}];
2.JS呼び出しObjc
JS側がObjcにいくつかのデータを送信するには、次の方法を呼び出して送信する必要があります.この場合、WKScriptMessageHandlerが使用されます.
// .m
@property (nonatomic ,strong)WKUserContentController * userCC;
//1 WKScriptMessageHandler
//2
WKWebViewConfiguration * config = [[WKWebViewConfiguration alloc]init];
self.wkWebViw = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:config];
[self.wkWebViw loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.webPageUrl]]];
[self.view addSubview:self.wkWebViw];
self.userCC = config.userContentController;
[self.userCC addScriptMessageHandler:self name:@"callOSX"];
// JS callFunction
[self.userCC addScriptMessageHandler:self name:@"callFunction"];
// JS callFunction , WKScriptMessageHandler
#pragma mark WKScriptMessageHandler delegate
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
// , message.name (‘ callFunction’), message.body JS
if ([message.name isEqualToString:@"callFunction"]) {
//NSLog(@"JS :%@", message.body);
}
}
// , VC handler
- (void)dealloc {
[_userContentController removeScriptMessageHandlerForName:@"callFunction"];
}
対応するJSコード
function buttonClick(string){
//JS OC,
//(window.webkit.messageHandlers.Method_Name.postMessage(parameterToOC))
window.webkit.messageHandlers.callFunction.postMessage(string)
}