javascript
关于iOS7里的JavaScriptCore framework
在iOS7沸沸揚揚的扁平化論戰(zhàn)之外,WWDC 2013還是公布了很多讓開發(fā)者小興奮的點,其中包括多任務(wù)加強支持background fetch和transfer,近場通信的AirDrop和p2p,以及游戲控制器和游戲中心的加強;當(dāng)然還包括了讓web開發(fā)同學(xué)很興奮JavaScriptCore了。下面henry/webryan來詳細(xì)介紹下整合JavaScriptCore到原生應(yīng)用的情況。
1、什么是JavaScriptCore?
前端開發(fā)的同學(xué)應(yīng)該知道,瀏覽器核心模塊主要是渲染引擎和JavaScript引擎兩部分組成。前者用于處理頁面布局,渲染及DOM結(jié)構(gòu)等,后者用于JavaScript的解析、執(zhí)行及DOM交互等。
JavaScriptCore是一種JavaScript引擎,主要為webkit提供腳本處理能力(其主要以safari瀏覽器為代表)。除此之外,市面上還有注明的Jscript(IE), SpiderMonkey(firefox)和V8(chrome)。JavaScriptCore是開源webkit的一部分,它提供了強大的整合能力,有興趣的同學(xué)可以到官網(wǎng)下載編譯和測試(http://www.webkit.org/projects/javascript/)
2、為什么蘋果要在native應(yīng)用中(非webview)引入JavaScript?
首先,脫離了瀏覽器外殼和繁重的UI布局和渲染的JavaScript引擎,無疑可以將JavaScript的能力更輕便地、高性能地帶給原生的iOS應(yīng)用,給應(yīng)用開發(fā)者提供更多的想象力(無論是PC還是移動的瀏覽器,UI和GUI部分都是最重要的性能瓶頸和優(yōu)化點)。
其次,在移動開發(fā)場景中確實有眾多的開發(fā)者對JavaScript有需求。在google上搜索”embed javascript engine ios”可以得到大量的實踐和博文。
再次,蘋果已經(jīng)在mac上得到很不錯的實踐和反響。引入JavaScriptCore即擴(kuò)大了SDK能力又討好了開發(fā)者,何樂不為呢。
3、引入JavaScriptCore到底包括了哪些能力呢?
a、Objective-C –> JavaScript?(即在Objective-C語言環(huán)境里執(zhí)行JavaScript代碼段,創(chuàng)建JavaScript變量及變量操作等等)
b、JavaScript –> Objective-C(即在JavaScript語言環(huán)境里調(diào)用Objective-C公開給JavaScript的方法)
c、內(nèi)存管理和線程封裝(主要是需要注意引用和線程使用沖突)
4、代碼層具體應(yīng)該怎么使用呢?
a、執(zhí)行JavaScript代碼的方法:首先引入JavaScriptCore.h,然后通過JSContext創(chuàng)建JS運行環(huán)境,再通過evaluateScript來執(zhí)行結(jié)果;
最后要訪問執(zhí)行結(jié)果的話,需要注意數(shù)據(jù)類型的轉(zhuǎn)換,Objective-C和JS的對應(yīng)關(guān)系主要如下:
| – (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、調(diào)用JS的函數(shù):通過evaluateScript將腳本片段引入到上下文,然后通過callWithArguments進(jìn)行調(diào)用。
c、通過JS調(diào)用Objective-C的方法(1)–Blocks(即function方式)
通過在Objective-C的JS context直接定義函數(shù),那么在JS語言環(huán)境里可以直接使用?makeNSColor函數(shù)。
d、通過JS調(diào)用Objective-C的方法(2)–JSExport(即object方式)
通過在Objective-C中聲明JSExport的數(shù)據(jù)類型,可以直接在JS的語言環(huán)境里當(dāng)作全局變量使用。
創(chuàng)建MyPoint類,MyPoint類實現(xiàn)MyPointExports協(xié)議,然后將MyPoint類的實例注入JS。
示例:
MyPoint *point = [[MyPoint alloc] init];
context[@"point"] = point;
e、擴(kuò)展系統(tǒng)已有類到JS
比如將Label的一個實例導(dǎo)出到JS,讓JS設(shè)置Label的text屬性。
(1)首先實現(xiàn)一個協(xié)議,將text屬性Export:
? ? ? ? ?@protocol MyLabelExportProtocol <JSExport>
? ? ? ? ?@property(nonatomic,copy)NSString *text;
? ? ? ? ?@end
? ? ? ? ?(2)將此協(xié)議動態(tài)添加到UILabel的Class上:
? ? ? ? ?class_addProtocol([UILabelclass], @protocol(MyLabelExportProtocol));
? ? ? ? ?(3)將UILabel的一個實例添加至JS上下文:
? ? ? ? ?[contextsetObject:label?forKeyedSubscript:@"label"];
? ? ? ? ?(4)在JS中就可以通過text屬性設(shè)置label的顯示值了:
? ? ? ? ?label.text = 'Label顯示值';
OK相信看到這,你已經(jīng)知道該怎么實現(xiàn)Objective-C和JavaScript的相互調(diào)用了。其實這里和在瀏覽器中的相互操作是類似的。那么使用過過程中也要注意引用的回收和避免循環(huán)引用等問題,否則會導(dǎo)致內(nèi)存泄露,甚至程序崩潰。這里我就不贅述了。
5、JavaScriptCore怎么和UIWebView連接起來呢?
?JSContext *context = [webviewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
6、JavaScriptCore可以帶來了哪些實戰(zhàn)應(yīng)用呢?
1、對于類Titanium的應(yīng)用絕對是一大利好。Titanium就是通過內(nèi)置JavaScript引擎操作Objective-C提供的能力,以達(dá)到通過JavaScript來開發(fā)相對高性能的應(yīng)用(對比phonegap而言)。內(nèi)置JavaScriptCore可以使類Titanium框架體積得到明顯減小。
2、對于動態(tài)更新類需求是非常有幫助的。JavaScript文件對于iOS7+的應(yīng)用,相當(dāng)于Lua對Cocos2d-x的意義,即提供一種動態(tài)局部升級和更新的邏輯,大大提高應(yīng)用的可擴(kuò)展性。
3、對手機內(nèi)嵌web模式的新嘗試點,即通過native+JS file的方式取代webview的方式。比如群創(chuàng)建頁面,通過手Q提供基礎(chǔ)的組件能力,通過加載JS文件來渲染生成創(chuàng)建群UI,并且通過HTTP或TCP方式更新create.js,即可實現(xiàn)更貼近原生的交互體驗和web的靈活性。
轉(zhuǎn)自:http://www.webryan.net/2013/10/about-ios7-javascriptcore-framework/,部分內(nèi)容有更改,內(nèi)容有增加。總結(jié)
以上是生活随笔為你收集整理的关于iOS7里的JavaScriptCore framework的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MD5算法原理与常用实现
- 下一篇: React Native使用指南-原生U