• 问题

    感觉到uni-app框架有pit,公司强推该框架的小哥识趣的闭嘴,考虑到全盘替换周期跟成本挺大,基于uni-app能打包成H5,采用webview+js的原生方式集成

    基本结构:原生壳 + webview[iOS & Android] + js

  • 方案

    确定基础框架后,主要的问题就是web与js的交互,限于技术能力,只谈iOS方向

    首先,UIWebView用的不多,已经iOS14+了,用UIWebView不被diss的话,大概你们团队也就那样了,其对应的交互框架为JavaScriptCore。Pass不讲

    再次,可拦截跳转的url并解析,以约定好的key/value,调用原生方法,该交互方式满足简单的功能需求,仅限web唤起iOS调用,看情况

    接着,WKWebview中,JS调用native方法,通过WKScriptMessageHandler协议,核心是:window.webkit.messageHandlers.方法名.postMessage(参数),native调用JS就简单很多,核心是:[weblview evaluateJavaScript:xxx completionHandler: ^(id object, NSError * _Nullable error) { }];

    如上:如果有异步操作,怎么办?如果实现block岂不更好?

    最后:WebViewJavascriptBridge,来吧,你值得拥有

  • 剖析

    1.js调用native方法

      - html中web中按钮点击,
    - bridge调用callHandler,
    - 调用_doSend()
    - 赋值messagingIframe.src = xxx://__wvjb_queue_message__
    - native的webview执行代理方法decidePolicyForNavigationAction
    - 获取url, native执行WKFlushMessageQueue
    - webview执行evaluateJavaScript, 调用js的_fetchQueue(),把_doSend()调用时写入sendMessageQueue中的值取出来,即获取js传递过来的参数
    - native方法flushMessageQueue,处理js传递过来的参数,封装在block中
    - 注意:js传递过来的参数,有可能还有function回调的存在,function是解决js调用native之后,native的执行结果回调给js,形成一个js->native->js的过程。

    2.native调用js方法

      - native中的bridge调用callHandler方法
    - BridgeBase中调用-(void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName
    - BridgeBase中调用_queueMessage
    - 这里有个判断,当startupMessageQueue!=nil时,消息放在数组中,当=nil时,直接调用_dispatchMessage
    - native中startupMessageQueue在执行injectJavascriptFile方法后会被设置为nil
    - injectJavascriptFile追溯可知当decidePolicyForNavigationAction中判断url的host=__bridge_loaded__时调用,
    - 而在js中设置的bridge时设置的WVJBIframe.src = 'https://__bridge_loaded__', 到此应该不用多问,剖析_dispatchMessage
    - _dispatchMessage中执行_evaluateJavascript, 执行的js中的方法_handleMessageFromObjC(xxx)
    - Bridge_JS中查询_dispatchMessageFromObjC, 接着调用_dispatchMessageFromObjC
    - 此时设置回调A-block, 里面的数据是js中的执行结果,js在开始的时候注册registerHandler,是key/block,此时通过key可以找到对应的B-block,将message传递过来的data跟设置的A-block当做对应的key/block的B-block的参数,直接执行该B-block即可。能够在js的registerHandler中获取到native传递过来的参数,同时也能够通过A-block将js的执行结果回调给native

    3.总结

      初始化时给web注入不少料,核心是 1.拦截url, 2.回调实现基于初始化注入字典便于key/value方式管理block 3.evaluateJavaScript执行js

    4.延伸

      如上的做法适合UIWebView&WKWebView。实际上如果只针对WKWebView的话,可在_doSend方法中直接调用window.webkit.messageHandlers.xxx.postMessage(null),而非设置src的方式。可参照WKWebViewJavascriptBridge
  • Game Over。

iOS中web与Js的交互的更多相关文章

  1. iOS中UIWebView执行JS代码(UIWebView)

    iOS中UIWebView执行JS代码(UIWebView) 有时候iOS开发过程中使用 UIWebView 经常需要加载网页,但是网页中有很多明显的标记让人一眼就能看出来是加载的网页,而我们又不想被 ...

  2. iOS中web app调试(mac)

    原文 iOS中web app调试(mac).md 目录 一.真机联调配置 二.mac上Safari配置及真机联调 三.iOS模拟器使用 四.在iOS模拟器中安装app 近期公司vue项目开发,目的是一 ...

  3. 安卓中java和js如何交互

    1.安卓中java和js如何交互 在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过add ...

  4. iOS中UIWebView使用JS交互 - 机智的新手

    iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...

  5. iOS中UIWebView使用JS交互

    iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...

  6. [原]iOS中 Web 页面与 Native Code 的一种通信方式

    在 iOS 开发中,Web 页面与 Native Code 通信可以分为两个方面: 1.Native Code 调用 Web 页面的方法:主要是调用页面中的 Javascript 函数. 2.Web ...

  7. JS 解决 IOS 中拍照图片预览旋转 90度 BUG

    上篇博文[ Js利用Canvas实现图片压缩 ]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编 ...

  8. iOS中使用UIWebView与JS进行交互

    iOS中使用UIWebView与JS进行交互 前一段忙着面试和复习,这两天终于考完试了,下学期的实习也有了着落,把最近学的东西更新一下,首先是使用UIWebView与JS进行交互 在webView中我 ...

  9. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

随机推荐

  1. 阅读笔记:Item-based Collaborative Filtering Recommendation Algorithms

    概要: 推荐系统通过信息获取技术解决在线的个人的消息.产品或者服务的推荐问题.这些系统,特别是基于k临近协同过滤算法,在网络上取得了广泛的成功.可用信息和访问人数的巨大增加成了推荐系统一个难题.基于商 ...

  2. 放苹果 POJ - 1664 递推

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t < ...

  3. Codeforces Beta Round #19 D. Points

    Description Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a C ...

  4. 记录一些Python中不常用但非常好用的函数

    zfill(): 方法返回指定长度的字符串,原字符串右对齐,前面填充0. print('Helloworld'.zfill(50))0000000000000000000000000000000000 ...

  5. C# 之 async / await

    直接看一个例子 private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { T ...

  6. ABP设置管理模块: Abp.SettingUi

    开源地址: https://github.com/EasyAbp/Abp.SettingUi 一直想宣传一下SettingUi, 因为 懒 工作比较忙, 所以才拖到今天. 关于ABP就不需要我再多废口 ...

  7. Redis 管理命令

    INFO 命令 # 查看redis相关信息 127.0.0.1:6379> info # 服务端信息 # Server # 版本号 redis_version:3.2.12 # redis版本控 ...

  8. LINUX - openssl学习

    参考链接: https://www.cnblogs.com/AloneSword/p/4656492.html

  9. 2017CCCC决赛 L1-3. 阅览室

    L1-3 阅览室(20 分) 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过 ...

  10. BZOJ 3676 回文串(回文树)题解

    题意: 一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值 思路: 回文树模板题,跑PAM,然后计算所有节点出现次数. 参考: 回文串问题的克星--Palindrome Tree(回文 ...