最近在做混编项目,也是从项目里开始接触Cordova框架,网上很多帖子都总结的很好,我还是要总结一下,便于加深一下。

Cordova框架是一个可以让JS与原生代码(包括 Android 的 java,iOS 的 Objective-C 等)互相通信的一个库,并且提供了一系列的插件类,比如 JS 直接操作本地数据库的插件类。

要想明白它是如何互相通信的需要弄清楚下面三个问题:

1.JS怎么跟Objective-C通信

2.Objective-C怎么跟JS通信

3.JS请求Objective-C,Objective-C返回结果给JS,这样一来一往是怎么串起来的

JS与OC通信的关键代码在框架中Cordova.js文件中:

首先, HTML中需要加载Cordova.js

<script type="text/javascript" src="cordova.js"></script>

然后JS调用原生:

// successCallback : 成功的回调方法
// failCallback : 失败的回调方法
// server : 所要请求的服务名字,就是插件类的名字
// action : 所要请求的服务具体操作,其实就是Native 的方法名,字符串。
// actionArgs : 请求操作所带的参数,这是个数组。
cordova.exec(successCallback, failCallback, service, action, actionArgs);

cordova.js里定义的一个 var结构体,里面有一些方法以及其他变量,关于exec ,可以看 iOSExec这个js 方法,穿进来的这五个参数并不会直接传给原生,cordova.js会先做这样的处理:

  1. 会为每个请求生成一个叫 callbackId 的唯一标识:这个参数需传给 Objective-C 端,Objective-C 处理完后,会把 callbackId 连同处理结果一起返回给 JS 端
  2. 以 callbackId 为 key,{success:successCallback, fail:failCallback} 为 value,把这个键值对保存在 JS 端的字典里,successCallback 与 failCallback 这两个参数不需要传给 Objective-C 端,Objective-C 返回结果时带上 callbackId,JS 端就可以根据 callbackId 找到回调方法
  3. 每次 JS 请求,最后发到 Objective-C 的数据包括:callbackId, service, action, actionArgs 。

那么iOSExec又是怎么调用原生的呢:

实际上就是做一个假的url,在原生的webview中进行拦截。

原生代码拿到 callbackId、service、action 及 actionArgs 后,会做以下的处理:

  1. 根据 service 参数找到对应的插件类
  2. 根据 action 参数找到插件类中对应的处理方法,并把 actionArgs 作为处理方法请求参数的一部分传给处理方法
  3. 处理完成后,把处理结果及 callbackId 返回给 JS 端,JS 端收到后会根据 callbackId 找到回调方法,并把处理结果传给回调方法

关键代码:

- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId
{CDV_EXEC_LOG(@"Exec(%@): Sending result. Status=%@", callbackId, result.status);// This occurs when there is are no win/fail callbacks for the call.if ([@"INVALID" isEqualToString : callbackId]) {return;}int status = [result.status intValue];BOOL keepCallback = [result.keepCallback boolValue];NSString* argumentsAsJSON = [result argumentsAsJSON];// 将请求的处理结果及 callbackId 通过调用 JS 方法返回给 JS 端NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d)", callbackId, status, argumentsAsJSON, keepCallback];[self evalJsHelper:js];
}

