webView
js调用iOS分两种情况
一,js里面直接调用方法
二,js里面通过对象调用方法
先来看看直接调用的情况
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//网页加载完成调用此方法
//iOS调用js
//首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//js调用iOS
//第一种情况
//其中test1就是js的方法名称,赋给是一个block 里面是iOS代码
//此方法最终将打印出所有接收到的参数,js参数是不固定的 我们测试一下就知道
context[@"test1"] = ^() {
NSArray *args = [JSContext currentArguments];
for (id obj in args) {
NSLog(@"%@",obj);
}
};
//此处没有写后台(但是我们iOS是可以调用js的,我们模拟一下)
//首先准备一下js代码,来调用js的函数test1 然后执行
//一个参数
NSString *jsFunctStr=@"test1('参数1')";
[context evaluateScript:jsFunctStr];
//二个参数
NSString *jsFunctStr1=@"test1('参数a','参数b')";
[context evaluateScript:jsFunctStr1];
}
以上代码中 给test1
赋值的block
要是执行了那么结果就是对的,js调用了iOS
我们看结果
我们看到参数被打印出来了,而且一个参数和两个参数都可以,也符合js参数个数不限制
下来我们看第二种情况 就是js 中是通过一个对象来调用方法的。
这种方式我们需要使用到JSExport
协议
凡是遵守了JSExport
协议的协议所规定的方法、变量等就会对js开放,我们可以通过js调用到这些方法或变量
使用步骤请看下面的例子
一、我们首先创建一个继承自NSObject
的类: JSObject
二、导入JavaScriptCore库
三、创建一个遵守JSExport协议的协议并让我们创建的类实现上边的协议
四、加入方法和实现
方法加入:直接把方法写在协议里即可,跟写正常的.h里面的OC方法一样 如果js是一个参数或者没有参数的话 就比较简单,我们的方法名和js的方法名保持一致即可,如果有多个参数,那么从第二个参数起,参数名的首字母要大写
方法实现:直接在.m中实现方法即可
下面我们在weibview加载完成之后调用测试一下
扩展
可以把所有需要提供给js调用的方法都写在JSObject这个类当中,通过代理的方式与需要执行这些操作的类进行连接,也就JSObject这个类只负责提供方法,不负责实现,具体的操作可以在具体的添加有webView的控制器里实现(详见Demo)
然后把这些方法的名称和参数说明做成一张表格进行维护,便于web断查看调用!