iOS中JavaScript和OC交互

iOS中JavaScript和OC交互

在iOS開發(fā)中很多時(shí)候我們會(huì)和UIWebView打交道狡孔,目前國內(nèi)的很多應(yīng)用都采用了UIWebView的混合編程技術(shù),最常見的是微信公眾號(hào)的內(nèi)容頁面。前段時(shí)間在做微信公眾平臺(tái)相關(guān)的開發(fā)他嚷,發(fā)現(xiàn)很多應(yīng)用場景都是利用HTML5和UIWebView來實(shí)現(xiàn)的坤溃。

機(jī)制
Objective-C語言調(diào)用JavaScript語言,是通過UIWebView的 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;的方法來實(shí)現(xiàn)的昧互。該方法向UIWebView傳遞一段需要執(zhí)行的JavaScript代碼最后獲取執(zhí)行結(jié)果挽铁。

JavaScript語言調(diào)用Objective-C語言,并沒有現(xiàn)成的API敞掘,但是有些方法可以達(dá)到相應(yīng)的效果叽掘。具體是利用UIWebView的特性:在UIWebView的內(nèi)發(fā)起的所有網(wǎng)絡(luò)請(qǐng)求,都可以通過delegate函數(shù)得到通知玖雁。

示例
下面提供一個(gè)簡單的例子介紹如何相互的調(diào)用更扁,實(shí)現(xiàn)的效果是在界面上點(diǎn)擊一個(gè)鏈接,然后彈出一個(gè)對(duì)話框判斷是否登錄成功赫冬。

uiwebview_js_demo.png

(1)示例的HTML的源碼如下:

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta content="always" name="referrer" />
<title>測試網(wǎng)頁</title>
</head>
<body>
<br />
<a href="devzeng://login?name=zengjing&password=123456">點(diǎn)擊鏈接</a>
</body>
</html>
(2)UIWebView Delegate回調(diào)方法為:

  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
    NSURL *url = [request URL];
    if([[url scheme] isEqualToString:@"devzeng"]) {
    //處理JavaScript和Objective-C交互
    if([[url host] isEqualToString:@"login"])
    {
    //獲取URL上面的參數(shù)
    NSDictionary *params = [self getParams:[url query]];
    BOOL status = [self login:[params objectForKey:@"name"] password:[params objectForKey:@"password"]];
    if(status)
    {
    //調(diào)用JS回調(diào)
    [webView stringByEvaluatingJavaScriptFromString:@"alert('登錄成功!')"];
    }
    else
    {
    [webView stringByEvaluatingJavaScriptFromString:@"alert('登錄失敗!')"];
    }
    }
    return NO;
    }
    return YES;
    }
    說明:

1浓镜、同步和異步的問題

(1)Objective-C調(diào)用JavaScript代碼的時(shí)候是同步的

  • (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

(2)JavaScript調(diào)用Objective-C代碼的時(shí)候是異步的

  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

2、常見的JS調(diào)用

(1)獲取頁面title

NSString *title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];

(2)獲取當(dāng)前的URL

NSString *url = [webview stringByEvaluatingJavaScriptFromString:@"document.location.href"];

3劲厌、使用第三方庫

https://github.com/marcuswestin/WebViewJavascriptBridge

使用案例
1膛薛、動(dòng)態(tài)將網(wǎng)頁上的圖片全部縮放

JavaScript腳本如下:

function ResizeImages() {
var myImg, oldWidth;
var maxWidth = 320;
for(i = 0; i < document.images.length; i++) {
myImg = document.images[i];
if(myImg.width > maxWidth) {
oldWidth = myImg.width;
myImg.width = maxWidth;
myImg.heith = myImg.height*(maxWidth/oldWidth);
}
}
}
在iOS代碼中添加如下代碼:

[webView stringByEvaluatingJavaScriptFromString:
@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = "function ResizeImages() { "
"var myimg,oldwidth;"
"var maxwidth=380;" //縮放系數(shù)
"for(i=0;i <document.images.length;i++){"
"myimg = document.images[i];"
"if(myimg.width > maxwidth){"
"oldwidth = myimg.width;"
"myimg.width = maxwidth;"
"myimg.height = myimg.height * (maxwidth/oldwidth);"
"}"
"}"
"}";"
"document.getElementsByTagName('head')[0].appendChild(script);"];
[webView stringByEvaluatingJavaScriptFromString:@"ResizeImages();"];
參考資料
1、《關(guān)于UIWebView和PhoneGap的總結(jié)》

2补鼻、《iOS開發(fā)之Objective-C與JavaScript的交互 》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哄啄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子风范,更是在濱河造成了極大的恐慌咨跌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硼婿,死亡現(xiàn)場離奇詭異虑润,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)加酵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門拳喻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哭当,“玉大人,你說我怎么就攤上這事冗澈∏湛保” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵亚亲,是天一觀的道長彻采。 經(jīng)常有香客問我,道長捌归,這世上最難降的妖魔是什么肛响? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮惜索,結(jié)果婚禮上特笋,老公的妹妹穿的比我還像新娘。我一直安慰自己巾兆,他們只是感情好猎物,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著角塑,像睡著了一般蔫磨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圃伶,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天堤如,我揣著相機(jī)與錄音,去河邊找鬼窒朋。 笑死搀罢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炼邀。 我是一名探鬼主播魄揉,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼剪侮,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼拭宁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓣俯,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤杰标,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后彩匕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腔剂,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年驼仪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掸犬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袜漩。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖湾碎,靈堂內(nèi)的尸體忽然破棺而出宙攻,到底是詐尸還是另有隱情,我是刑警寧澤介褥,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布座掘,位于F島的核電站,受9級(jí)特大地震影響柔滔,放射性物質(zhì)發(fā)生泄漏溢陪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一睛廊、第九天 我趴在偏房一處隱蔽的房頂上張望形真。 院中可真熱鬧,春花似錦喉前、人聲如沸没酣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至催训,卻和暖如春见咒,著一層夾襖步出監(jiān)牢的瞬間偿衰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工改览, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留下翎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓宝当,卻偏偏與公主長得像视事,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庆揩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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