iOS-原生与 js 交互
2018-09-10 本文已影响23人
梦蕊dream
最近接到一个需求,在APP 内引入其他系统售票的功能。web 页面展示其他系统的内容,包括模块信息、预下单操作和相关订单信息,然后 js 调起原生的支付系统
1.处理返回交互
在 web 页中进行多次点击后,返回上一个 web 页,而不是整个模块页面返回
解决方案:
1.手写/监听返回按钮
2.在返回按钮点击事件处理
//自定义的返回按钮
- (void)clickBackBtn:(UIButton *)btn
{
if ([self.webView canGoBack]) {
[self.webView goBack];
}else{
[self.view resignFirstResponder];
[self.navigationController popViewControllerAnimated:YES];
}
}
2.获取预下单相关数据
在 web 页操作后,获取到 web 页操作的相关下单支付的信息
解决方案
与后端协调好方法名称,然后拦截该方法名传递的相关数据
#import <JavaScriptCore/JavaScriptCore.h>
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString * title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];//获取当前页面的title
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//获取json数据
context[@"startFunction"] = ^() {
NSArray *data = [JSContext currentArguments];
for (JSValue *jsVal in data) {
//将字符串转换成NSDictionary
NSDictionary *busTicketData = [NSDictionary dictionaryWithJsonString:jsVal.toString];
NSLog(@"------%@",busTicketData);
}
};
//监测异常-页面返回
context[@"close_ios"] = ^() {
[self.view resignFirstResponder];
[self.navigationController popViewControllerAnimated:YES];
};
}
上述方法名解释:
- startFunction:和后端约定好取数据的方法名
- close_ios:和后端约定好页面异常处理方法名