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