下来我们使用js调用iOS

js调用iOS分两种情况

一,js里面直接调用方法

二,js里面通过对象调用方法

首先我们看第一种,直接调用方法。

其中用到了iOS的block

上代码

  1. -(void)webViewDidFinishLoad:(UIWebView *)webView
  2. {
  3. //网页加载完成调用此方法
  4. //iOS调用js
  5. //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
  6. JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  7. //js调用iOS
  8. //第一种情况
  9. //其中test1就是js的方法名称,赋给是一个block 里面是iOS代码
  10. //此方法最终将打印出所有接收到的参数,js参数是不固定的 我们测试一下就知道
  11. context[@"test1"] = ^() {
  12. NSArray *args = [JSContext currentArguments];
  13. for (id obj in args) {
  14. NSLog(@"%@",obj);
  15. }
  16. };
  17. //此处我们没有写后台(但是前面我们已经知道iOS是可以调用js的,我们模拟一下)
  18. //首先准备一下js代码,来调用js的函数test1 然后执行
  19. //一个参数
  20. NSString *jsFunctStr=@"test1('参数1')";
  21. [context evaluateScript:jsFunctStr];
  22. //二个参数
  23. NSString *jsFunctStr1=@"test1('参数a','参数b')";
  24. [context evaluateScript:jsFunctStr1];
  25. }

以上代码中 给test1赋值的block要是执行了那么结果就是对的,js调用了iOS

我们看结果

我们看到参数被打印出来了,而且一个参数和两个参数都可以,也符合js参数个数不限制

下来我们看第二种情况 就是js 中是通过一个对象来调用方法的。

此处稍微复杂一点我们需要使用到

JSExport

凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通过js调用到

如果js是一个参数或者没有参数的话 就比较简单,我们的方法名和js的方法名保持一致即可

比如: js方法为

  1. testobject.TestOneParameter('参数1')

那么 我们在oc中添加的代理方法就为

  1. -(void)TestOneParameter:(NSString *)message;

如果js是多个参数的话  我们代理方法的所有变量前的名字连起来要和js的方法名字一样

比如: js方法为

  1. testobject.TestTowParameterSecondParameter('参数A','参数B')

他有两个参数 那么我们的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成两段作为代理方法名(此处我们拆分为 TestTowParameter 和 SecondParameter ) 那么我们的代理方法就是

  1. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;

我们看代理方法有两个变量别名

TestTowParameter 和 SecondParameter

他两个拼接起来就刚好是我们js的方法名

此处有点绕。我们直接看代码

首先创建一个类 继承NSObject 并且规定一个协议

  1. #import <Foundation/Foundation.h>
  2. #import <JavaScriptCore/JavaScriptCore.h>
  3. //首先创建一个实现了JSExport协议的协议
  4. @protocol TestJSObjectProtocol <JSExport>
  5. //此处我们测试几种参数的情况
  6. -(void)TestNOParameter;
  7. -(void)TestOneParameter:(NSString *)message;
  8. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
  9. @end
  10. //让我们创建的类实现上边的协议
  11. @interface TestJSObject : NSObject<TestJSObjectProtocol>
  12. @end

类的实现

  1. #import "TestJSObject.h"
  2. @implementation TestJSObject
  3. //一下方法都是只是打了个log 等会看log 以及参数能对上就说明js调用了此处的iOS 原生方法
  4. -(void)TestNOParameter
  5. {
  6. NSLog(@"this is ios TestNOParameter");
  7. }
  8. -(void)TestOneParameter:(NSString *)message
  9. {
  10. NSLog(@"this is ios TestOneParameter=%@",message);
  11. }
  12. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
  13. {
  14. NSLog(@"this is ios TestTowParameter=%@  Second=%@",message1,message2);
  15. }
  16. @end

下面我们在weibview加载完成之后调用测试一下

