iOS下的JS和原生的交互

JS代用原生OC

方式一:url攔截凡蚜,這里略過

注意:在iOS中攔截到的url scheme將全部轉(zhuǎn)化為小寫人断;

html中需要設(shè)置編碼,否則中文參數(shù)可能會(huì)出現(xiàn)編碼問題朝蜘;

JS用打開一個(gè)iFrame的方式替代直接用document.location的方式恶迈,document.location 有一個(gè)很嚴(yán)重的問題,就是如果我們連續(xù) 2 次改 document.location 的話谱醇,在 delegate 方法中暇仲,只能截獲后面那次請(qǐng)求步做,前一次請(qǐng)求由于很快被替換掉,所以被忽略掉奈附。

方式二:通過JavaScriptCore(iOS 7之后)辆床,用來做JS交互,因此JS與原生OC交互也變得簡單了許多桅狠。

//獲取js上下文,及本地添加js調(diào)用方法轿秧,一般情況下都放在-(void)webViewDidFinishLoad:(UIWebView *)webView方法里中跌。

-(void)webViewDidFinishLoad:(UIWebView *)webView{

//獲取js上下文

self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//添加js代用方法

self.jsContext[@"ocGetValueFromJS"]= ^(){

NSArray *array = [JSContext currentArguments];

for (NSString *value in array) {

NSLog(@"收到j(luò)s值:%@",value);

}

};

//異常處理

self.jsContext.exceptionHandler = ^(JSContext* context,JSValue *exceptionValue){

context.exception = exceptionValue;

NSLog(@"異常信息:%@", exceptionValue);

};

}

方式三:同方式二相似,通過JSExport協(xié)議

@protocol JSObjcDelegate<JSExport>

-(void)getMessage:(id)msg;

@end

@interface WebViewController ()<UIWebViewDelegate,JSObjcDelegate>

-(void)webViewDidFinishLoad:(UIWebView *)webView{

//獲取js上下文

self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//設(shè)置代理

self.jsContext[@"ios"]= self;

//異常檢查菇篡,當(dāng)oc本地調(diào)用的js方法不存時(shí)漩符,會(huì)打印異常信息

self.jsContext.exceptionHandler = ^(JSContext* context,JSValue *exceptionValue){

context.exception = exceptionValue;

NSLog(@"異常信息:%@", exceptionValue);

};

}

//代理方法的實(shí)現(xiàn)

-(void)getMessage:(id)message{

NSLog(@"getMessage-------%@",message);

}

OC調(diào)用JS

方式一

NSString *jsText = [NSString stringWithFormat:@"jsGetValueFromOc('%@')",@"哈哈"];

[self.webView stringByEvaluatingJavaScriptFromString:jsText];

方式二

通過使用JavaScriptCore

JSValue *callback = self.jsContext[@"jsGetValueFromOc"];

[callback callWithArguments:@[@"222"]];

或者

NSString *jsText = @"jsGetValueFromOc('222')";

[self.jsContext evaluateScript:jsText];

注意:stringByEvaluatingJavaScriptFromString是一個(gè)同步的方法,使用它執(zhí)行JS方法時(shí)驱还,如果JS 方法比較耗的時(shí)候嗜暴,會(huì)造成界面卡頓。

官方推薦使用WKWebView(ios8)的evaluateJavaScript:completionHandler:代替這個(gè)方法议蟆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闷沥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咐容,更是在濱河造成了極大的恐慌舆逃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戳粒,死亡現(xiàn)場離奇詭異路狮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蔚约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奄妨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苹祟,你說我怎么就攤上這事砸抛。” “怎么了苔咪?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵锰悼,是天一觀的道長。 經(jīng)常有香客問我团赏,道長箕般,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任舔清,我火速辦了婚禮丝里,結(jié)果婚禮上曲初,老公的妹妹穿的比我還像新娘。我一直安慰自己杯聚,他們只是感情好臼婆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幌绍,像睡著了一般颁褂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傀广,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天颁独,我揣著相機(jī)與錄音,去河邊找鬼伪冰。 笑死誓酒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贮聂。 我是一名探鬼主播靠柑,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼吓懈!你這毒婦竟也來了歼冰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤骄瓣,失蹤者是張志新(化名)和其女友劉穎停巷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榕栏,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畔勤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒磁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆揪。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妨托,靈堂內(nèi)的尸體忽然破棺而出缸榛,到底是詐尸還是另有隱情,我是刑警寧澤兰伤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布内颗,位于F島的核電站,受9級(jí)特大地震影響敦腔,放射性物質(zhì)發(fā)生泄漏均澳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望找前。 院中可真熱鬧糟袁,春花似錦、人聲如沸躺盛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槽惫。三九已至周叮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間界斜,已是汗流浹背则吟。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锄蹂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓水慨,卻偏偏與公主長得像得糜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晰洒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 隨著H5技術(shù)的興起朝抖,在iOS開發(fā)過程中,難免會(huì)遇到原生應(yīng)用需要和H5頁面交互的問題谍珊。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,075評(píng)論 1 8
  • JavaScriptCore框架主要是用來實(shí)現(xiàn)iOS與H5的交互治宣。由于現(xiàn)在混合編程越來越多,H5的相對(duì)講多砌滞,所以研...
    水靈芳蕥閱讀 1,408評(píng)論 1 8
  • 跟原生開發(fā)相比侮邀,H5的開發(fā)相對(duì)來一個(gè)成熟的框架和團(tuán)隊(duì)來講在開發(fā)速度和開發(fā)效率上有著比原生很大的優(yōu)勢(shì),至少不用等待審...
    大沖哥閱讀 1,846評(píng)論 0 7
  • 一华畏、簡介 近兩年隨著HTML5的迅速發(fā)展與日趨成熟,越來越多的移動(dòng)開發(fā)者選擇使用HTML5來進(jìn)行混合開發(fā)尊蚁,不僅節(jié)約...
    RainyGY閱讀 1,872評(píng)論 1 12
  • 紅色的磚粉挖下一片凹槽 蜘蛛網(wǎng)早已傾斜 矮矮的門墻上鍥著片片木門 在漆黑的月夜偷一束月光 槐樹下的小板凳上還留著小...
    廣莫八音閱讀 205評(píng)論 0 6