下来我们使用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. Nlpir Parser灵玖文本语义挖掘系统数据采集

    在计算机广泛应用的今天,数据采集的重要性是十分显著的.它是计算机与外部物理世界连接的桥梁.各种类型信号采集的难易程度差别很大. 灵玖软件Nlpir Parser文本语义挖掘系统以分词技术为基础,集成了 ...

  2. 2.跑nodejs文件

    1.安装nodejs的环境,这里不介绍了. app.js 'use strict'; //process.argv 接受变量 var command = process.argv[2]; var a ...

  3. 使用语音识别JAVA SDK 的MAVEN源代码制作语音控制智能家居Java APP-------MAVEN工程加载问题解决

    一直想做一个可以录音的可执行JAVA APP,实现自然语言对话. 第一步就是实现把录音转成语义,比如你对着话筒说"你好",你获取回答相应的回复.你对着话筒说"今天的天气& ...

  4. input file样式修改,图片预览删除功能

    本篇对input file进行了修改,改成自己需要的样式,类似验证身份上传身份证图片的功能. 效果图如下: 这里主要展示上传预览图片功能,对于删除功能的html及css写的比较粗糙,对于想要精细表现这 ...

  5. Solr(四)Solr实现简单的类似百度搜索高亮功能-1.配置Ik分词器

    配置Ik分词器 一 效果图 二 实现此功能需要添加分词器,在这里使用比较主流的IK分词器. 1 没有配置IK分词器,用solr自带的text分词它会把一句话分成单个的字. 2 配置IK分词器,的话它会 ...

  6. NYOJ--513--A+B Problem IV(大数)

    A+B Problem IV 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这 ...

  7. NYOJ 23.取石子(一)

    取石子(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游 ...

  8. JAVA WEB主流开发工具下载集

    JAVA SEhttp://www.oracle.com/technetwor ... ownloads/index.html eclipsehttp://www.eclipse.org/downlo ...

  9. [STM32F429-DISCO-HAL]2.先学会点亮LED和使用LCD。。。

      首先就简单的一秒闪烁一次LED灯,进而类比推理其他外设的配置过程.然后呢我们就用上LCD吧,毕竟这块板上占地面积最大的就是这个2.4'LCD了.   先贴出简洁的main函数.很干净,比较容易看懂 ...

  10. Python打包EXE神器 pyinstaller

    最近由于项目需要,以前的python文件需要编辑为EXE供前端客户使用. 由于最早接触的是distutils,所以一开始准备使用distutils和py2exe搭配来进行python的exe化,也就是 ...