轉自:http://blog.csdn.net/leebing505/article/details/6432326
編寫目的:本文重點闡述在iOS系統上通用的本地Objective-C代碼與基於Javascript的Web的應用的互操作的基本方法,並通過具體範例說明兩種代碼的互動方式;
閱讀前提:熟悉iOS系統的UIWebView的功能、調用方法,相應的UIWebViewDelegate委託的使用方法,並瞭解Javascript函數的基本文法與函數調用方法;
說明:本文部分紅色字型表示Javascript代碼,藍色字型部分表示Objectvie-C代碼(沒辦法貼格式了,將就看吧:();
本文:
1. Objective-C調用Javascript方法:
前提:
UIWebView已經完全載入完成包含需要調用的頁面(註:在UIWebViewDelegate託管中通過監視- (void)webViewDidFinishLoad:(UIWebView *)webView調用來確定頁面是否載入完成)。
方法:
假設某視圖對象的子視圖屬性self.webview載入的頁麵包含如下Javascript函數:
function getString(){ return “Hello javascript!”;}
並且該函數在該頁面上可被正常調用,則可以通過形如下面的Objectvie-C方法調用此函數:
NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"getString();"];
該函數調用實際類比了頁面上的一次Javascript函數調用,因此在該函數內部任何有效Javascript代碼都可被執行!該Objective-C代碼傳回值為被調用的Javascript代碼的傳回值,在上例中,str的值將被賦為@”Hello javascript!”。
被調用的函數可以帶有字串或數值型的參數。若調用的Javascript函數名稱帶有參數,需保證傳進去的參數的格式正確性,特別是字串參數的引號很容易被忽略。
2. 系統響應頁面Javascript代碼:
前提:
需要實現UIWebViewDelegate的
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType;
託管函數(以下簡稱跳轉監視函數)並將實現了該託管函數的對象設定為UIWebView的delegate。
方法:
UIWebView的當前頁面將要被Javascript代碼通過以下方式轉向的時候,會調用上述跳轉監視函數:
window.location.href=”http://www.strongsoft.net”;
此時實現了該託管協議的對象的跳轉監視函數會被調用,通過如下代碼監視瀏覽器跳轉的地址:
NSString *url = [[request URL] absoluteString];
若該託管函數傳回值為NO,則頁面UIWebView的頁面跳轉將被否決。利用這一思路,監視頁面上的特定格式的跳轉地址加以攔截,並執行相應的本地代碼,即可實現Javascript與Objective-C代碼的互動。
例如,規定攔截URL地址首碼為”objc:”的所有地址,並且用if…else…語句判定本地需要執行的代碼,則實現形如以下格式的Objective-C託管函數:
- (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"])
{
/*調用本地函數1*/
}
else if([funcStr isEqualToString:@"doFunc2"])
{
/*調用本地函數2*/
}
return NO;
}
return YES;
}
當需要調用本地函數1時,可以通過如下Javascript函數進行:
window.location.href=”objc:doFunc1”;
根據上述思路,可以完善通過Javascript調用本地帶參數的Objective-C代碼。