1.wk的注册和配置
/*
使用WKUserContentController实现js native的实现 ,简单的说就是先注册约定好的方法,然后再调用。
*/
@interface ViewController2 ()<WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler,WKDelegate>
{
WKWebView *webView;
WKUserContentController *userContentController;
}
- (void)viewDidLoad {
[super viewDidLoad];
//配置环境
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
userContentController = [[WKUserContentController alloc] init];
configuration.userContentController = userContentController;
webView =[[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)configuration:configuration];
//注册方法
//注册一个name为sayHello的js方法
WKDelegateController *delegeController = [[WKDelegateController alloc] init];
delegeController.delegate = self;
[userContentController addScriptMessageHandler:delegeController name:@"sayHello"];
[self.view addSubview:webView];
webView.UIDelegate = self;
webView.navigationDelegate =self;
//加载本地html的方法
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"File.html" withExtension:nil];
[webView loadRequest:[NSURLRequest requestWithURL:fileUrl]];
}
js 传递给oc
#pragma mark - WKScriptMessageHandler
//js 传递给 oc方法
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"name:%@\\\\n body:%@\\\\n frameInfo:%@\\\\n",message.name,message.body,message.frameInfo);
}
oc 传递给js
/*
oc传给js
*/
//页面加载完
- (void)webView:(WKWebView *)WebView didFinishNavigation:(WKNavigation *)navigation{
//say()是JS方法名,completionHandler是异步回调block
[webView evaluateJavaScript:@"say()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@",result);
}];
}
交互就是两个方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
这方法用来获取js传过来的内容,通过约定,根据内容调取不同的原生方法
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
这个方法 就是传递内容给js,通常传递json数据给网页,第一个参数 javaScriptString 是方法名和我们要传的数据组成的。
block是返回给我们的结果
还有delloc
-(void)dealloc {
//这里需要注意,前面增加过的方法一定要remove掉。
//但是发现delloc并不执行,
/*
原因是[userContentController addScriptMessageHandler:self name:@"sayhello"];这句代码造成无法释放内存。
正确的写法是用一个新的controller来处理,新的controller再绕用delegate绕回来。
*/
[userContentController removeScriptMessageHandlerForName:@"sayHello"];
}
WKDelegateController
WKDelegateController.h
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
@protocol WKDelegate <NSObject>
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
@end
NS_ASSUME_NONNULL_BEGIN
@interface WKDelegateController : UIViewController<WKScriptMessageHandler>
@property(nonatomic,weak) id<WKDelegate>delegate;
@end
NS_ASSUME_NONNULL_END
WKDelegateController.m
#import "WKDelegateController.h"
@interface WKDelegateController ()
@end
@implementation WKDelegateController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([self.delegate
respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
[self.delegate userContentController:userContentController didReceiveScriptMessage:message];
}
}
html文件
<html>
<body>
<a href="https://www.baidu.com">
This is a link</a>
<button type="button", onclick="javascript:sayHello()">Click Me!</button>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
function sayHello() {
window.webkit.messageHandlers.sayHello.postMessage(11)
}
</script>
</body>
</html>