标签:
在iOS开发中很多时候我们会和UIWebView打交道,目前国内的很多应用都采用了UIWebView的混合编程技术,最常见的是微信公众号的内容页面。
机制
OC语言调用JavaScript语言,是通过UIWebView中的代理方法:- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;来实现的。该方法向UIWebView传递一段需要执行的JavaSript代码最后获取之行结果
JavaScript语言调用OC语言,没有现成的API,但是使用某些方法可以达到相应的效果。具体是利用UIWebView的特性:UIWebView内发起的所有网络请求,都是通过delegate函数得到通知。
(1)实例的HTML源码如下
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta content="always" name="referrer" />
<title>测试网页</title>
</head>
<body>
<br />
<a href="devzeng://login?name=zengjing&password=123456">点击链接</a>
</body>
</html>
(2)UIWebView Delegate回调方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = [request URL]; if([[url scheme] isEqualToString:@"devzeng"]) { //处理JavaScript和Objective-C交互 if([[url host] isEqualToString:@"login"]) { //获取URL上面的参数 NSDictionary *params = [self getParams:[url query]]; BOOL status = [self login:[params objectForKey:@"name"] password:[params objectForKey:@"password"]]; if(status) { //调用JS回调 [webView stringByEvaluatingJavaScriptFromString:@"alert(‘登录成功!‘)"]; } else { [webView stringByEvaluatingJavaScriptFromString:@"alert(‘登录失败!‘)"]; } } return NO; } return YES; }
重要说明:
1、同步和异步的问题
OC调用JavaScript代码的时候是同步的
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
JavaScript调用OC代码的时候是异步的
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
2、常见的JS调用
获取页面的title
NSString *title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];
获取当前的URL
NSString *url = [webview stringByEvaluatingJavaScriptFromString:@"document.location.href"];
标签:
原文地址:http://www.cnblogs.com/cookiess/p/5434567.html