https://blog.csdn.net/dolacmeng/article/details/79623708
h5代码
<html>
<head>
<meta charset='utf-8'/>
<title></title>
<script>
function showAlert(String){
alert(String);
}
function onClickOC(String){
app.onClickOC(String);
}
function clickCallBack(result){
document.getElementById("result").innerHTML="点击结果:"+result;
}
</script>
</head>
<body>
<button type="button" onclick="onClickOC('html')">click me</button>
<a href="tt://showmsg">showmsg</a>
<p id="result">点击结果:</p>
</body>
</html>
拦截URL
适用于UIWebView和WKWebView,适用于带有超链接的h5标签,比如上面h5代码中的‘a’标签。
web调OC
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *requestStr = request.URL.absoluteString;
if ([requestStr isEqualToString:@"tt://showmsg"]) {
NSLog(@"show OC msg");
//OC调JS,将OC处理结果返回给web页面
[webView stringByEvaluatingJavaScriptFromString:@"clickCallBack('点击结束')"];
return NO;
}
return YES;
}
JavaScriptCore
方法1:使用block
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"onClickOC"] = ^(NSString *string) {
NSLog(@"onClickOC--%@", string);
};
}
方法2:
- 新建类继承自NSObject(如AppJSObject)。
- .h文件中声明一个代理并遵循JSExport,代理内的方法和js定义的方法名一致。
- .m文件中实现<2>代理中对应的方法,可以在方法内处理事件或通知代理。
- 在UIWebView加载完成的代理中把AppJSObject实例对象类注入到JS中,那么在js中调用方法就会调用到原生AppJSObject实例对象中对应的方法了。
//APPJSObject.h
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
@protocol APPJSObjectDelegate <JSExport>
-(void)onClickOC:(NSString *)name;
@end
@interface APPJSObject : NSObject<APPJSObjectDelegate>
@property (nonatomic, weak) id<APPJSObjectDelegate> delegate;
@end
//APPJSObject.m
#import "APPJSObject.h"
@implementation APPJSObject
-(void)onClickOC:(NSString *)name
{
[self.delegate onClickOC:name];
}
@end
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
APPJSObject *obj = [[APPJSObject alloc] init];
obj.delegate = self;
context[@"app"] = obj;
}
OC调JS
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//js字符串是要调用的JavaSCript函数
NSString *js = [NSString stringWithFormat:@"clickCallBack('点击结束')"];
[context evaluateScript:js];