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.- (int32_t)toInt32;// The value is copied to an integer according to the conversion specified by// the JavaScript language.- (uint32_t)toUInt32;// 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:10],[NSNumber numberWithInt:20]]; JSValue * ret =[func callWithArguments:args]; NSLog(@"10+20 = %d", [ret toInt32]); //function without arguments NSString * jsCode2 = @"function getRandom() { return parseInt(Math.floor((Math.random()*100)+1));} "; [context evaluateScript:jsCode2]; JSValue * func2 =context[@"getRandom"]; for(int i=0;i<5;i++) { JSValue * ret2 =[func2 callWithArguments:nil]; NSLog(@"Random Value = %d", [ret2 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 arg1,int arg2) { return arg1+arg2; }; 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()%100; }; NSString * jsCode2 =@"getRandom();"; for(int i=0;i<5;i++) { JSValue * sumVal2 = [context evaluateScript:jsCode2]; NSLog(@"Random Number = %d", [sumVal2 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 =10; 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 ...
随机推荐
- spring mvc file upload
文件上传 1.需要导入两个jar包 2.在SpringMVC配置文件中加入 1 2 3 4 <!-- upload settings --> <bean id="multi ...
- Python学习二|Python的一些疑问
最近写了一点Python代码,作为一个java程序员,面对Python这么便捷的语言不禁有点激动.不过呢,有时候也会遇到一些无法理解的东西. 例如: er = [[1,2,3], [4,5,6], [ ...
- Ubuntu下mysql使用
1. 从网上安装 sudo apt-get install mysql-server.装完已经自动配置好环境变量,可以直接使用mysql的命令. 注:建议将/etc/apt/source.list中的 ...
- HTML5 drawImage性能问题
最近做游戏发现,为了节省HTTP请求,把很多组动画放到了一张图片上,也就是传说中的雪碧图,但是用drawImage从图片上截取一部分绘制在canvas上时会非常慢. 我的图片尺寸为5000*7000 ...
- MySQL自定义函数和存储过程的区别:
自定义函数和存储过程的区别: 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.存储过程,功能强大,可以执行包括修改表等一系列数据库操作:用户定义函数不能用于执行一组修改全局 ...
- LeetCode(17):电话号码的字母组合
Medium! 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...
- java 内部类和向上转型
当将内部类向上转型为其基类时,尤其是转型为一个接口的时候,内部类就有了用武之地,(从实现某个接口的对象,得到对接口的引用,与向上转型为这个对象的基类,实际上是一样的效果,),这是因为此内部类---某个 ...
- CentOS 7.x 安装 Docker
安装之前确保之前没有安装过docker为此首先删除存在的docker程序 sudo yum remove docker \ docker-common \ docker-selinux \ docke ...
- Web安全之跨站脚本攻击(XSS)
XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做&q ...
- 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...