关于JS与OC互调的方法,用的较多的有以下两种方式:
一、简单的:
1)OC调用JS:
OC提供了系统方法:
NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"testJS();"];
2)JS调用OC
通过改变document.locations=“”,然后回调UIWebview的
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
函数,在上面这个函数中,通过截取NSURLRequest解析js中传递过来的参数,再根据参数来选择早已定义好的方法。
二、iOS7之后的新方法---JavaScriptCore
1.导入framework
点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework
选中JavaScriptCore.framework后 点击右下角Add 添加完成
2.导入头文件
OC调用JS比较简单,下面直接可以
JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //获取执行环境
NSString*jsFunctStr=@"cc()"; //JS内部的方法,OC可以调用JS
[context evaluateScript:jsFunctStr];
JS调用OC有两种方法,方法的不同影响后台JS代码的写法不同
第一种:js里面直接调用方法
JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //获取执行环境
context[@"log"] = ^() { //定义一个log方法,JS可以调用这个log方法
};
js代码直接调用:
getVipId()
第二种:js里面通过对象调用方法
首先创建一个类 并且规定一个协议
@protocolInviteFriendsActivityProtocol
- (NSString*)getMemberID;
@end
@interfaceInviteFriendsActivity :OWBaseViewController
@property(nonatomic,strong)JSContext*context;
@property(nonatomic,strong)NSString*navTitle;
@property(nonatomic,strong)NSString*url;
@end
.m 类的实现
- (void)getMemberID
{
NSLog(@"getMemberID");
}
webView调用时:
- (void)webViewDidFinishLoad:(UIWebView*)webView
{
self.context= [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
}
self.context[@"InviteFriendsActivity"]=self;
js代码需通过类调用:
InviteFriendsActivity.getMemberID();