iOS 关于js与OC相互调用的那些事
最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据。
项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮,调起工程里面的OCR识别功能进行识别,OCR识别的数据信息放到一个数据字典里面,直接回传值即可,用OC执行远程的js数据进行回显数据,把json字符串传给他,前端用js进行回显数据字典。
js调用OC,以WKWebview为例
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
userContentController = [WKUserContentController new];
//提供一个扫描的js
[userContentController addScriptMessageHandler:self name:@"OCRScanAction"];
WKPreferences *preferences = [WKPreferences new];
preferences.javaScriptCanOpenWindowsAutomatically=YES;
// preferences.minimumFontSize = 40;
configuration.preferences =preferences;
configuration.userContentController = userContentController;
configuration.preferences.javaScriptEnabled = YES;
webview = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) configuration:configuration];
webview.allowsBackForwardNavigationGestures = YES;//打开网页间的滑动返回
webview.allowsLinkPreview = YES; //允许预览链接
webview.navigationDelegate = self;
webview.scrollView.delegate = self;
webview.UIDelegate = self;
[webview sizeToFit];
[self.view addSubview:webview];
webview.scrollView.scrollEnabled = YES;
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webview loadRequest:request];
//js调用OC代码段实现OCR功能
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"%@",message);
NSLog(@"body:%@",message.body);
if ([message.name isEqualToString:@"OCRScanAction"]) {
//调用OCRSDK
NSLog(@"message.body==%@",[message.body objectForKey:@"_clicktype"]);
NSString *ocrType = [message.body objectForKey:@"_clicktype"];
[[NSUserDefaults standardUserDefaults] setObject:ocrType forKey:@"_clicktype"];
NSLog(@"启动OCR");
ViewController *vc = [[ViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];
}
}
ViewController 是原生的控制器进行OCR扫描,把识别的信息传值过来 发送一个通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"ocr" object:self userInfo:dict];//dict为数据字典
[self dismissViewControllerAnimated:YES completion:nil];
在H5网页控制器做监听
//设置OCR识别的监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ocrBack:) name:@"ocr" object:nil];
#pragma mark---监听事件
- (void)ocrBack:(NSNotification *)notification{
NSDictionary *dict = notification.userInfo;
NSString *jsonStr = [self dictionaryToJson:dict];
NSString *jsStr = [NSString stringWithFormat:@"OCRScanActionCallback('%@')",jsonStr];
[webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@----%@",result, error);
// NSLog(@"%@",result);
}];
}
#pragma mark --字典转换成字符串
- (NSString*)dictionaryToJson:(NSDictionary *)dic
{
NSError *parseError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options: error:&parseError];//注意这里options参数必须传0,否则回调回报语法错误
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
//就这里能显示出来回显的数据字典 把OCR扫描的结果传给H5页面上赋值进行回显。
iOS 关于js与OC相互调用的那些事的更多相关文章
- iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascr ...
- iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...
- iOS下JS与OC互相调用(四)--JavaScriptCore
前面讲完拦截URL的方式实现JS与OC互相调用,终于到JavaScriptCore了.它是从iOS7开始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封装了一下, ...
- iOS下JS与OC互相调用(一)--UIWebView 拦截URL
最近准备把之前用UIWebView实现的JS与原生相互调用功能,用WKWebView来替换.顺便搜索整理了一下JS 与OC 交互的方式,非常之多啊.目前我已知的JS 与 OC 交互的处理方式: * 1 ...
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...
- iOS下JS与OC互相调用
背景情况: app项目中有几个界面是需要经常变动的(不仅是内容还有UI布局等),比如活动宣传界面就是属于这一类.但是由于AppStore提交审核也是需要时间的,就算审核快,也不至于每次都为了这点事频繁 ...
- iOS下JS与OC互相调用(八)--Cordova详解+实战
扯两句,可以跳过 由于项目中Cordova相关功能一直是同事在负责,所以也没有仔细的去探究Cordova到底是怎么使用的,又是如何实现JS 与 OC 的交互.所以我基本上是从零开始研究和学习Cordo ...
- iOS下JS与OC互相调用(三)--MessageHandler
使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式.那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法. Messa ...
- iOS下JS与OC互相调用(八)--Cordova简单实战
新建工程,添加Cordova 关键类 新建一个工程TestCordova 然后添加:confug.xml.Private 和 Public 两个文件夹里的所有文件 然后build 发现报错 为什么有会 ...
随机推荐
- Java基于文件的对象存储
工作中经常需要处理对象的处理,有的时候还需要将对象保存到文件中做持久化. 特别是当不能使用数据库的时候就特别需要一个简单的对象集合的增删改查操作, 于是就有了下面这个文件DB的工具类 package ...
- JavaScript中的this关键字的用法和注意点
JavaScript中的this关键字的用法和注意点 一.this关键字的用法 this一般用于指向对象(绑定对象); 01.在普通函数调用中,其内部的this指向全局对象(window); func ...
- [Kafka] - Kafka基本概念介绍
Kafka官方介绍:Kafka是一个分布式的流处理平台(0.10.x版本),在kafka0.8.x版本的时候,kafka主要是作为一个分布式的.可分区的.具有副本数的日志服务系统(Kafka™ is ...
- Android开发9:网络访问&Web服务开发
前言 啦啦啦各位小伙伴们好~ 一起进入我们今天的主题.今天我们将和大家学习网络访问和Web服务开发的相关知识,一起学习熟练使用 HttpURLConnection 访问 WebService,熟悉使用 ...
- SQL SERVER的统计信息
1 什么是统计信息 统计信息 描述了 表格或者索引视图中的某些列的值 的分布情况,属于数据库对象.根据统计信息,查询优化器就能评估查询过程中需要读取的行数及结果集情况,同时也能创建高质量的查询 ...
- error LNK2001: unresolved external symbol __beginthreadex
解决方法: project->settings->C++>category->code generation->Use runtime library选Debug Mul ...
- Window下JDK安装与配置
今天项目组开会,由于.Net平台的限制无法满足现有业务需求,项目计划从.Net平台转Java平台,采用Java+Spark+Hadoop,之前关于Java和Hadoop的书也买的有只是平时看的少,最近 ...
- Django之Cookie
Cookie 在浏览器端(客户端)保存的键值对,特性:每次http请求都会携带. 举个例子:{"name":身份证号} 1丶获取cookie request.C ...
- jQuery的动态绑定事件的应用
注意:bind()的事件绑定是只对当前页面选中的元素有效.如果你想对动态创建的元素bind()事件,是没有办法达到效果的 <script src="jquery-1.11.2.min. ...
- [POJ1088] 滑雪(递归dp)
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...