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

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

第一种,通过JS传值给Native

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

Native调用JS代码方法如下:

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

Javascript处理逻辑方法如下:

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

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

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

第二种,通过get请求传值

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

  1. 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拼接方式解析传递的参数,方法如下:

  1. 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协议的代理。
  1. let webConfiguration = WKWebViewConfiguration()
    webConfiguration.preferences = WKPreferences()
    webConfiguration.preferences.minimumFontSize = 10;
    webConfiguration.p 大专栏  React.js/HTML5iOS双向通信references.javaScriptEnabled = true;
    webConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = false;
    webConfiguration.userContentController = WKUserContentController()
    webConfiguration.processPool = WKProcessPool()
    webConfiguration.userContentController.add(self as WKScriptMessageHandler, name:"pushAction")
  2.  
  3. let webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.scrollView.bounces = false
    webView.scrollView.showsVerticalScrollIndicator = false
    webView.scrollView.showsHorizontalScrollIndicator = false
  1. 通过WKScriptMessageHandler协议进行监控
  1. func (_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print(message.name)
    print(message.body)
    jsInvokeNativeHandler(message)
    }
  2.  
  3. 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接受的方法不同,要单独进行处理:

  1. window.htmlCallMobileDeja = function(handlerMethod, parameters){
  2.  
  3. 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 {
  4.  
  5. }
    } catch(err) {
    console.log('The native context does not exist yet');
    }
    };

javascript通过这种方式进行传值

  1. 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. P2P平台爆雷不断到底是谁的过错?

    早在此前,范伟曾经在春晚上留下一句经典台词,"防不胜防啊".而将这句台词用在当下的P2P行业,似乎最合适不过了.就在这个炎热夏季,P2P行业却迎来最冷冽的寒冬. 引发爆雷潮的众多P ...

  2. 国产手机早就异军突起,为何还是有很多人“迷恋”iPhone?

    近几年,国产手机不论是从外观上还是设计上,以及销量上都比前有了长足的进步,手机的品质和售后也在不断提升.这也让中国手机厂商不断的推出了拥有自己品牌特色的产品.特别是2018年不少国产手机品牌的旗舰级产 ...

  3. python-day6爬虫基础之会话、Cookies、代理

    由于前几天看电脑时间过长,在昨天的时候,两个眼睛就有点疼痛感觉,所以昨天晚上就没有学习,博客也没有跟着写,今早去校医院买了点药,上午把老师要求的电路板画完了,已经发出去做了,现在闲来无事,看了一会关于 ...

  4. Python Numpy中数据的常用的保存与读取方法

    在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多. 下面就常用的保存数据到二进制文件和保存数据到文本文件 ...

  5. 四、Shell脚本高级编程实战第四部

    一.比较两个数的大小 #!/bin/shread -p "Pls input two num:" a b[ -z "$a" ] || [ -z "$b ...

  6. Utf8BomRemover

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...

  7. Codeforces1303F Number of Components

    Description link 题意:给一个全\(0\)矩阵,每次支持一个修改,修改不还原(这要是还原了不就成\(A\)题了) 然后询问每一次修改完了当前矩阵的连通块个数 每一个修改的值单调不降 修 ...

  8. HDU-1828 Picture(扫描线 求矩形并的周长)

    http://acm.hdu.edu.cn/showproblem.php?pid=1828 Time Limit: 6000/2000 MS (Java/Others)    Memory Limi ...

  9. [LC] 1007. Minimum Domino Rotations For Equal Row

    In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino.  (A domi ...

  10. AdminWebSessionManager AdminAuthorizingRealm ShiroConfig ShiroExceptionHandler

    package org.linlinjava.litemall.admin.shiro; import com.alibaba.druid.util.StringUtils; import org.a ...