1. 程式人生 > >iOS中js與objective-c的互動

iOS中js與objective-c的互動

因為在iOS中沒有WebKit.Framework這個庫的,所以也就沒有 windowScriptObject物件方法了。要是有這個的方法的話
就方便多了,(ps:MacOS中有貌似)

現在我們利用其他方法去達到js與objective-c的互動效果。

首先是objective-c呼叫js中的程式碼,可以用uiwebview中的一個方法
stringByEvaluatingJavaScriptFromString:後面接的是js中的方法名。這個函式的返回值就是所呼叫js方法

的返回值。

而在js呼叫objective-c的方法就沒那麼簡單了,

在js中的程式碼應該這麼做:

function testFunc(cmd,parameter1)
{
    alert(1);
    document.write(Date());
    document.location="objc://"+cmd+":/"+parameter1;  //cmd代表objective-
c中的的方法名,parameter1自然就是引數了

}

而在objective-c中,也是利用uiwebview的一個方法,
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:
(NSURLRequest*)request navigationType:
(UIWebViewNavigationType)navigationType //這個方法是網頁

中的每一個請求都會被觸發的
{
    NSString *urlString = [[request URL] absoluteString];

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

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

        NSArray *arrFucnameAndParameter = [(NSString*)[urlComps
objectAtIndex:1] componentsSeparatedByString:@":/"];
        NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0];

        if (1 == [arrFucnameAndParameter count])
        {
            // 沒有引數
            if([funcStr isEqualToString:@"doFunc1"])
            {

                /*呼叫本地函式1*/
                NSLog(@"doFunc1");

            }
        }
        else if(2 == [arrFucnameAndParameter count])
        {
            //有引數的
            if([funcStr isEqualToString:@"doFunc1"] &&
[arrFucnameAndParameter objectAtIndex:1])
            {
               /*呼叫本地函式1*/
                NSLog(@"doFunc1:parameter");
            }
        }
        return NO;
    };
    return YES;

}

這個方法是可以達到js呼叫本地objective-c的方法,可惜沒辦法把返回值返回給js,所以還是要繞過
stringByEvaluatingJavaScriptFromString:這個彎,用

stringByEvaluatingJavaScriptFromString:函式去掉js的方法,把返回值當做js方法中的引數形式傳回去給
js。