js与oc的交互分别由两种
一.oc对js的调用:
1.我们通过UIWebView自带的一个方法stringByEvaluatingJavaScriptFromString:
调用JavaScript代码就可以实现调用我们网页上的方法了
[webView stringByEvaluatingJavaScriptFromString:@"alert('测试')"];
具体可以参考http://www.jianshu.com/p/786a897694c1
2.其次就是通过JavaScriptCore.framework来进行对网页js的操作
//创建JSContext对象,(此处通过当前webView的键获取到jscontext)
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//OC调用JS方法---test1是js里的方法 这例我们就可以调用网页上js的方法了
[context evaluateScript:@"test1()"];```
#### 二.js对oc的调用
主要是通过利用苹果系统框架<JavaScriptCore/JavaScriptCore.h>
嗯在执行js方法时如果传的参数带有换行好像会引起错误,大家注意一下。
1.JSContext的block方式:
//首先我们需要拿到WebView执行JS的执行环境,很重要的东西
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//这是交互方法
context[@"jsmethod"] = ^(){
NSLog(@"你要做的事");
};
//js只需要调用方法 jsmethod(); 就可以实现我们block里面的内容了
2.JSExport协议方式---类方式
我们需要先 ----在.h文件里自定义协议,并且协议遵守<JSExport>协议并且定义协议方法(就是JS调用的OC方法)
@protocol JSExport <JSExport>
// 这里需要注意js调用时需要换一个写法:如下
// iosshare.textJSExportWithParameterTwoParameter('parameter1', 'parameter2');
- (void)textJSExportWithParameter:(NSString *)parameter1 TwoParameter:(NSString *)parameter2;
@end
在.m文件中你需要让他去遵守这个协议,实现他的协议方法
@interface JSObj()<JSExport>
@end
@implementation JSObj
- (void)textJSExportWithParameter:(NSString *)parameter1 TwoParameter:(NSString *)parameter2{
NSLog(@"你要做的事");
}
类创建完了当然应该去建立联系,
我们需要在VC中去调用他
//创建context
JSContext *context=[_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 建立联系
JSObj *testJO=[JSObj new];
context[@"ios_js"] = testJO;
// 然后就是js对他的调用了--这里就不帖后台代码了,直接用oc调用js的方法调用
[self.context evaluateScript:@"ios_js.textJSExportWithParameterTwoParameter('parameter1','parameter2');"];
这样就可以实现了。
之前我们公司的应用都是通过拦截url进行各种操作的,如果不是查找了些资料都不知道现在都不用这方法了,这里就不提拦截url的方法了。
1.需要注意就是如果你需要对界面进行什么操作的话要加载主线程,不然是会crash的。
2.关于调用JSContext之后的一些内存问题,看了一些文章也不是很懂,如果有了解一些的小伙伴多多交流啊。可以参考这篇简书-[快点我](http://www.jianshu.com/p/a329cd4a67ee)
嗯,差不多就这样了。第一篇博文,多很多不足的地方多多包涵。
网友评论