OC调用UIWebView 中的js,网上例子很多,最常用的是UIWebView自带的一个方法;
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
UIWebView 中的js 掉用本地的oc方法;
通过UIWebView开始加载请求的代理方法中,去解析OC跟js约定好的协议(比如约定协议objtc://)
比如<a href="objtc://function">调用oc</a>
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSString *urlString = [[request URL] absoluteString];
if( [urlString hasPrefix:@"objtc://"] ){
//调用oc本地方法
NSLog(@"....");
}
}
第二种方法,比如OC类A中有个UIWebView,UIWebView的js想调用OC类A中的方法,
对于JSContext,JSValue跟OC对象的相互转换,获取js的window文档树,或者其他交互功能,百度很多
1)新建一个协议继承JSExport
#import <JavaScriptCore/JavaScriptCore.h>
#import "objc/runtime.h"
@protocol LLCExport <JSExport>
//UIWebView中的js,就可以通过appPushPageTitle(url,title)调用此协议的这个方法
-(void)appPushPage:(NSString*)url title:(NSString*)title;
@end
2)获取类A 的当前UIWebView中的上下文对象JSContext,
self.jsc = [self.webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
3)类A 实现 LLCExport中的方法
-(void)appPushPage:(NSString*)url title:(NSString*)title{
UIViewController *pvc = [[UIViewController alloc] init];
pvc.title = title;
pvc.strUrl = url;
[self.navigationController pushViewController:pvc animated:YES];
}
4)当UIWebView加载完毕后,给类A动态加自定义的LLCExport协议,然后把类A对象赋值给JSContext中自定义的“APP_NATIVE”对象
- (void)webViewDidFinishLoad:(UIWebView *)webView{
class_addProtocol(self.class,@protocol(LLCExport));
self.jsc["APP_NATIVE"] = self;
}
5)js里面就可以通过window.APP_NATIVE.appPushPageTitle("http://www.baidu.com","百度");
来调用OC类A中的-(void)appPushPage:(NSString*)url title:(NSString*)title;这个方法了