关于iOS7里的JavaScriptCore framework

iOS7沸沸扬扬的扁平化论战之外,WWDC 2013还是公布了很多让开发者小兴奋的点,其中包括多任务加强支持background fetchtransfer,近场通信的AirDropp2p,以及游戏控制器和游戏中心的加强;当然还包括了让web开发同学很兴奋JavaScriptCore了。下面henry/webryan来详细介绍下整合JavaScriptCore到原生应用的情况。

102713_1406_iOS7JavaScr1.png

1、什么是JavaScriptCore

前端开发的同学应该知道,浏览器核心模块主要是渲染引擎和JavaScript引擎两部分组成。前者用于处理页面布局,渲染及DOM结构等,后者用于JavaScript的解析、执行及DOM交互等。

JavaScriptCore是一种JavaScript引擎,主要为webkit提供脚本处理能力(其主要以safari浏览器为代表)。除此之外,市面上还有注明的JscriptIE, SpiderMonkeyfirefox)和V8chrome)。JavaScriptCore是开源webkit的一部分,它提供了强大的整合能力,有兴趣的同学可以到官网下载编译和测试(http://www.webkit.org/projects/javascript/

102713_1406_iOS7JavaScr2.png

2、为什么苹果要在native应用中(非webview)引入JavaScript

首先,脱离了浏览器外壳和繁重的UI布局和渲染的JavaScript引擎,无疑可以将JavaScript的能力更轻便地、高性能地带给原生的iOS应用,给应用开发者提供更多的想象力(无论是PC还是移动的浏览器,UIGUI部分都是最重要的性能瓶颈和优化点)。

其次,在移动开发场景中确实有众多的开发者对JavaScript有需求。在google上搜索”embed javascript engine ios”可以得到大量的实践和博文。

再次,苹果已经在mac上得到很不错的实践和反响。引入JavaScriptCore即扩大了SDK能力又讨好了开发者,何乐不为呢。

102713_1406_iOS7JavaScr3.png

3、引入JavaScriptCore到底包括了哪些能力呢?

aObjective-C –> JavaScript (即在Objective-C语言环境里执行JavaScript代码段,创建JavaScript变量及变量操作等等)

bJavaScript –> Objective-C(即在JavaScript语言环境里调用Objective-C公开给JavaScript的方法)

c、内存管理和线程封装(主要是需要注意引用和线程使用冲突)

4、代码层具体应该怎么使用呢?

a、执行JavaScript代码的方法:首先引入JavaScriptCore.h,然后通过JSContext创建JS运行环境,再通过evaluateScript来执行结果;

102713_1406_iOS7JavaScr4.png

最后要访问执行结果的话,需要注意数据类型的转换,Objective-CJS的对应关系主要如下:

– (BOOL)toBool;

– (double)toDouble;

– (int32_t)toInt32;

– (uint32_t)toUInt32;

– (NSNumber *)toNumber;

– (NSString *)toString;

– (NSDate *)toDate;

– (NSArray *)toArray;

– (NSDictionary *)toDictionary;

– (id)toObject;

– (id)toObjectOfClass:(Class)expectedClass;

b、调用JS的函数:通过evaluateScript将脚本片段引入到上下文,然后通过callWithArguments进行调用。

102713_1406_iOS7JavaScr5.png

c、通过JS调用Objective-C的方法1–Blocks(即function方式)

通过在Objective-CJS context直接定义函数,那么在JS语言环境里可以直接使用 makeNSColor函数。

102713_1406_iOS7JavaScr6.png

d、通过JS调用Objective-C的方法2–JSExport(即object方式)

通过在Objective-C中声明JSExport的数据类型,可以直接在JS的语言环境里当作全局变量使用。

102713_1406_iOS7JavaScr7.png

创建MyPoint类,MyPoint类实现MyPointExports协议,然后将MyPoint类的实例注入JS。

示例:

MyPoint *point = [[MyPoint alloc] init];

context[@"point"] = point;

e、扩展系统已有类到JS

比如将Label的一个实例导出到JS,让JS设置Label的text属性。

(1)首先实现一个协议,将text属性Export:

         @protocol MyLabelExportProtocol <JSExport>


         @property(nonatomic,copy)NSString *text;


         @end

         (2)将此协议动态添加到UILabel的Class上:

         class_addProtocol([UILabelclass], @protocol(MyLabelExportProtocol));

         (3)将UILabel的一个实例添加至JS上下文:

         [contextsetObject:label forKeyedSubscript:@"label"];


         (4)在JS中就可以通过text属性设置label的显示值了:

         label.text = 'Label显示值';

OK相信看到这,你已经知道该怎么实现Objective-CJavaScript的相互调用了。其实这里和在浏览器中的相互操作是类似的。那么使用过过程中也要注意引用的回收和避免循环引用等问题,否则会导致内存泄露,甚至程序崩溃。这里我就不赘述了。

102713_1406_iOS7JavaScr8.png

5、JavaScriptCore怎么和UIWebView连接起来呢?

 JSContext *context = [webviewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

6、JavaScriptCore可以带来了哪些实战应用呢?

1、对于类Titanium的应用绝对是一大利好。Titanium就是通过内置JavaScript引擎操作Objective-C提供的能力,以达到通过JavaScript来开发相对高性能的应用(对比phonegap而言)。内置JavaScriptCore可以使类Titanium框架体积得到明显减小。

102713_1406_iOS7JavaScr9.png

2、对于动态更新类需求是非常有帮助的。JavaScript文件对于iOS7+的应用,相当于LuaCocos2d-x的意义,即提供一种动态局部升级和更新的逻辑,大大提高应用的可扩展性。

3、对手机内嵌web模式的新尝试点,即通过native+JS file的方式取代webview的方式。比如群创建页面,通过手Q提供基础的组件能力,通过加载JS文件来渲染生成创建群UI,并且通过HTTPTCP方式更新create.js,即可实现更贴近原生的交互体验和web的灵活性。

转自:http://www.webryan.net/2013/10/about-ios7-javascriptcore-framework/,部分内容有更改,内容有增加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出Fetch API

多年来&#xff0c;XMLHttpRequest一直是web开发者的亲密助手。无论是直接的&#xff0c;还是间接的&#xff0c; 当我们谈及Ajax技术的时候&#xff0c;通常意思就是基于XMLHttpRequest的Ajax&#xff0c;它是一种能够有效改进页面通信的技术。 Ajax的兴起是由于Google的Gmail…

[设计模式] ------ 简单工厂模式

简单工厂模式 不同类型下创建对应的不同的对象&#xff0c;得到不同的结果&#xff0c;就叫简单生产模式 比如 定义一个接口&#xff0c;叫A&#xff0c;里面有方法a&#xff0c;返回int类型 类B1实现A接口&#xff0c;也实现a方法&#xff0c;里面做的是加法运算 类B2实现…

第19章总结

一.Java绘图类 1.Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 2.Graphics2D类 Graphics2…

RSA公钥文件(PEM)解析

公钥语法为&#xff1a; RSAPublicKey :: SEQUENCE { modulus INTEGER, //RSA合数模n publicExponent INTEGER //RSA公开幂e } 说明&#xff1a; 1.此语法中的modulus和publicExponent&#xff0c;提取自对应私钥中的同名域值。 2.PKCS1和PKCS8的公钥文件是一样的&#xff…

RSA私钥文件(PEM-PKCS#1)解析

在PKCS#1 RSA算法标准中定义RSA私钥语法 RSAPrivateKey :: SEQUENCE { version Version, //版本 modulus INTEGER, // RSA合数模 n publicExponent INTEGER, //RSA公开幂 e privateExponent INTEGER, //RSA私有幂 d prime1 INTEGER, //n的素数因子p prime2 INTEGER, //n的…

[分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)

雪花算法&#xff08;Twitter_Snowflake&#xff09; 我们知道&#xff0c;分布式全局唯一id的生成&#xff0c;一般是以下几种&#xff1a; 基于雪花算法生成基于数据库基于redis基于zookeeper 本文说下雪花算法&#xff0c;后面附源码以及测试代码。 如下图&#xff1a; …

非对称加解密交互故事

1.鲍勃有两把钥匙&#xff0c;一把是公钥&#xff0c;另一把是私钥。 2.鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。 3.苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密&#xff0c;就可以达到保密的效果 4.鲍勃收信后&#xff0c;用私钥解密&#xff0…

Sqlite3中replace语句用法详解

在本例中使用如下数据库表&#xff1a; &#xff08;图 1&#xff09; 该表的表名为student&#xff0c; 存储学生信息。 所有字段的数据类型都是TEXT 。 其中id和name作为复合主键。 email字段加上了唯一约束。建表语句如下&#xff1a; CREATE TABLE IF NOT EXISTS student …

[分布式一致性协议] ------ raft协议的解释与理解

前言 在分布式系统中&#xff0c;为了保证容错性&#xff0c;一般会维护多个副本集群&#xff0c;提高系统的高可用&#xff0c;但与之带来的问题就是多个副本的一致性&#xff08;consensus&#xff09;问题。 我们认为&#xff0c;对于一个具有一致性的的集群中&#xff0c;…

利用.dSYM和.app文件准确定位Crash位置

当发布到iPhone上的应用程序Crash之后&#xff0c;iPhone会自动生成一个Crash Log&#xff08;*.crash&#xff09;&#xff0c;这个文件包含了一些有用的调试信息&#xff0c;但对于堆栈&#xff0c;它只记录的函数地址&#xff0c;而无法显示函数名。函数名保存在一个叫dSYM的…

MVPVM模式介绍

一、概述MVPVM即&#xff1a;Model-View-Presenter-ViewModel。此模式是MVVM和MVP模式的结合体。但是交互模式发生了比较大的变化。MVVM参考本博客文章&#xff1a;iOS-MVVM-模式介绍MVP参考本博客文章&#xff1a;MVP模式介绍 二、原理&#xff1a;Presenter同时持有View、Mod…

分组密码的工作模式

一、理论基础1.概述密码学中&#xff0c;块密码的工作模式允许使用同一个块密码密钥对多于一块的数据进行加密&#xff0c;并保证其安全性。块密码自身只能加密长度等于密码块长度的单块数据&#xff0c;若要加密变长数据&#xff0c;则数据必须先被划分为一些单独的密码块。通…

PBOC3.0中使用的国密SM2算法

一、知识准备 PBOC3.0规范就是《中国金融集成电路&#xff08;IC&#xff09;卡规范》3.0版本。SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法。本身是基于ECC椭圆曲线算法的&#xff0c;所以要讲SM2, 先要弄懂ECC。 完全理解ECC算法需要一定的数学功底…

Markdown入门

Markdown 是一种轻量级的「标记语言」&#xff0c;它的优点很多&#xff0c;目前也被越来越多的写作爱好者&#xff0c;撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑&#xff0c;Markdown 的语法十分简单。常用的标记符号也不超过十个&#xff0c;这种相对于更为…

mysql数据库支持emoji表情的详解

mysql存储emoji表情的时候&#xff0c;就会报错&#xff0c;如下&#xff1a; Error updating database. Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8A\xF0\x9F…’ for column ‘这是我表中的字段’ at row 1 初步定位是我的数据库是utf8编码…

编程规范:长函数的思考

在工作&#xff0c;我们应该都不想看到非常的长函数。对于一个运行5年左右的项目&#xff0c;极有可能出现这种情况。由于长函数的长、if/else嵌套&#xff0c;导致代码的可读性非常差&#xff0c;这对于项目的维护和开发带来了极大的困难。所以我们应该避免写长函数&#xff0…

用redis实现延迟队列

现在在用的redis实现延迟队列的主流程

maven更新快照不起作用的解决方法

问题&#xff1a;maven的快照包更新后&#xff0c;调用方使用idea点下面这个地方更新maven&#xff0c;并没有拉到最新的快照 解决方法1 删除本地仓库的快照包&#xff0c;再重新拉一次 解决方法2 下图&#xff0c;这里点进去 下图&#xff0c;这个勾上就行了&#xff0c;再…

iOS中frame和Bounds之间的区别

frame frame是每个view必备的属性&#xff0c;代表的是当前视图的位置和大小&#xff0c;没有设置他&#xff0c;当前视图是看不到的。位置需要有参照物才能确定&#xff0c;数学中我们用坐标系来确定坐标系中的某个点的位置&#xff0c;iOS中有他特有的坐标系&#xff0c;如下…

[数据库]-----记一次mysql分库的操作(冷热分离)

前提: 1.原有库是mysql数据库,已经根据用户pin分片 2.每片是一主两从 3.主表已经分过表了 4.数据库所在服务器为4C8G 5.库中数据量已经超过千万,而且以每天3万多的数据持续增长,将来每天或许会更多 6.库内数据为订单数据&#xff0c;每时每刻都有新的订单产生&#xff0c;每个…