##1.UIWebView调用JavaScript ###1.1调用html中已有的JavaScript function 假设html中的JavaScript有名为JSFunction(arg)的函数,可用如下方法调用:

NSString *js = [NSString stringWithFormat:@"JSFunction('OC---Call-->JS')"];
    
NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:js];

###1.2注入JavaScript function,然后调用 我们还可以先向html中注入JavaScript function,然后调用。 通常可以在UIWebViewDelegate中注入。示例如下:

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    
    [self.webView stringByEvaluatingJavaScriptFromString:@"function injectJSFunction (parameter) { return parameter + 1;}"];
}

// Call injectJSFunction from somewhere else
    NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:@"injectJSFunction(1)"];

##2.JavaScript调用Objective-C Method JavaScript调用Objective-C方法的原理是利用UIWebView的重定向请求,传一些命令到我们的UIWebView,在UIWebView的delegate的方法中接收这些命令,并根据命令执行相应的Objc方法。示例如下:

function sendCommand(cmd,param){  
    var url="objc:"+cmd+":"+param;  
    document.location = url;  
}  
function clickLink(){  
    sendCommand("alert","hello objective-c method");  
}  
#pragma mark --  
#pragma mark UIWebViewDelegate  
  
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {  
      
    NSString *requestString = [[request URL] absoluteString];  
    NSArray *components = [requestString componentsSeparatedByString:@":"];  
    if ([components count] > 1 && [(NSString *)[components objectAtIndex:0] isEqualToString:@"objc"]) {  
        if([(NSString *)[components objectAtIndex:1] isEqualToString:@"alert"])   
        {  
            UIAlertView *alert = [[UIAlertView alloc]   
                                  initWithTitle:@"Alert from Cocoa Touch" message:[components objectAtIndex:2]  
                                  delegate:self cancelButtonTitle:nil  
                                  otherButtonTitles:@"OK", nil];  
            [alert show];  
        }  
        return NO;  
    }  
    return YES;  
} 

##3.相互传值 ##3.1UIWebView传值给JavaScript UIWebView调用JavaScript接口方法的返回值就是JavaScript传给UIWebView的值。示例如下:

NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:@"injectJSFunction(1)"];

##3.2JavaScript传值给UIWebView

最简单的方法是将参数作为URL的一部分,然后在delegate方法里截取出来。这种方法只能传简单的参数,如果是一个很复杂的对象,那么URL的编解码会很复杂。示例如下:

	dataString = JSON.stringify(data);
    identifier = (methodName+dataString).hashCode().toString();
    window.CTCallBackList[identifier] = callback;

    url = "casa://nativeapi?callbackIdentifier="+identifier+"&data="+dataString+"&methodName="+methodName;
    window.location = url;

Hybird App

在某些项目的开发中,我们可能有不更新应用版本而又添加新的功能的需求,在应用中嵌入 Web 页面是一个不错的方法,这样的应用我们称为 Hybird App。开发这样的应用时,我们可以引入第三方的JSBridge库来简化开发工作。