Execute Javascript in iOS Applications
In this tutorial, I have covered How to execute JavaScript in iOS / Objective-C. You can execute JavaScript in iOS applications with the help of JavaScriptCore.framework. This framework is supported in iOS7 & OSX 10.9
List of features supported by Javascript.framework
a) Evaluate JavaScript code in Objective-C
b) Access JavaScript Variables in Objective-C
c) Access JavaScript functions and execute them in Objective-C
d) Execute Objective-C code from JavaScript
e) Export Objective-C classes and use them in JavaScript.
Download the source code:
To access JavaScript framework, you need to include the header file
1
|
#import <JavaScriptCore/JavaScriptCore.h> |
List of Main Classes supported by framework:
JSContext : For any javascript operations you need JSContext.
1
|
JSContext *context = [[ JSContext alloc ] init ]; |
JSValue : JSValue holds JavaScript values,variables and functions. List of main methods in JSValue.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
// Convert this value to a corresponding Objective-C object, according to the // conversion specified above. - ( id )toObject; // Convert this value to a corresponding Objective-C object, if the result is // not of the specified class then nil will be returned. - ( id )toObjectOfClass:(Class)expectedClass; // The value is copied to a boolean according to the conversion specified by the // JavaScript language. - ( BOOL )toBool; // The value is copied to a number according to the conversion specified by the // JavaScript language. - ( double )toDouble; // The value is copied to an integer according to the conversion specified by // the JavaScript language. - (int 3 2 _t)toInt 3 2 ; // The value is copied to an integer according to the conversion specified by // the JavaScript language. - (uint 3 2 _t)toUInt 3 2 ; // If the value is a boolean, a NSNumber value of @YES or @NO will be returned. // For all other types the value will be copied to a number according to the // conversion specified by the JavaScript language. - ( NSNumber *)toNumber; // The value is copied to a string according to the conversion specified by the // JavaScript language. - ( NSString *)toString; // The value is converted to a number representing a time interval since 1970, // and a new NSDate instance is returned. - ( NSDate *)toDate; // If the value is null or undefined then nil is returned. // If the value is not an object then a JavaScript TypeError will be thrown. // The property "length" is read from the object, converted to an unsigned // integer, and an NSArray of this size is allocated. Properties corresponding // to indicies within the array bounds will be copied to the array, with // Objective-C objects converted to equivalent JSValues as specified. - ( NSArray *)toArray; // If the value is null or undefined then nil is returned. // If the value is not an object then a JavaScript TypeError will be thrown. // All enumerable properties of the object are copied to the dictionary, with // Objective-C objects converted to equivalent JSValues as specified. - ( NSDictionary *)toDictionary; |
Accessing Javascript Code in Objective-C
1).Evaluating Javascript Code
1
2
3
4
|
NSString * jsCode = @"1+2" ; JSContext *context = [[ JSContext alloc ] init ]; JSValue * value = [context evaluateScript :jsCode]; NSLog( @"Output = %d" , [value toInt32 ]); |
2).Access Javascript Variables. Variables and functions are accessed from JSContext.
To access varible from Javascript : context[@"x"]
To access function from javascript : context[@"myfun"]
1
2
3
4
5
6
|
JSContext *context = [[ JSContext alloc ] init ]; NSString * jsCode = @"var x; x=10;" ; [context evaluateScript :jsCode]; JSValue * a =context[ @"x" ]; NSLog( @"x = %d" , [a toInt32 ]); |
3).Access Javascript functions and execute them in Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//function with arguments JSContext *context = [[ JSContext alloc ] init ]; NSString * jsCode = @"function sum(a,b) { return a+b;} " ; [context evaluateScript :jsCode]; JSValue * func =context[ @"sum" ]; NSArray * args = @[[ NSNumber numberWithInt : 1 0 ],[ NSNumber numberWithInt : 2 0 ]]; JSValue * ret =[func callWithArguments :args]; NSLog( @"10+20 = %d" , [ret toInt32 ]); //function without arguments NSString * jsCode 2 = @"function getRandom() { return parseInt(Math.floor((Math.random()*100)+1));} " ; [context evaluateScript :jsCode 2 ]; JSValue * func 2 =context[ @"getRandom" ]; for ( int i= 0 ;i< 5 ;i++) { JSValue * ret 2 =[func 2 callWithArguments :nil ]; NSLog( @"Random Value = %d" , [ret 2 toInt32 ]); } |
Call Objective-C code from JavaScript
Objective-C code is called from JavaScript in two ways
1.CODE BLOCKS
Objective-C code block can be called from JavaScript.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
JSContext *context = [[ JSContext alloc ] init ]; //we are telling that "sum" is function, takes two arguments context[ @"sum" ] = ^( int arg 1 , int arg 2 ) { return arg 1 +arg 2 ; }; NSString * jsCode = @"sum(4,5);" ; JSValue * sumVal = [context evaluateScript :jsCode]; NSLog( @"Sum(4,5) = %d" , [sumVal toInt32 ]); //we are telling that "getRandom" is function, does not take any arguments context[ @"getRandom" ] = ^() { return rand()% 1 0 0 ; }; NSString * jsCode 2 = @"getRandom();" ; for ( int i= 0 ;i< 5 ;i++) { JSValue * sumVal 2 = [context evaluateScript :jsCode 2 ]; NSLog( @"Random Number = %d" , [sumVal 2 toInt32 ]); } |
2.USING JSEXPORT PROTOCOL
You can see the comparison between Objective-C Object and it’s equivalent Javascript Object below.
|
|
To make Javascript interacting with Objective-C Object, We need to have a Protocol which should be inherited
from JSExport. Move all the variables and functions to prototype to access them in JavaScript.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@protocol MyObjectExport @property int x; -( int ) getX; +( MyObject *) getSqure :(MyObject*)obj; @end @interface MyObject : NSObject <MyObjectExport> //this method is not accessible in javascript -( void ) test; @end ; @implementation MyObject @synthesize x; -( int ) getX { return self .x ; } +( MyObject *) getSqure :(MyObject*)obj; { NSLog( @"Calling getSqure" ); MyObject * newObj = [ MyObject new ]; newObj .x = obj .x * obj .x ; return newObj; } |
Now MyObject(Objective-C)’s variables and functions are directly accessed from javascript.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
JSContext * context = [[ JSContext alloc ] init ]; NSString * jsCode = @"function sqrtOf(obj){ return MyObject.getSqure(obj);}" ; //adding Objective-C Class to Javascript. context[ @"MyObject" ]=[ MyObject class ]; [context evaluateScript :jsCode]; MyObject * obj =[ MyObject new ]; obj .x = 1 0 ; JSValue * func =context[ @"sqrtOf" ]; JSValue * val = [func callWithArguments :@[obj]]; //we got MyObject from javascript. MyObject *sqrtObj = [val toObject ]; NSLog( @"Value =%d, %d" , obj .x , [sqrtObj getX ]); |

