关于html与OC的交互
2020-04-01 本文已影响0人
今年27
在iOS开发中OC与JS之间的交互是很重要的,这里稍微总结一下
1.通过获取JSContext的方式直接调用OC方法
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
__weak typeof(self) weakSelf = self;
self.jsContext[@"getMessage"] = ^(){
return [weakSelf blockCallMessage];
};
}
- (NSString *)blockCallMessage
{
return @"call via block";
}
2.通过继承自JSExport的方式调用delegate中的方法
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 方法二
self.jsContext[@"JavaScriptInterface"] = self;
}
#pragma mark - JSCallDelegate
// 提供给JS调用的方法
- (NSString *)tipMessage
{
return @"call via delegate";
}
3.截取URL的方式(此种方式资料很多,就不写了)
OC调用JS的方法
WKWebKitView是这样的
NSString *doc = @"document.body.outerHTML";
[self.myWebView evaluateJavaScript:doc
completionHandler:^(id _Nullable htmlStr, NSError * _Nullable error) {
if (error) {
NSLog(@"JSError:%@",error);
}
NSLog(@"html:%@",htmlStr);
}] ;
以前用UIWebView是这样的
[webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = \"function myFunction() { "
"var field = document.getElementsByName('q')[0];"
"field.value='xxxxxx';"
"document.forms[0].submit();"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);"];
[webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
附html代码
<html>
<head>
</head>
<body>
<script>
function buttonClick1()
{
// 方法一
var token = getMessage();
alert(token)
}
function buttonClick2()
{
// 方法二
var token = JavaScriptInterface.tipMessage();
alert(token)
}
</script>
<button id="abc" onclick="buttonClick1()">function 1</button>
<button id="abcd" onclick="buttonClick2()">function 2</button>
</body>
</html>