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

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

上节地址 http://blog.csdn.net/lwjok2007/article/details/47058101

接着上节我们讲到的iOS调用js

下来我们使用js调用iOS

js调用iOS分两种情况

一,js里面直接调用方法

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

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

其中用到了iOS的block

上代码

[objc] view plaincopy

  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调用到

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

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

[objc] view plaincopy

  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

类的实现

[objc] view plaincopy

  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加载完成之后调用测试一下

代码如下:

[objc] view plaincopy

  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两种方式都完成了

源代码我们上传到群空间[TestJSOC.zip]有需要的去下载

时间: 2024-10-25 00:00:35

iOS js oc相互调用(JavaScriptCore)(二)的相关文章

iOS js oc相互调用JavaScriptCore(一)

原址:http://blog.csdn.net/lwjok2007/article/details/47058101 1.普通调用 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framewor

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

iOS js oc相互调用(JavaScriptCore) 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framework后 点击右下角Add 添加完成 好 创建完成之后我们导入一下头文件 [

iOS js oc相互调用(JavaScriptCore)

从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framework后 点击右下角Add 添加完成 好 创建完成之后我们导入一下头文件 #import <JavaScriptCore/JavaScr

iOS下JS与OC互相调用(二)--WKWebView 拦截URL

在第一篇文章 iOS下JS与OC互相调用(一)中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebView也可以拦截URL,做JS 与OC交互.关于WKWebView与UIWebView的对比,大家请自动百度或者google. WKWebView 拦截URL WKWebView 与 UIWebView 拦截URL 的处理方式基本一样.除了代理方法和WKWebView

iOS:在OC中调用JS脚本:示例一

1.首先导入JavaScriptCore.framework这个框架 2.创建webView.设置代理.请求手机端百度 #import "ViewController.h" #import <JavaScriptCore/JavaScriptCore.h> #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #define SCREEN_HEIGHT [UIScreen mainScreen].bound

ASP.NET的后台代码和前台JS代码相互调用

在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况.今天就把比较实用的前后台相互调用的方法总结出来和大家分享. <1>后台代码调用前台JS代码 一.说到后台代码调用前台的JS代码很多人首先就会想到使用 ClientScript.RegisterStartupScript()方法,该方法主要是注册启动脚本文本,即在后台执行调用前台JS代码 该方法有两个重载, 1.ClientScript.RegisterStartupScript(Type type,st

IOS:ios和javaScript相互调用 oc和js

文章来自:http://blog.csdn.net/intbird 相比android和js进行交互,ios和js进行交互是比较方便的; android和js进行交互,请看这里: http://blog.csdn.net/intbird/article/details/42295453 android和js进行交互框架,看这里: http://blog.csdn.net/intbird/article/details/46461203 这里看ios和js的交互 0.上个丑图 1,oc调用js,超

安卓ios和angularjs相互调用解决首次调用ios传递标题失败的问题

1.angular 调用客户端方法放在 try catch中 try { js_invoke.showShareDialog(angular.toJson(obj));  // 在这里放客户端的方法即可 } catch(e) { console.log('Recommend share',obj); } 2.客户端调用angular的方法,注意方法需全局可以才能正常调用 在首页index.html中声明方法 var goBack = function() { return false }; 在具

Flash与JS之间相互调用以及参数传递

[AS3]ExternalInterface.call传多个参数的写法代码示例 import flash.text.TextField; var param1:uint = 20; var param2:uint =17; var result:uint = ExternalInterface.call("addNumbers", param1, param2); function callMe(str:String):void{ //outtext.text=str; var out