最近项目上使用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相互调用的那些事的更多相关文章

  1. iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

    上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascr ...

  2. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  3. iOS下JS与OC互相调用(四)--JavaScriptCore

    前面讲完拦截URL的方式实现JS与OC互相调用,终于到JavaScriptCore了.它是从iOS7开始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封装了一下, ...

  4. iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    最近准备把之前用UIWebView实现的JS与原生相互调用功能,用WKWebView来替换.顺便搜索整理了一下JS 与OC 交互的方式,非常之多啊.目前我已知的JS 与 OC 交互的处理方式: * 1 ...

  5. iOS下JS与OC互相调用(二)--WKWebView 拦截URL

    在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...

  6. iOS下JS与OC互相调用

    背景情况: app项目中有几个界面是需要经常变动的(不仅是内容还有UI布局等),比如活动宣传界面就是属于这一类.但是由于AppStore提交审核也是需要时间的,就算审核快,也不至于每次都为了这点事频繁 ...

  7. iOS下JS与OC互相调用(八)--Cordova详解+实战

    扯两句,可以跳过 由于项目中Cordova相关功能一直是同事在负责,所以也没有仔细的去探究Cordova到底是怎么使用的,又是如何实现JS 与 OC 的交互.所以我基本上是从零开始研究和学习Cordo ...

  8. iOS下JS与OC互相调用(三)--MessageHandler

    使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式.那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法. Messa ...

  9. iOS下JS与OC互相调用(八)--Cordova简单实战

    新建工程,添加Cordova 关键类 新建一个工程TestCordova 然后添加:confug.xml.Private 和 Public 两个文件夹里的所有文件 然后build 发现报错 为什么有会 ...

随机推荐

  1. JAVA中一些需要记录的知识点(进阶部分)···持续更新

    1.JAVA中的相对路径 file = new file("")与file = new file("./")方式相同,该路径为整个project的根目录(实际上 ...

  2. [JAVA] - Java OutOfMemoryError分类

    Java OutOfMemoryError一般常遇到的分为两类,分别提示: "Java heap space" 和 "PermGen space",前面的是指j ...

  3. 使用Jmeter3.1进行接口测试(包含需登录后测试的接口)

    Jmeter版本为3.1,以下只针对此版本进行测试说明: 1.打开Jmeter3.1: 启动命令路径:apache-jmeter-3.1\bin\jmeter.bat 2.测试步骤: 1.测试计划-- ...

  4. php 租房子(练习题)

    一.题目要求 1.功能描述   出租房屋数据管理及搜索页面 2.具体要求 (1) 创建数据库HouseDB,创建表House,要求如下: 二.题目做法 1.建立数据库 2.封装类文件 <?php ...

  5. Javascript匿名函数

    单独的匿名函数无法运行,就算能运行,也无法调用.解决办法如下: 法1. //把匿名函数赋值给变量 var box=function(){ return "Lee"; }; aler ...

  6. javaweb 打包为安卓apk(1)-Hbuilder

    需求:当前已经完成java web项目开发,java web项目前端使用自适应框架(bootstrap),想使用最简单方式生成一个安卓apk,无需进行安卓开发(类似于手机浏览器访问一样) 要求:项目已 ...

  7. MYSQL创建用户Unknown column 'plugin' in 'mysql.user'的解决方法

    执行下列sql ALTER TABLE `user` ADD `Create_tablespace_priv` ENUM('N','Y') NOT NULL DEFAULT 'N' AFTER `Tr ...

  8. 【java基础之jdk源码】集合类

    最近在整理JAVA 基础知识,从jdk源码入手,今天就jdk中 java.util包下集合类进行理解 先看图 从类图结构可以了解 java.util包下的2个大类: 1.Collecton:可以理解为 ...

  9. 微信公众平台开发-access_token获取及应用(含源码)

    微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...

  10. 微信小程序怎样提高应用速度小技巧

    作者:vicyao, 腾讯web前端开发 高级工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/294.htm ...