代码如下:

  1. -(void)webViewDidFinishLoad:(UIWebView *)webView
  2. {
  3. //网页加载完成调用此方法
  4. //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
  5. JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  6. //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法
  7. //首先创建我们新建类的对象,将他赋值给js的对象
  8. TestJSObject *testJO=[TestJSObject new];
  9. context[@"testobject"]=testJO;
  10. //同样我们也用刚才的方式模拟一下js调用方法
  11. NSString *jsStr1=@"testobject.TestNOParameter()";
  12. [context evaluateScript:jsStr1];
  13. NSString *jsStr2=@"testobject.TestOneParameter('参数1')";
  14. [context evaluateScript:jsStr2];
  15. NSString *jsStr3=@"testobject.TestTowParameterSecondParameter('参数A','参数B')";
  16. [context evaluateScript:jsStr3];
  17. }

结果如下图

好了 我们看到了结果 三个方法都调用了

ok两种方式都完成了

iOS js oc相互调用(JavaScriptCore 下)的更多相关文章

  1. iOS js oc相互调用JavaScriptCore(一)

    原址:http://blog.csdn.net/lwjok2007/article/details/47058101 1.普通调用 从iOS7开始 苹果公布了JavaScriptCore.framew ...

  2. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

    iOS js oc相互调用(JavaScriptCore)   从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...

  3. iOS js oc相互调用(JavaScriptCore)(二)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

  4. iOS js oc相互调用(JavaScriptCore)---js调用iOS --js里面通过对象调用方法

    下来我们看第二种情况 就是js 中是通过一个对象来调用方法的. 此处稍微复杂一点我们需要使用到 JSExport 凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通 ...

  5. iOS js oc相互调用(JavaScriptCore)

    http://blog.csdn.net/lwjok2007/article/details/47058795

  6. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  7. Unity3D中C#和js方法相互调用

    通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...

  8. iOS 关于js与OC相互调用的那些事

    最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据. 项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮, ...

  9. iOS:在OC中调用JS脚本

    示例一:在webView中调用js脚本进行搜索 1.首先导入JavaScriptCore.framework这个框架 2.创建webView.设置代理.请求手机端百度 #import "Vi ...

随机推荐

  1. Tomcat和Java Virtual Machine的性能调优总结

    就算生不逢时,也该理解理解了.已经在Java界快混迹3年了,对于一些性能调优的话题我是一直插不上嘴,只是针对昨晚看到的一篇性能调优的文章,我忍不住了. Tomcat性能调优: 找到Tomcat根目录下 ...

  2. MongoDB数据库的数据类型和$type操作符

    前面的话 本文将详细介绍MongoDB数据库的数据类型和$type操作符 数据类型 MongoDB支持以下数据类型 类型 数字 备注 Double 1 双精度浮点数 - 此类型用于存储浮点值 Stri ...

  3. Redis-消息发布与订阅

    redis的消息发布与订阅适合做在线聊天, 消息推送 使用方法: 发布端: publish +频道名称 + 发布内容 订阅端: subscribe + 频道名称 发布端例子: 127.0.0.1:63 ...

  4. 最大流当前弧优化Dinic模板

    最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环,每根水管有流量限制,并且流入量等于流出量 有源汇点的最小流限制的最大流 顶 ...

  5. [js高手之路] es6系列教程 - 函数的默认参数详解

    在ES6之前,我们一般用短路表达式处理默认参数 function show( a, b ){ var a = a || 10; var b = b || 20; console.log( a, b ) ...

  6. git bash命令行使用https协议方式进行克隆和提交到github服务器

    在本地创建一个文件夹来存放远程服务器仓库:如创建一个git8文件夹: 在命令行中,使用git clone https://github.com/serverking/weixin.git进行克隆git ...

  7. NYOJ 5 Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Given two strings A and B, whose alp ...

  8. 最短路和次短路问题,dijkstra算法

    /*  *题目大意:  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;  *  *算法思想:  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...

  9. java ArrayList 踩坑记录

    做编程的一个常识:不要在循环过程中删除元素本身(至少是我个人的原则).否则将发生不可预料的问题. 而最近,看到一个以前的同学写的一段代码就是在循环过程中删除元素,我很是纳闷啊.然后后来决定给他改掉.然 ...

  10. adb shell screenrecord命令行使用说明

    一.查看帮助命令,参数 --help D:\>adb shell screenrecord --help Usage: screenrecord [options] <filename&g ...