編寫目的:本文重點(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代碼。