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 ...
随机推荐
- 搜索引擎ElasticSearchV5.4.2系列三之ES使用
相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x- ...
- nginx 反向代理Apache
2014年1月13日 18:15:25 同一个域名下,不同uri走不同的应用(不同的web根目录) 实现方式: Apache分别监听两个端口,对应不同的应用 nginx监听80端口,利用locatio ...
- 解除IIS配置节锁定
C:\windows\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
- Densenet-Tensorflow
在寻找densnet网络的时候,我发现了一个结构清晰完整的网络代码,在此作备份. https://github.com/taki0112/Densenet-Tensorflow Densenet-Te ...
- Linux性能优化之CPU优化(一)
前言 何为性能优化?个人认为,性能优化是为了提高应用程序或系统能力为目的.那么如何才能实现对应用程序的性能调优呢?这里很设计到很多的内容,包括Linux内核.CPU架构以及Linux内核对资源的分配以 ...
- 日志收集框架flume的安装及简单使用
flume介绍 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS.hbase.h ...
- Hive的安装和使用
1.Hive1.1 在hadoop生态圈中属于数据仓库的角色.他能够管理hadoop中的数据,同时可以查询hadoop中的数据. 本质上讲,hive是一个SQL解析引擎.Hive可以把SQL查询转换为 ...
- 添加用户到LDAP服务器
1. 在浏览器中打开http://ldap.example.com/phpldapadmin 2. 点击[login]链接,输入管理员密码. 3. 点击[Create a new entry her ...
- 040 DataFrame中的write与read编程
一:SparkSQL支持的外部数据源 1.支持情况 2.External LIbraries 不是内嵌的,看起来不支持. 但是现在已经有很多开源插件,可以进行支持. 3.参考材料 · 支持的格式:ht ...
- ZOJ Monthly, March 2018 题解
[题目链接] A. ZOJ 4004 - Easy Number Game 首先肯定是选择值最小的 $2*m$ 进行操作,这些数在操作的时候每次取一个最大的和最小的相乘是最优的. #include & ...