一国夜、說明
本篇文章呢主要聊一下JavaScriptCore的使用焚碌,為自己做個(gè)記錄佛吓。JavaScriptCore 是蘋果 Safari 瀏覽器的 JavaScript 引擎蛇更,JavaScriptCor在 OS X 平臺(tái)上很早就存在的,而在 iOS 平臺(tái)筋讨,直到IOS7才對(duì)外開放埃叭,并提供了 Objective-C 的接口。
二悉罕、主要類
(一)JSContext:A JSContext object represents a JavaScript execution environment.一個(gè) Context 就是一個(gè) JavaScript 代碼執(zhí)行的環(huán)境赤屋,也叫作用域。所有的JSValue都是捆綁在一個(gè)JSContext上的壁袄。
(二)JSExport:The JSExport protocol provides a declarative way to export Objective-C instance classes and their instance methods, class methods, and properties to JavaScript code.可以用這個(gè)協(xié)議來將原生對(duì)象導(dǎo)出給JavaScript类早,這樣原生對(duì)象的屬性或方法就成為了JavaScript的屬性或方法。
(三)JSValue:A JSValue is a reference to a value within the JavaScript object space of a JSVirtualMachine.可以說是JavaScript和Object-C之間互換的橋梁嗜逻,它提供了多種方法可以方便地把JavaScript數(shù)據(jù)類型轉(zhuǎn)換成Objective-C,或者是轉(zhuǎn)換過去涩僻。對(duì)應(yīng)方式如下表:
(四)JSVirtualMachine:A JSVirtualMachine instance represents a self-contained environment for JavaScript execution.JSVirtualMachine為JavaScript的運(yùn)行提供了底層資源,管理JS運(yùn)行時(shí)和管理JS暴露的OC對(duì)象的內(nèi)存。
(五)A JSManagedValue object wraps a JSValue object, adding “conditional retain” behavior to provide automatic memory management of values.解決JS和原生代碼之間循環(huán)引用的問題
三逆日、使用
要使用JavaScriptCore首先我們需要引入它的頭文件#import<JavaScriptCore/JavaScriptCore.h>
本篇文章結(jié)合此Demo代碼主要講兩個(gè)方面:
(一)JSCallOC
1嵌巷、導(dǎo)入頭文件#import<JavaScriptCore/JavaScriptCore.h>
2、給控制器添加webView屬性和JSContext對(duì)象屬性室抽;這里是用webView加載的本地網(wǎng)頁(of course,別忘了遵守UIWebViewDelegate協(xié)議搪哪,設(shè)置代理)
3、實(shí)際界面操作如下圖:
上圖一整個(gè)界面是一個(gè)網(wǎng)頁狠半,點(diǎn)擊網(wǎng)頁主要實(shí)現(xiàn)以下功能:
1噩死、計(jì)算階乘:在輸入框中輸入一個(gè)數(shù)字,然后在OC中計(jì)算出結(jié)果神年,最后顯示在HTML的頁面上已维;
2、測試log:在后臺(tái)打印測試數(shù)據(jù)已日;
3垛耳、OC原生Alert :點(diǎn)擊后,彈出OC的提示框飘千;
4堂鲜、addSubView:添加一個(gè)View;
5护奈、push to second ViewController:跳轉(zhuǎn)控制器
那么問題來了缔莲,怎么獲取點(diǎn)擊事件呢,這就需要iOS工程師和后端開發(fā)人員進(jìn)行溝通協(xié)定為html中的元素添加一個(gè)點(diǎn)擊事件方法:
然后以block形式關(guān)聯(lián)JavaScript function霉旗,
但是痴奏,若以以下形式為元素添加點(diǎn)擊方法:那么就要用JSExport協(xié)議關(guān)聯(lián)native的方法,要在webView的delegate里面添加如下代碼:然后,在.h文件中再聲明一個(gè)繼承JSExport的協(xié)議,協(xié)議中聲明供JS使用的OC的方法:
在.m文件中實(shí)現(xiàn)這些方法就OK了厌秒。
(二)OCCallJS:
1读拆、同樣的別忘了導(dǎo)入頭文件
2、點(diǎn)擊“js處理”按鈕后鸵闪,將textfild的數(shù)據(jù)傳給js檐晕,js計(jì)算完成后把結(jié)果在返回回來!首先要獲取JS里面的計(jì)算函數(shù)蚌讼,在OC中辟灰,所有表示JS中的對(duì)象,都用JSValue來創(chuàng)建篡石,通過objectForKeyedSubscript方法或者直接使用下標(biāo)的方法獲取JS對(duì)象芥喇,然后使用callWithArguments方法來執(zhí)行函數(shù):
暫且先記錄到此!