美文网首页
WKWebVeiew 与JS交互

WKWebVeiew 与JS交互

作者: hashakey | 来源:发表于2020-04-17 10:19 被阅读0次
 #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里面不能为空什么都不写,不然会不走代理方法

相关文章

网友评论

      本文标题:WKWebVeiew 与JS交互

      本文链接:https://www.haomeiwen.com/subject/jgxevhtx.html