WKWebView 适用于iOS8之后的系统
引用
#import <WebKit/WebKit.h>
1.OC调用JS
NSString *jsmethod = [NSString stringWithFormat:@"mymethd(\"%@\")",data]; //data(NSDate)为要传给js的数据
[self.wkWebView evaluateJavaScript:jsmethod completionHandler:^(id _Nullable result, NSError * _Nullable error) {
// result js返回值
}];
2.JS调用OC
(1)遵循代理
@interface SharecgiteViewController ()<WKNavigationDelegate,WKScriptMessageHandler>
(2)添加方法监听
WKWebViewConfiguration *webviewConfig = [[WKWebViewConfiguration alloc] init];
[webviewConfig.userContentController addScriptMessageHandler:self name:@"share"];
WKWebView *webView = [[WKWebView alloc ] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 64) configuration:webviewConfig];
webView.navigationDelegate = self;
(3)代理方法实现
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString: @"share"]) {
NSLog(@"%@",message.body);
}
}
(4)HTML中使用方法
window.webkit.messageHandlers.share.postMessage(message);
(5)释放js交互,在页面推出的时候,调用
WKUserContentController *controller = self.wkWebView.configuration.userContentController;
[controller removeScriptMessageHandlerForName:@"share"];
3.JS调用OC 需要有回调的
(1)添加代理
@interface WKWebViewController ()<WKUIDelegate>
(2)遵循代理
self.webview.UIDelegate = self;
(3)代理方法实现
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler{
//通过completionHandler将返回值传回js,在js层面实现直接返回的效果
completionHandler(@"222");
}
HTM中alter无法使用,oc中处理:
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
// js里面的alert实现,如果不实现,WKWebView中的alert函数无效
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
message:message
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"好" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
completionHandler();
}
(4)HTML中使用方法 prompt
function action(){
var result = prompt("方法标识");//返回值
alert('return'+result);
}