本文来源于阿里云-云栖社区,原文点击这里。
H5和NA(WebView)的交互
URL拦截
NA->H5数据传递
使用stringByEvaluatingJavaScriptFromString,直接调用H5的函数名字,参数的json字符串:
例如:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSMutableDictionary *dictInfo = [NSMutableDictionary dictionary];
[dictInfo setValue:@"value1" forKey:@"key1"];
[dictInfo setValue:@"value2" forKey:@"key2"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictInfo options:kNilOptions error:nil];
if (jsonData) {
NSString *strValueJson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *jsCode = [NSString stringWithFormat:@"picCallback&& picCallback(%@)", strValueJson];
[webView stringByEvaluatingJavaScriptFromString:jsCode];
}
}
H5->NA数据传递
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div style="margin-top: 100px">
<h1>Objective-C和JavaScript交互的那些事</h1>
<input type="button" value="CallCameraByUrl" onclick="callCameraByUrl()">
</div>
<script>
function callCameraByUrl(){
window.location.href = 'toyun://callCamera';
}
</script>
</body>
</html>
window.location.href这里是改变主窗口的指向从而马上发出一个链接为Toyun://callCamera请求,而想要传给原生应用的参数也可已包含到此请求中,而在iOS方法中我们要拦截这个请求,根据请求内容去判断JavaStript想要做的事情,从而实现web页面和本地应用之间的交互
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *url = request.URL.absoluteString;
if ([url rangeOfString:@"toyun://"].location != NSNotFound) {
// url的协议头是Toyun
NSLog(@"callCamera");
return NO;
}
return YES;
}
注意:url后面可以拼接参数,参数的每个value要在H5里面单独转码,避免特殊符号,&=以及中文.....