最近,我使用WKWebView和React.js进行双向通信,自己写了React.js嵌入到Native中。

Native操作Web,通过两种方式传值

第一种,通过JS传值给Native

通过这种方式,可以通过Swift执行DOM操作,顺便说一句,webView.evaluateJavaScript返回脚本执行结果的内容。这个处理程序似乎是在主线程上执行的。

Native调用JS代码方法如下:

let str = "payResult(true)"
webView.evaluateJavaScript(str) { (result, error) in
}

Javascript处理逻辑方法如下:

payResult = value => {
if (value === true) {
console.log('true')
this.setState(prevState => ({
pushnotice: '1'
})); }
else {
console.log('false')
this.setState(prevState => ({
pushnotice: '0'
}));
}
}

如果JS的payResult方法没有调用,那就加上这样一句话window.payResult,有可能被组件屏蔽无法全局调用。

constructor(props) {
super(props);
window.payResult = this.payResult
}

第二种,通过get请求传值

通过get请求方式将参数传到js的请求URL链接中。

var url = ""
if let webUrl = webUrl {
url = webUrl
if let uid = userID {
url += "?" + "uid=" + uid
}
if let topicId = topicId {
url += "&" + "topic=" + topicId
}
if isRank == true {
url += "&" + "type=2"
}
}

react.js通过URL拼接方式解析传递的参数,方法如下:

var params = {}
let str = this.props.location.search
let seg = str.replace(/^?/, '').split('&')
let len = seg.length
for (var i = 0; i < len; i++) {
if (seg[i]) {
let p = seg[i].split('=');
params[p[0]] = p[1];
}
}

通过这种方式params.uid | param.topic | param.type 来获取参数

Native操作Web,通过两种方式传值

Native操作

  1. 实例化WKWebViewConfiguration和WKUserContentController,userController在JavaScript的注册处理调用名称。并设置实现WKScriptMessageHandler协议的代理。
let webConfiguration = WKWebViewConfiguration()
webConfiguration.preferences = WKPreferences()
webConfiguration.preferences.minimumFontSize = 10;
webConfiguration.p 大专栏  React.js/HTML5和iOS双向通信references.javaScriptEnabled = true;
webConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = false;
webConfiguration.userContentController = WKUserContentController()
webConfiguration.processPool = WKProcessPool()
webConfiguration.userContentController.add(self as WKScriptMessageHandler, name:"pushAction") let webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.scrollView.bounces = false
webView.scrollView.showsVerticalScrollIndicator = false
webView.scrollView.showsHorizontalScrollIndicator = false
  1. 通过WKScriptMessageHandler协议进行监控
func (_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.name)
print(message.body)
jsInvokeNativeHandler(message)
} func jsInvokeNativeHandler(_ message: WKScriptMessage) {
if message.isKind(of: WKScriptMessage.self) {
let serialQueue = DispatchQueue(label: "com.test.mySerialQueue")
serialQueue.sync {
if message.name == "pushAction" {
if let dict : NSDictionary = message.body as? NSDictionary {
if let content = dict["content"] as? String {
self.sendPushNotification(content)
}
}
}
}
}

关于解析,和Web进行协议,我在H5写的代码通过message传过来的是一个字典类型 {content: ‘…’}。

web端操作

H5如何传递方法给native?

传值方法如下,iOS和Android接受的方法不同,要单独进行处理:

window.htmlCallMobileDeja = function(handlerMethod, parameters){    

    try {
var u = navigator.userAgent;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
var isiOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/)
if (isiOS) {
if (window.webkit) {
window.webkit.messageHandlers[handlerMethod].postMessage(dic);
console.log(handlerMethod)
}
} else if(isAndroid){
window['JsClient'][handlerMethod](parameters)
}
else { }
} catch(err) {
console.log('The native context does not exist yet');
}
};

javascript通过这种方式进行传值

var dic = {
'event_name': event_name + '',
'event_first_param': event_first_param + '',
'event_second_param': event_second_param + '',
}
window.htmlCallMobileDeja('hideMBP', dic)

