在iOS应用的开发过程中,我们经常会使用到WebView,当我们对WebView进行操作的时候,有时会需要进行源生的操作
先说第一种方法,只是做拦截和跳转.
拦截跳转的URL,跳转源生界面
[Objective-C] 纯文本查看 复制代码 //UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *url = request.URL.absoluteString;
if ([url rangeOfString:@"需要跳转源生界面的URL判断"].location != NSNotFound) {
//跳转原生界面
return NO;
}
return YES;
}
但这样会有问题,如果URL需要更换,这样就麻烦了。
下面介绍与JS交互
1.执行js代码
[Objective-C] 纯文本查看 复制代码 NSString *jsStr = @"执行的JS代码";
[webView stringByEvaluatingJavaScriptFromString:jsStr];
2.使用JavaScriptCore框架
[Objective-C] 纯文本查看 复制代码 #import <JavaScriptCore/JavaScriptCore.h>
[Objective-C] 纯文本查看 复制代码 - (void)webViewDidFinishLoad:(UIWebView *)webView {
//获取webview中的JS内容
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *runJS = @"执行的JS代码";
//准备执行的JS代码
[context evaluateScript:runJS];
}
JS调用OC
当网页触发某种操作,可以给App传递消息.比如WebView中购买某样东西,点击购买,需要获取这件商品的订单信息,并且需要App进行源生的支付.
这种方法需要你和后台或者前端协商好一下,让他们在执行JS方法的时候,将你需要的数据放到你能拿到的位置.
下面简单贴一个HTML文件.
[Objective-C] 纯文本查看 复制代码 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>App与WebView交互</title>
</head>
<body>
<button style="width: 100%; height: 100px;">点击购买</button>
</body>
<script>
//按钮点击事件
function buttonClick() {
//传递的信息
var jsonStr = '{"id":"666", "message":"我是传递的数据"}';
//UIWebView使用
getMessage(jsonStr);
//WKWebView使用
//使用下方方法,会报错,为使界面执行逻辑通畅,因此使用try-catch
try {
window.webkit.messageHandlers.getMessage.postMessage(jsonStr)
} catch(error) {
console.log(error)
}
}
function getMessage(json){
//空方法
}
</script>
</html>
window.webkit.messageHandlers.<方法名>.postMessage(<数据>)
JS端写此方法的盆友可能会报错,导致界面逻辑无法进行,因此使用try-catch就好了.
我在网页上只写了一个按钮.点击按钮,会触发buttonClick()方法.
在网页加载完成的时候检测JS方法执行.
[Objective-C] 纯文本查看 复制代码 - (void)webViewDidFinishLoad:(UIWebView *)webView {
//核心方法如下
JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//此处的getMessage和JS方法中的getMessage名称一致.
content[@"getMessage"] = ^() {
NSArray *arguments = [JSContext currentArguments];
for (JSValue *jsValue in arguments) {
NSLog(@"=======%@",jsValue);
}
};
}
由上方方法,当JS方法getMessage()执行的时候,此方法回调的jsValue内容就是我们需要的内容.(HTML中JS传递的数据)
|