zoukankan      html  css  js  c++  java
  • React.js/HTML5和iOS双向通信

    最近,我使用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)
  • 相关阅读:
    Mongdb 简单增删改查
    mongdb的安装
    VO,DO,DTO,PO,POJO,EJB
    JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!
    判断DataTale中判断某个字段中包含某个数据
    查询表中某个字段的值出现次数大于1的数据
    判断对象数组中是否含有某个对象。
    C# datatable 重新排序
    jquery 验证大于0的整数
    jQuery 心跳请求
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12347347.html
Copyright © 2011-2022 走看看