使用JavaScriptCore 實(shí)現(xiàn)OC與JS的交互 IOS

一突颊、說明

這篇文章記錄自己在研究OC與JS交互中的所得,以及遇到的問題與解決

由于蘋果的審核時(shí)間太漫長颁糟,一次審核不過,那又將進(jìn)入另一個(gè)漫長的審核期桑谍。為了能在開發(fā)中方便更新,公司要求在項(xiàng)目中使用HTML5洗显,這樣就涉及到OC與JS的交互外潜, 在經(jīng)過一段時(shí)間的摸索之后,將自己的研究記錄下來挠唆,以做備忘处窥。

OC與JS的交互實(shí)現(xiàn)方式有很多,之前用的比較多的是WebViewJavaScriptBridge玄组,但在IOS7之后滔驾,蘋果將JavaScriptCore框架開放。因此俄讹,這篇文章不講理論,主要講的是JavaScriptCore的實(shí)際使用哆致。

文中所用的項(xiàng)目JavaScriptCoreDemo

廢話說完了,下面進(jìn)入正題

二、Demo項(xiàng)目中功能介紹

Demo首頁

這個(gè)demo主要分為了三個(gè)部分來:

1.JS Call OC? , JS調(diào)用OC的函數(shù)

2.OC Call JS? , OC調(diào)用JS的函數(shù)

3.一個(gè)繪圖的例子

在做OC與JS交互工作之前患膛,我們需要做些準(zhǔn)備工作

1.導(dǎo)入JavaScriptCore的頭文件

#import

2.用webView加載HTML文件,這里用的是本地HTML;

