oc调用js的方法
直接调用即可,如果是做一些页面刷新的操作,最好在主线程操作,避免引起额外的问题。
NSString *jsCode = [NSString stringWithFormat: @"shareAuth(%@)",status];
[weakSelf.contentWebView evaluateJavaScript:(NSString *)jsString completionHandler:^(id response, NSError * error){
}];
js调用OC方法
1注入js方法
WKUserScript * userScript =
[[WKUserScript alloc] initWithSource:(NSString *)injectSource
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:(BOOL)NO];
[self.contentWebView.configuration.userContentController addUserScript:userScript];
注入的代码需要和web开发人员提前商量好,要调用哪个类的哪个方法,比如web想调用MeetNativeToJsObject对象的openMeetMessageList方法,可以这么写js方法:
NSString * jsFormat = [NSString stringWithFormat:
@"var MeetNativeToJsObject={};"//定义调用方法的对象
@"MeetNativeToJsObject.openMeetMessageList=function(){"
@"window.webkit.messageHandlers.message.postMessage('{\"action\":\"openMeetMessageList\"}');"
@"};"
];
如果需要接收web传给自己的参数,可以在方法括号内添加参数进行接收,比如:
@"MeetNativeToJsObject.openMeetMessageList=function(meetID){"
@"var varMeetID = (meetID==undefined)?\"null\":meetID;"
@"var strParameter = '{\"action\":\"openMeetMessageList\",\"parameter\":' + varMeetID + '}';"
@"window.webkit.messageHandlers.message.postMessage(strParameter);"
@"};"
2,设置接收方法的对象
[self.contentWebView.configuration.userContentController
addScriptMessageHandler:(id<WKScriptMessageHandler>)scriptHandler name:@"message"];
scriptHandler为遵守WKScriptMessageHandler协议的一个对象。
3,web调用该方法
MeetNativeToJsObject.openMeetMessageList = function() {
window.webkit.messageHandlers.message.postMessage('{"action":"openMeetMessageList"}');
};
可以先创建MeetNativeToJsObject类型的对象,命名为:native,然后调用方法:native.openMeetMessageList();
4,在scriptHandler类中实现接收方法调用的代理方法
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"name:%@ body:%@", message.name, message.body);
}
这里message.name为注入接收对象的name,message.body为传递的信息,比如像我上面注入的方法:"action":"openMeetMessageList"。
注意事项:1,需要等web页面加载完成后,再调用js的方法,不然调用方法时有时会失败;
2,最好在主线程对方法进行调用,不然有时会出现调用失败的情况。