https://blog.csdn.net/dolacmeng/article/details/79623708
h5代码
showmsg 点击结果:
拦截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#import @protocol APPJSObjectDelegate -(void)onClickOC:(NSString *)name;@end@interface APPJSObject : NSObject @property (nonatomic, weak) id 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];