iOS系統的Javascript與Objective-C互操作指南

來源:互聯網
上載者:User

轉自: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代碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.