React.js/HTML5和iOS双向通信的更多相关文章

  1. Bodymovin:Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    转自:https://www.cnblogs.com/zamhown/p/6688369.html 大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画 ...

  2. 13个精选的React JS框架

    如果你正在使用 React.js 或 React Native 创建用户界面,可以试一试本文推荐的这些框架. React.js 和 React Native 是流行的用户界面(UI)开发平台,且都是开 ...

  3. 如何用 React Native 创建一个iOS APP?(三)

    前两部分,<如何用 React Native 创建一个iOS APP?>,<如何用 React Native 创建一个iOS APP (二)?>中,我们分别讲了用 React ...

  4. 如何用 React Native 创建一个iOS APP?(二)

    我们书接上文<如何用 React Native 创建一个iOS APP?>,继续来讲如何用 React Native 创建一个iOS APP.接下来,我们会涉及到很多控件. 1 AppRe ...

  5. 如何用 React Native 创建一个iOS APP?

    诚然,React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 Reac ...

  6. React.js学习

    React.js学习之环境搭建 1 工欲善其事必先利其器:前端开发工具 1.1 WebStorm和Sublime Text Sublime Text:作为代码编辑器,Sublime Text的优点如下 ...

  7. 前端迷思与React.js

    前端迷思与React.js 前端技术这几年蓬勃发展, 这是当时某几个项目需要做前端技术选型时, 相关资料整理, 部分评论引用自社区. 开始吧: 目前, Web 开发技术框架选型为两种的占 80% .这 ...

  8. React JS和React-Native学习指南

    自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南本指南汇集React- ...

  9. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了

    原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...

随机推荐

  1. 将keras的h5模型转换为tensorflow的pb模型

    h5_to_pb.py from keras.models import load_model import tensorflow as tf import os import os.path as ...

  2. Django专题-Cookie

      Cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响, ...

  3. 886C. Petya and Catacombs#墓室探险(set集合)

    题目出处:http://codeforces.com/problemset/problem/886/C 题目大意:很多墓穴之间有通道,探险家来回穿梭并记录日志 日志规则:第一次到该墓穴计时间t,0&l ...

  4. JS中的let变量

    介绍JS中的let变量: let允许你声明一个作用域被限制在块级中的变量.语句或者表达式.在Function中局部变量推荐使用let变量,避免变量名冲突. 作用域规则 let 声明的变量只在其声明的块 ...

  5. lombak-插件使用

    1.@Slf4j .@data 使用 依赖jar ,需要安装该插件 (https://blog.csdn.net/xue632777974/article/details/80437452) < ...

  6. Spring Boot从入门到放弃-Spring Boot 整合测试

    站长资讯摘要:使用Spring Boot 整合测试,对Controller 中某个方法进行测试或者对Service,Mapper等进行测试,不需要运行项目即可查看运行结果是否和期望值相同,Spring ...

  7. 108)PHP分页显示

    一个代码页的链接:https://www.cnblogs.com/mmykdbc/p/6688460.html 首先一个简单的代码展示: 目录关系: 数据库表格展示: 结果展示:   然后  代码展示 ...

  8. scala编程(六)——函数式对象

    Rational 的式样书 分数:rational number 是一种可以表达为比率 d n 的数字,这里的 n 和 d 是数字,其中 d 不能为零.n 被称作是分子:numerator,d 被称作 ...

  9. ISIS

    R1到R6配置ip和环回口 交换机不用配置 R6多加10.0.1.1 10.0.2.1 10.0.3.1 三个环回口 需求: 1.假如你是公司A网络管理员,公司A网络如图所示,现公司A要求如下:() ...

  10. android版本更新框架、新闻客户端、音乐播放器、自定义View、Github客户端、指南针等源码

    Android精选源码 XUpdate 一个轻量级.高可用性的Android版本更新框架 Android一个可定制的圆形进度条 Android自定义View分享 打钩动画源码 android音乐文件播 ...