#import <WebKit/WebKit.h>
<WKNavigationDelegate,WKUIDelegate>
@property (nonatomic,strong) WKWebView *webView;
//创建
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences = [[WKPreferences alloc] init];
config.preferences.minimumFontSize = 10;
config.preferences.javaScriptEnabled = YES;
config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
config.userContentController = [[WKUserContentController alloc] init];
config.processPool = [[WKProcessPool alloc] init];
config.userContentController = [WKUserContentController new];
//在创建wkWebView时,需要将被js调用的方法注册进去,oc与js端对应实现
//注意:此注册方法很容易引起循环循环引用,导致控制器无法被释放,所以别忘了在dealloc方法里移除
//第一个参数是userContentController的代理对象,第二个参数是JS里发送postMessage的对象
[config.userContentController addScriptMessageHandler:selfname:@"toBindWx"];
[config.userContentController addScriptMessageHandler:selfname:@"JavaScriptToJumpLogin"];
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 宽, 高) configuration:config];
// 是否允许手势左滑返回上一级, 类似导航控制的左滑返回
self.webView.allowsBackForwardNavigationGestures = YES;
/* 加载服务器url的方法*/
NSString *url = @"https://www.baidu.com";
NSURLRequest *request = [NSURLRequest requestWithURL
[NSURLURLWithString:url]];
[self.webView loadRequest:request];
self.webView.navigationDelegate = self;
self.webView.UIDelegate = self;
[self addSubview:self.webView];
// [[UIApplication sharedApplication].keyWindow addSubview:webView];
//WKScriptMessageHandler协议方法
- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message {
NSString *name = message.name;
if ([name isEqualToString:@"toBindWx"]) {
//code
} else if ([name isEqualToString:@"JavaScriptToJumpLogin"]) {
//code
}
}
//别忘了移除
- (void)dealloc{
[self.webView.configuration.userContentControllerremoveScriptMessageHandlerForName:@"toBindWx"];
[self.webView.configuration.userContentControllerremoveScriptMessageHandlerForName:@"JavaScriptToJumpLogin"];
}
如果出现不走userContentController代理方法,很有可能是JS方法没写对。正确姿势如下:
//这个`name`就是和JS约好的方法名。
window.webkit.messageHandlers.<name>.postMessage(<messageBody>)
//那么在JS里就是:
window.webkit.messageHandlers.toBindWx.postMessage(<messageBody>)
window.webkit.messageHandlers.JavaScriptToJumpLogin.postMessage(<messageBody>)
//<messageBody>是一个键值对,键是body,值可以有多种类型的参数,body 的类型:Allowed types are NSNumber, NSString, NSDate, NSArray, NSDictionary, and NSNull
重要的事情说三遍!重要的事情说三遍!重要的事情说三遍!
window.webkit.messageHandlers.<name>.postMessage(NULL或者其他参数)
//参数messageBody里面不能为空什么都不写,不然会不走代理方法
网友评论