JavaScript语言调用Objective-C语言,并没有现成的API,但是有些方法可以达到相应的效果。具体是利用UIWebView的特性:在UIWebView的内发起的所有网络请求,都可以通过delegate函数得到通知。
html放进远程服务器里面,进行访问,本文放在本地,便于观察,其body部分代码简写如下:
先来看OC代码,首先创建视图控制器,在WebViewController.h文件里面,导入系统库JavaScriptCore/JavaScriptCore.h
@protocolJSObjcDelegate
//调用的JavaScript方法,必须声明!!!
- (void)method;//不需传参
- (void)postMethod:(NSString*)string;//需要传参
@end
@interfaceViewController :UIViewController
@property(strong,nonatomic)UIWebView*webView;
@property(nonatomic,strong)JSContext*jsContext;
在.m文件里面,代码如下
- (void)viewDidLoad {
[superviewDidLoad];
self.webView= [[UIWebViewalloc]initWithFrame:CGRectMake(0,20, [UIScreenmainScreen].bounds.size.width, [UIScreenmainScreen].bounds.size.height)];
self.webView.delegate=self;
//从本地加载html文件
NSString* path = [[NSBundlemainBundle]pathForResource:@"index"ofType:@"html"];
NSURL* url = [NSURLfileURLWithPath:path];
NSURLRequest* request = [NSURLRequestrequestWithURL:url] ;
[self.webViewloadRequest:request];
[self.viewaddSubview:self.webView];
}
- (void)webViewDidFinishLoad:(UIWebView*)webView {
//设置javaScriptContext上下文
self.jsContext= [webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext[@"JSandOC"] =self;
self.jsContext.exceptionHandler= ^(JSContext*context,JSValue*exceptionValue) {
context.exception= exceptionValue;
NSLog(@"异常信息:%@", exceptionValue);
};
}
- (void)method{
NSLog(@"方法一");
}
- (void)postMethod:(NSString*)string{
NSLog(@"方法二Get:%@", string);
}
这样就OK了,JS调用OC里面的method、postMethod方法。