- (void)viewDidLoad{[superviewDidLoad];// Do any additional setup after loading the view from its nib.self.title=@"js call oc";NSString*path = [[[NSBundlemainBundle] bundlePath]? stringByAppendingPathComponent:@"JSCallOC.html"];NSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLfileURLWithPath:path]];[self.webViewloadRequest:request];}



3.在JS交互中摊阀,很多事情都是在webView的delegate方法中完成的,通過JSContent創(chuàng)建一個(gè)使用JS的環(huán)境,所以這里胞此,我們先將self.content在這里面初始化;

- (void)webViewDidFinishLoad:(UIWebView*)webView{//初始化

contentself.context= [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];// 打印異常,由于JS的異常信息是不會(huì)在OC中被直接打印的,所以我們在這里添加打印異常信息,self.context.exceptionHandler=^(JSContext *context, JSValue *exceptionValue){? ? context.exception= exceptionValue;NSLog(@"%@", exceptionValue);};}

三臣咖、實(shí)際操作中 JS call OC

先來看demo

JS Call OC

這個(gè)頁面整個(gè)都是通過HTML實(shí)現(xiàn)的,

1 計(jì)算階乘:在輸入框中輸入一個(gè)數(shù)字漱牵,然后在OC中計(jì)算出結(jié)果夺蛇,最后顯示在HTML的頁面上;

2 測試log:點(diǎn)擊后酣胀,在后臺(tái)打印測試數(shù)據(jù)蚊惯;

3 OC原生Alert :點(diǎn)擊后,彈出OC的提示框灵临;

4 addSubView:點(diǎn)擊后,在OC中添加一個(gè)View趴荸;

5 push to second ViewController :跳轉(zhuǎn)到下一個(gè)界面

總結(jié):以上功能都是在OC獲取HTML中按鈕的點(diǎn)擊事件,在后在OC中實(shí)現(xiàn)功能

??如何獲取HTML中的點(diǎn)擊事件呢??

在HTML中,為一個(gè)元素添加點(diǎn)擊時(shí)間有兩種寫法

或者

如果是第一種方法,

那么就要用JSExport協(xié)議關(guān)聯(lián)native的方法,要在webView的delegate里面添加

// 以 JSExport 協(xié)議關(guān)聯(lián) native 的方法self.content[@"native"] =self;

添加完之后,要聲明一個(gè)繼承JSExport的協(xié)議,協(xié)議中聲明供JS使用的OC的方法

@protocolTestJSExportJSExportAs(calculateForJS/** handleFactorialCalculateWithNumber 作為js方法的別名 */, - (void)handleFactorialCalculateWithNumber:(NSNumber*)number );- (void)pushViewController:(NSString*)view title:(NSString*)title;-(void)log:(NSString*)l;@end

在OC中實(shí)現(xiàn)這些方法,這樣就完成了!

如果是第二章方法,則只需要通過block的形式關(guān)聯(lián)JavaScript function就可以了!

self.context[@"log"] = ^(NSString*str){NSLog(@"%@", str);};

三儒溉、OC調(diào)用JS

OC調(diào)用JS

在這個(gè)例子中,界面的所有View都是OC創(chuàng)建的发钝,點(diǎn)擊“交給JS處理計(jì)算階乘”后顿涣,將textfild的數(shù)據(jù)傳給JS,JS計(jì)算完成后在返回來酝豪!

這里面首先要獲取JS里面的計(jì)算函數(shù)涛碑,在OC中,所有表示JS中對(duì)象孵淘,都用JSValue來創(chuàng)建蒲障,通過objectForKeyedSubscript方法或者直接使用下標(biāo)的方法獲取JS對(duì)象,然后使用callWithArguments方法來執(zhí)行函數(shù)

// 方法一.? JSValue *function = [self.context objectForKeyedSubscript:@"factorial"];// 方法二.JSValue * function =self.context[@"factorial"];JSValue *result = [function callWithArguments:@[inputNumber]];self.showLable.text= [NSStringstringWithFormat:@"%@", [result toNumber]];

四瘫证、demo之外(慢慢在總結(jié))

1.JS注入

2.在OC中為JS創(chuàng)建對(duì)象

......

零碎的補(bǔ)充1:對(duì)于JS 函數(shù)中,參數(shù)中有函數(shù)的,在OC中用JSValue接收

// 比如:JS代碼functionmyFunc({"text":"這里是文字","callbackFun":function(string){alert'string'}});//OC代碼中在.h的protocol中聲明JS要調(diào)用的OC方法//.h protocol中,函數(shù)名稱要和JS中相同,這里接收的參數(shù)為JSValueJSExportAs(myFunc, -(void) myFunc:(JSValue*)value);//在.m文件中,實(shí)現(xiàn)myFunc方法-(void) myFunc:(JSValue*)value{NSString * text = [valuevalueForProperty:@"text"];//打印"這里是文字"JSValue * func =? [valuevalueForProperty:@"callbackFun"];//這里是JS參數(shù)中的func;//調(diào)用這個(gè)函數(shù)[func callWithArguments:@[@"這里是參數(shù)"]];}


原文鏈接:http://www.reibang.com/p/cdaf9bc3d65d

著作權(quán)歸作者所有揉阎,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”背捌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毙籽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毡庆,更是在濱河造成了極大的恐慌坑赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件么抗,死亡現(xiàn)場離奇詭異讥此,居然都是意外死亡象踊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藤树,“玉大人,你說我怎么就攤上這事。” “怎么了甸昏?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徐许。 經(jīng)常有香客問我施蜜,道長,這世上最難降的妖魔是什么雌隅? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任翻默,我火速辦了婚禮,結(jié)果婚禮上恰起,老公的妹妹穿的比我還像新娘修械。我一直安慰自己,他們只是感情好检盼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布肯污。 她就那樣靜靜地躺著,像睡著了一般吨枉。 火紅的嫁衣襯著肌膚如雪蹦渣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天貌亭,我揣著相機(jī)與錄音柬唯,去河邊找鬼。 笑死圃庭,一個(gè)胖子當(dāng)著我的面吹牛锄奢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剧腻,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼斟薇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恕酸?” 一聲冷哼從身側(cè)響起堪滨,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕊温,沒想到半個(gè)月后袱箱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡义矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年发笔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凉翻。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡了讨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情前计,我是刑警寧澤胞谭,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站男杈,受9級(jí)特大地震影響丈屹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伶棒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一旺垒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肤无,春花似錦先蒋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至皇忿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坦仍,已是汗流浹背鳍烁。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留繁扎,地道東北人幔荒。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像梳玫,于是被迫代替她去往敵國和親爹梁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 隨著H5技術(shù)的興起提澎,在iOS開發(fā)過程中姚垃,難免會(huì)遇到原生應(yīng)用需要和H5頁面交互的問題。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,062評(píng)論 1 8
  • OC與JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大沖哥閱讀 1,019評(píng)論 0 1
  • JavaScriptCore框架主要是用來實(shí)現(xiàn)iOS與H5的交互盼忌。由于現(xiàn)在混合編程越來越多积糯,H5的相對(duì)講多,所以研...
    水靈芳蕥閱讀 1,394評(píng)論 1 8
  • 一川慌、簡介 近兩年隨著HTML5的迅速發(fā)展與日趨成熟,越來越多的移動(dòng)開發(fā)者選擇使用HTML5來進(jìn)行混合開發(fā),不僅節(jié)約...
    RainyGY閱讀 1,860評(píng)論 1 12
  • 跟原生開發(fā)相比梦重,H5的開發(fā)相對(duì)來一個(gè)成熟的框架和團(tuán)隊(duì)來講在開發(fā)速度和開發(fā)效率上有著比原生很大的優(yōu)勢兑燥,至少不用等待審...
    大沖哥閱讀 1,841評(píng)論 0 7