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

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

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

下来我们使用js调用iOS

js调用iOS分两种情况

一,js里面直接调用方法

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


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

其中用到了iOS的block


上代码


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


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

比如: js方法为  

testobject.TestOneParameter('参数1')

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

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

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

比如: js方法为  

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

-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
我们看代理方法有两个变量别名

TestTowParameter 和 SecondParameter 

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



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


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

#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

//首先创建一个实现了JSExport协议的协议
@protocol TestJSObjectProtocol <JSExport>

//此处我们测试几种参数的情况
-(void)TestNOParameter;
-(void)TestOneParameter:(NSString *)message;
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;

@end

//让我们创建的类实现上边的协议
@interface TestJSObject : NSObject<TestJSObjectProtocol>

@end

类的实现

#import "TestJSObject.h"

@implementation TestJSObject

//一下方法都是只是打了个log 等会看log 以及参数能对上就说明js调用了此处的iOS 原生方法
-(void)TestNOParameter
{
    NSLog(@"this is ios TestNOParameter");
}
-(void)TestOneParameter:(NSString *)message
{
    NSLog(@"this is ios TestOneParameter=%@",message);
}
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
{
   NSLog(@"this is ios TestTowParameter=%@  Second=%@",message1,message2);
}
@end



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


代码如下:

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


结果如下图


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中的JavaScriptCore是一个框架,它提供了将JavaScript代码嵌入到iOS应用程序中的功能。它是基于WebKit引擎的一部分,可以让开发者在iOS应用中执行JavaScript代码,并且可以实现JavaScriptObjective-C之间的相互调用JavaScriptCore框架提供了以下主要功能: 1. 执行JavaScript代码:可以使用JavaScriptCore框架来执行JavaScript代码,包括解析和执行JavaScript脚本文件。 2. JavaScriptObjective-C相互调用:可以在Objective-C代码中调用JavaScript函数,并且可以在JavaScript代码中调用Objective-C方法。这种相互调用可以实现iOS应用与JavaScript之间的数据交互和功能扩展。 3. JavaScript对象与Objective-C对象的转换:JavaScriptCore框架提供了将JavaScript对象转换为Objective-C对象的功能,以及将Objective-C对象转换为JavaScript对象的功能。这样可以方便地在JavaScriptObjective-C之间传递数据。 4. JavaScript上下文管理:可以创建和管理多个JavaScript上下文,每个上下文都有自己的全局对象和执行环境。这样可以实现多个独立的JavaScript环境,避免不同模块之间的命名冲突。 5. JavaScript异常处理:JavaScriptCore框架提供了处理JavaScript异常的机制,可以捕获和处理JavaScript代码中的异常情况。 使用JavaScriptCore框架,开发者可以将JavaScript代码嵌入到iOS应用中,实现一些动态的功能和交互效果。比如,在一个网页浏览器应用中,可以使用JavaScriptCore框架来执行网页中的JavaScript代码,并且可以在Objective-C代码中调用JavaScript函数,实现与网页的交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值