// 根据 callbackId 及是否成功标识,找到回调方法,并把处理结果传给回调方法
callbackFromNative: function(callbackId, success, status, args, keepCallback) {var callback = cordova.callbacks[callbackId];if (callback) {if (success && status == cordova.callbackStatus.OK) {callback.success && callback.success.apply(null, args);} else if (!success) {callback.fail && callback.fail.apply(null, args);}// Clear callback if not expecting any more resultsif (!keepCallback) {delete cordova.callbacks[callbackId];}}}

JS 端根据 callbackId 回调。

转载于:https://www.cnblogs.com/byxixiblogs/p/6547611.html

Cordova框架基本原理相关推荐

  1. php框架实现原理,Ylmf-PHP框架基本原理

    一.初始化过程 1.94hwan-PHP框架的入口点都是加载根目录的 init.php 来初始化的,因此在这里主要介绍一下初始化时到底做了一些什么. // 严格开发模式 error_reporting ...

  2. Cordova框架的使用(一)

    Android H5混合开发记录 Cordova概述 环境搭建 创建Cordova项目 测试Cordova项目 Cordova概述 Cordova 是用于使用HTML,CSS和JS构建移动应用的平台. ...

  3. Struts1.x框架基本原理

    在struts1.x中,常用的组件是JSP,ActionServlet,ActionForm,Action,JavaBean,配置文件等,关系如图: 其执行步骤是: 1,用户输入,JSP表单提交给Ac ...

  4. Cordova android框架详解

    一.Cordova 核心java类说明 CordovaActivity:Cordova Activity入口,已实现PluginManager.WebView的相关初始化工作, 只需继承Cordova ...

  5. Cordova UI框架使用整理(一)_Cordova + Framework7

    一.Cordova UI框架使用整理 Cordova框架主要针对jsApi的封装,如果想更方便的开发,还得借助于其他的框架比如: ionic,framework7,vue,jquery mobile, ...

  6. Cordova项目中使用BUI框架,以及常见问题解答

    一.Cordova框架浅谈以及安装跟创建项目   Cordova官网:http://cordova.axuer.com/ (1).什么是Cordova             简单来说就是可以把你的前 ...

  7. cordova入门——cordova环境配置

     首先,搞清楚一个概念,phonegap与cordova之间的区别.其实, phoneGap是原先的名字,Adobe将phoneGap捐给apache之后,起了另外的一个名字--apache co ...

  8. SAP UI5 应用开发教程之五十 - 如何使用 Cordova 将 SAP UI5 应用生成一个能在 Android 手机上安装的混合应用

    本教程之前四十九个步骤,介绍的都是在 PC 桌面端进行 SAP UI5 应用开发的技巧. 本文介绍如何将这些原本只能运行在浏览器端的 SAP UI5 应用,使用 Cordova 进行构建,打包,然后安 ...

  9. Cordova应用的JavaScript代码和自定义插件代码的调试

    我之前写过三篇Cordova相关的技术文章.当我们使用Cordova将自己开发的前端应用打包安装到手机上后,可能会遇到需要调试Cordova应用的时候. 本文就介绍Cordova应用的调试步骤. 如果 ...

  10. HTML5应用 + Cordova = 平台相关的混合应用

    Jerry之前的一篇文章 SAP Fiori应用的三种部署方式 曾经提到SAP Fiori应用的三种部署方式: On Premise环境下以ABAP BSP应用作为Fiori应用部署和运行的载体 部署 ...

最新文章

  1. python语言入门编程猫-编程猫推出海龟编程器,打造Python教育产品矩阵
  2. node 生成随机头像_唯一ID生成算法剖析
  3. 把我坑惨的一个MySQL双引号!
  4. Spring 2.X 中AOP的简明教程
  5. 定量遥感:计算地方时和太阳高度角(C++代码)
  6. c++ || && 逻辑短路问题
  7. iOS-仿智联字符图片验证码
  8. 香农编码的 matlab 实现
  9. 游戏开发之C++类中的static、const梳理总结(C++基础)
  10. block的名词形式_block是什么意思_block在线翻译_英语_读音_用法_例句_海词词典
  11. docker android模拟器,Docker中的Android模拟器
  12. 江苏大学京江学院计算机怎么样,江苏大学京江学院是几本 学生评价怎么样好不好(10条)...
  13. apicloud打开地图导航
  14. 【计算机基础】二进制和十进制的转换计算
  15. MBA-day13 逻辑学 模态推理(可能与必然的推理)
  16. 什么是中华田园敏捷开发?
  17. Brave vs Google Chrome:哪个浏览器更适合你?
  18. pip命令下载第三方依赖的彩色进度条的具体实现
  19. 蚂蚁区块链第11课 以租房积分管理系统为例讲透蚂蚁Solidity语言差异精要
  20. 我用Python爬取了五千张美女图壁纸,每天一张忘记初恋!

热门文章

  1. atitit.科技公司的超级武器--超级框架,到底要不要自己的框架??
  2. paip.提升用户体验---免维护列表字段
  3. 中国结算-金融机构服务平台(FISP平台)
  4. Linux基金会宣布成立Ceph基金会
  5. 百度谭中意:我和开源20年
  6. 【TSP】基于matlab自适应动态邻域布谷鸟混合算法求解旅行商问题【含Matlab源码 1513期】
  7. 【汉字识别】基于matlab SVM汉字识别【含Matlab源码 830期】
  8. 【雷达通信】基于matlab GUI雷达定位【含Matlab源码 302期】
  9. ai人工智能_AI如何帮助截肢者?
  10. 深度学习 个性化推荐_生产中的深度强化学习第2部分:个性化用户通知