iOS和html交互-UIWebView

本文最后更新于:2 年前

UIWebView是苹果公司自iOS 2提供的加载html页面的容器,一直到现在还可以继续使用,早期web页面和手机容器并没有太多的交互,在iOS 7发布了JavaScriptCore框架以及html 5成熟之后,iOSUIWebViewhtml的加载能力和交互能力得到了显著的提升。

一、web页面调用iOS原生提供的方法

方法一、拦截url

前端人员需要和iOS开发约定好参数,例如约定jsAction://openScan为打开手机摄像头进行扫码,前端通过页面重定向的方式,加载约定好的参数,iOS开发通过代理方法中拦截,进行原生的逻辑调用,如果需要传递参数给原生,那么需要拼接在约定字符串后面,约定格式进行解析

1
2
3
4
5
6
7
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([request.URL.absoluteString hasPrefix:@"jsAction://openScan"]) {
//调用原生扫描二维码
return NO;
}
return YES;
}

方法二、iOS7之后提供的JavaScriptCore

在工程中引入JavaScriptCore的框架,在UIWebView的代理方法中通过指定的API即可与web页面进行交互,如下

1
2
//js代码
var codeStr = openScan();
1
2
3
4
5
6
7
8
9
10
11
12
13
//iOS代码
- (void)webViewDidFinishLoad:(UIWebView *)webView {
JSContext *jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

jsContext[@"openScan"] = ^(){
NSArray *args = [JSContext currentArguments];
NSString *params1 = ((JSValue *)args[0]).toString;
NSString *params2 = ((JSValue *)args[1]).toString;
//原生方法

return @"二维码字符串";
};
}

其中documentView.webView.mainFrame.javaScriptContext为获取JSContext类的固定key值,openScan为约定好的方法名称,参数可以通过指定的方法获取,这里的参数获取顺序和web页面传递参数的顺序是一致的,原生在JSContext的回调里面return参数回传给web

二、原生调用web页面的方法

首先,是通过UIWebViewloadRequest方法来加载页面,可以在url后面拼接参数给web页面获取,页面加载完成后可以使用stringByEvaluatingJavaScriptFromString方法来直接调用web页面中的方法

1
2
3
//iOS代码
NSString *jsStr = [NSString stringWithFormat:@"getCodeString('%@')", @"二维码字符串"];
[self.webView stringByEvaluatingJavaScriptFromString:jsStr];
1
2
3
4
5
//js代码
window.getCodeString = function(codeStr) {
alert('二维码字符串' + codeStr);
}

以上介绍的交互方式在安卓上同样有相应的方法,感兴趣的可以自己查询下。