iOS--js和oc交互

原创 2016年08月31日 14:51:38

1.从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。

2.oc调用js

-(void)webViewDidFinishLoad:(UIWebView *)webView  
{        
    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)  
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
    NSString *alertJS=@"alert('test js OC')"; //准备执行的js代码  
    [context evaluateScript:alertJS];//通过oc方法调用js的alert  

}  

3.js调用oc分两种情况

1,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];  

}  

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

#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
-(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];
}

4.内存管理
现在来说说内存管理的注意点,OC使用的ARC,JS使用的是垃圾回收机制,并且所有的引用是都强引用,不过JS的循环引用,垃圾回收会帮它们打破。JavaScriptCore里面提供的API,正常情况下,OC和JS对象之间内存管理都无需我们去关心。不过还是有几个注意点需要我们去留意下。

1、不要在block里面直接使用context,或者使用外部的JSValue对象。

2、OC对象不要用属性直接保存JSValue对象,因为这样太容易循环引用了。

3、不要在不同的 JSVirtualMachine 之间进行传递JS对象。

版权声明:欢迎转载!

iOS 开发中OC 与 JS的交互

iOS原生应用和web页面的交互有iOS7之后的JavaScriptCore、拦截协议、第三方框架WebViewJavaScriptBridge、iOS8之后的WKWebView几种方法,这一章我们主...
  • Tony_18736165317
  • Tony_18736165317
  • 2017年03月24日 19:38
  • 1745

OC与JS的交互(iOS与H5混编)

OC与JS的交互(iOS与H5混编)在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景。 iOS中加载html网页, 可以使用UIWebView或WKWebView. 本篇博客将介绍两种控件...
  • SandyLoo
  • SandyLoo
  • 2017年03月24日 14:50
  • 5385

OC与JS的相互交互

在Objective-C中提供了一个JavaScriptCore.frame类库来进行OC与JS之间的交互,在OC中可通过此类库来进行与JS的交互...
  • haoxindasoft
  • haoxindasoft
  • 2016年03月05日 12:56
  • 1053

JS与原生OC的三种交互方式

JS与原生OC的三种交互方式大家在做项目的时候应该也遇到过需要h5与OC之间通信,来实现某种特定的效果,于是我总结一下最近用到过的这两者之间的交互的方式: 通过在UIWebView的代理方法里拦截UR...
  • cljAndPean
  • cljAndPean
  • 2017年03月26日 16:27
  • 1340

Lua与ObjC的交互

在这里,我想跟大家分享另外一种脚本语言的交互方式,就是使用Lua与原生的ObjC语言进行交互。...
  • vimfung
  • vimfung
  • 2016年12月21日 18:15
  • 1789

cocos2d-lua与OC的交互

这次因为要在ios游戏里面接广告,所以就碰到了游戏层与OC层交互的问题,游戏是用lua写的,相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内...
  • sinat_16095273
  • sinat_16095273
  • 2015年11月19日 17:13
  • 2132

{Unity} c#和iOS Objective-C交互

Unity 编写iOS native的Plugin, 接入一些sdk什么的,需要和OC进行交互。下面已我写的ios支付插件为例,总结一下。 1)c#调用OC代码 首先需要在c#中声明OC的函数:...
  • n5
  • n5
  • 2016年01月15日 17:54
  • 8709

OC和JS的交互,native页面和web页面混合

这里照搬Github的Demo,其实还是很易懂的,首先,要在控制器的.h文件当中实现浏览器控件的协议: 1 #import 2 3 @interface ExampleAppViewContro...
  • ios_xumin
  • ios_xumin
  • 2016年08月04日 15:57
  • 372

ios--js调用oc(实例)

因为在iOS中没有WebKit.Framework这个库的,所以也就没有 windowScriptObject对象方法了。要是有这个的方法的话  就方便多了,(ps:MacOS中有貌似)  现在我们...
  • wanggsx20080817
  • wanggsx20080817
  • 2014年02月24日 17:05
  • 805

webView中OC和JS交互

UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容。其中就要用到javascript的知识,而UIWebView与javascript交互的...
  • Apple_0611
  • Apple_0611
  • 2015年03月31日 15:43
  • 717
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS--js和oc交互
举报原因:
原因补充:

(最多只允许输入30个字)