Execute Javascript in iOS Applications的更多相关文章
- React Native 简介:用 JavaScript 搭建 iOS 应用(2)
[编者按]本篇文章的作者是 Joyce Echessa--渥合数位服务创办人,毕业于台湾大学,近年来专注于协助客户进行 App 软体以及网站开发.本篇文章中,作者介绍通过 React Native 框 ...
- React Native 简介:用 JavaScript 搭建 iOS 应用 (1)
[编者按]本篇文章的作者是 Joyce Echessa--渥合数位服务创办人,毕业于台湾大学,近年来专注于协助客户进行 App 软体以及网站开发.本篇文章中,作者介绍通过 React Native 框 ...
- [Robot Framework] Robot Framework用Execute Javascript对XPath表示的元素执行scrollIntoView操作
有些元素需要通过滚动条滚动才能变得可见. 如果这些元素在DOM结构里面存在,可以通过scrollIntoView让其可见,但如果在DOM结构里面不存在那就要通过拖动滚动条让其变的可见. Execute ...
- [Robot Framework] Robot Framework用Execute Javascript对XPath表示的元素执行Click操作
Execute Javascript document.evaluate("//a[contains(@href,'createBook')]", document, null, ...
- javascript与 ios通讯解决办法
阔别1年半之久,一个JavaScript和ios通讯的想法终于被实现了(我不知道别人有没有早就实现过~). 记得早期ios内嵌html做通讯时,貌似做好的办法只能是 ios通过url来截取页面发送消息 ...
- (转)Selenium-11: Execute JavaScript with JavascriptExecutor
Outline Sometimes we cannot handle some conditions or problems with Webdriver, web controls don’t re ...
- javascript开发 ios和android app的简单介绍
先看几个名词解释: nodejs ionic,Cordova,phoneGap,anjularjs react-native,reactjs nodeJs 的介绍参见这里,写的很好http://www ...
- Integrating JavaScript into Native Applications
JavaScriptCore 简介 iOS7 中新加入的 JavaScriptCore.framework 可能被大多数开发人员所忽略,但是如果你之前就在项目中用过自己编译JavaScriptCore ...
- [转]Disabling ASLR on individual iOS applications when using iOS 6.0.1
ASLR: Address Space Layout Randomization 查看应用是否进行了 ASLR 保护的方法:otool -hv ${File-Path} I recently enco ...
随机推荐
- javascript对话框(弹出层)组件
http://www.blueidea.com/download/product/2010/7513.asp#comment 1. 从头到尾对一遍<<Javascript高级程序设计> ...
- axios笔记
参考:http://www.cnblogs.com/Upton/p/6180512.html https://cloud.tencent.com/developer/article/1098141 ...
- kafka脚本
为了便于使用,kafka提供了比较强大的Tools,把经常需要使用的整理一下 开关kafka Server bin/kafka-server-start.sh config/server.proper ...
- java 内部类 工厂方法
用内部类实现工厂模式 :优先使用类而不是接口,如果你的设计中需要某个接口,你必须了解它,否则不到迫不得已,不要将其放到你的类中 //: innerclasses/Factories.java impo ...
- .NetCore下使用Prometheus实现系统监控和警报 (三)集成Grafana
有了前面InfluxDB的经验,这里就很好处理了,数据类型选择Prometheus选地址等,填好保存 同样通过导入数据处理,我们在https://grafana.com/dashboards上选择Da ...
- Android uses-permission 权限大全
Android uses-permission 权限大全 当编写某些程序时,你需要调用手机的某些功能 这时候你一定要记得启用相关的uses-permission, 很多网上贴出来的代码都不包含 Man ...
- 启动spark集群
启动Spark集群 spark@master $ ./sbin/start-all.sh 也可以一台一台启动,先启动 master spark@master $ ./sbin/start-master ...
- [转]C++ template —— 模板基础(一)
<C++ Template>对Template各个方面进行了较为深度详细的解析,故而本系列博客按书本的各章顺序编排,并只作为简单的读书笔记,详细讲解请购买原版书籍(绝对物超所值).---- ...
- 安装redis出现的问题
这个问题是我在腾讯云上安装redis时出现的错误, 1.在执行make命令时出现的错误 解决方案,没有安装gcc 什么是gcc: GCC是一个用于linux系统下编程的编译器是一个用于编程开发的自由编 ...
- [ 转载 ] Python Web 框架:Django、Flask 与 Tornado 的性能对比
本文的数据涉及到我面试时遇到过的问题,大概一次 http 请求到收到响应需要多少时间.这个问题在实际工作中与框架有比较大的关系,因此特别就框架的性能做了一次分析. 这里使用 2016 年 6 月 9 ...