javascript與OC的相互調(diào)用 (2012-09-04 10:44:32)轉(zhuǎn)載▼

編寫目的:本文重點(diǎn)闡述在iOS系統(tǒng)上通用的本地Objective-C代碼與基于Javascript的Web的應(yīng)用的互操作的基本方法,并通過具體范例說明兩種代碼的交互方式;

閱讀前提:熟悉iOS系統(tǒng)的UIWebView的功能、調(diào)用方法,相應(yīng)的UIWebViewDelegate委托的使用方法,并了解Javascript函數(shù)的基本語法與函數(shù)調(diào)用方法;

說明:正文部分紅色字體表示Javascript代碼,藍(lán)色字體部分表示Objectvie-C代碼(沒辦法貼格式了,將就看吧:();

正文:

1.? ? ? Objective-C調(diào)用Javascript方法:

前提:

UIWebView已經(jīng)完全加載完成包含需要調(diào)用的頁面(注:在UIWebViewDelegate托管中通過監(jiān)視- (void)webViewDidFinishLoad:(UIWebView *)webView調(diào)用來確定頁面是否加載完成)。

方法:

假設(shè)某視圖對象的子視圖屬性self.webview加載的頁面包含如下Javascript函數(shù):

function getString(){ return “Hello javascript!”;}

并且該函數(shù)在該頁面上可被正常調(diào)用,則可以通過形如下面的Objectvie-C方法調(diào)用此函數(shù):

NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"getString();"];

該函數(shù)調(diào)用實(shí)際模擬了頁面上的一次Javascript函數(shù)調(diào)用,因此在該函數(shù)內(nèi)部任何有效的Javascript代碼都可被執(zhí)行!該Objective-C代碼返回值為被調(diào)用的Javascript代碼的返回值,在上例中,str的值將被賦為@”Hello javascript!”。

被調(diào)用的函數(shù)可以帶有字符串或數(shù)值型的參數(shù)。若調(diào)用的Javascript函數(shù)名稱帶有參數(shù),需保證傳進(jìn)去的參數(shù)的格式正確性,特別是字符串參數(shù)的引號很容易被忽略。

2.? ? ? 系統(tǒng)響應(yīng)頁面Javascript代碼:

前提:

需要實(shí)現(xiàn)UIWebViewDelegate的

- (BOOL)webView:(UIWebView *)webView

shouldStartLoadWithRequest:(NSURLRequest *)request

navigationType:(UIWebViewNavigationType)navigationType;

托管函數(shù)(以下簡稱跳轉(zhuǎn)監(jiān)視函數(shù))并將實(shí)現(xiàn)了該托管函數(shù)的對象設(shè)置為UIWebView的delegate。

方法:

UIWebView的當(dāng)前頁面將要被Javascript代碼通過以下方式轉(zhuǎn)向的時(shí)候,會(huì)調(diào)用上述跳轉(zhuǎn)監(jiān)視函數(shù):

window.location.href=”http://www.strongsoft.net”;

此時(shí)實(shí)現(xiàn)了該托管協(xié)議的對象的跳轉(zhuǎn)監(jiān)視函數(shù)會(huì)被調(diào)用,通過如下代碼監(jiān)視瀏覽器跳轉(zhuǎn)的地址:

NSString *url = [[request URL] absoluteString];

若該托管函數(shù)返回值為NO,則頁面UIWebView的頁面跳轉(zhuǎn)將被否決。利用這一思路,監(jiān)視頁面上的特定格式的跳轉(zhuǎn)地址加以攔截,并執(zhí)行相應(yīng)的本地代碼,即可實(shí)現(xiàn)Javascript與Objective-C代碼的交互。

例如,規(guī)定攔截URL地址前綴為”objc:”的所有地址,并且用if…else…語句判定本地需要執(zhí)行的代碼,則實(shí)現(xiàn)形如以下格式的Objective-C托管函數(shù):

- (BOOL)webView:(UIWebView *)webView

shouldStartLoadWithRequest:(NSURLRequest *)request

navigationType:(UIWebViewNavigationType)navigationType

{

NSString *urlString = [[request URL] absoluteString];

NSArray *urlComps = [urlString componentsSeparatedByString:@":"];

if([urlComps count] && [[urlComps objectAtIndex:o] isEqualToString:@"objc"])

{

NSString *funcStr = [urlComps objectAtIndex:1];

if([funcStr isEqualToString:@"doFunc1"])

{

}

else if([funcStr isEqualToString:@"doFunc2"])

{

}

return NO;

}

return YES;

}

當(dāng)需要調(diào)用本地函數(shù)1時(shí),可以通過如下Javascript函數(shù)進(jìn)行:

window.location.href=”objc:doFunc1”;

根據(jù)上述思路,可以完善通過Javascript調(diào)用本地帶參數(shù)的Objective-C代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • IOS開發(fā)中Objective-C與JS互相調(diào)用實(shí)例教程本文我們來講講iOS系統(tǒng)上通用的本地Objective-C...
    亦晴工作室閱讀 2,464評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,315評論 4 61
  • 首先要理清一下關(guān)系: HTML:一些網(wǎng)頁控件。 超文本標(biāo)記語言,標(biāo)準(zhǔn)通用標(biāo)記語言(SGM或SGML)下的一個(gè)應(yīng)用。...
    goyohol閱讀 805評論 0 1
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,099評論 7 249
  • 最近看了網(wǎng)劇《最好的我們》,在洛枳出現(xiàn)的那一瞬間,有種被觸動(dòng)的感覺。洛枳愛盛淮南,誰也不知道。每次讀到這句,都感到...
    淺囈七閱讀 309評論 1 0

友情鏈接更多精彩內(nèi)容