Cordova前端流程

模拟Cordova插件命令 自己编写脚本,了解cordova添加插件做了哪些事情。

上一篇文章了解到,web与native的交互主要是cordova.js中的exec方法调用,触发交互事件。UIWebView已经成为过去时,忽略,这里只说wkwebview,exec调用wk的configuration.userContentController中注册的事件cordova,触发回调userContentController:didReceiveScriptMessage:

先聊web端,再聊iOS端。

  • 几个文件介绍

cordova_plugins.js:包含cordova中依赖的所有的插件js路径,用于前端导出对应的插件js

package.json:cordova包本身的信息

config.xml:包含所有插件对应于原生的类名的映射关系

plugin.xml:每个插件的描述信息,源文件、资源、依赖库等都写在这里


cordova_plugins.js


cordova.define('cordova/plugin_list', function(require, exports, module) {

module.exports = [

  {

    "id": "cordova-plugin-wkwebview-engine.ios-wkwebview-exec",

    "file": "plugins/cordova-plugin-wkwebview-engine/src/www/ios/ios-wkwebview-exec.js",

    "pluginId": "cordova-plugin-wkwebview-engine",

    "clobbers": [

      "cordova.exec"

    ]

  },

  {

    "id": "cordova-plugin-wkwebview-engine.ios-wkwebview",

    "file": "plugins/cordova-plugin-wkwebview-engine/src/www/ios/ios-wkwebview.js",

    "pluginId": "cordova-plugin-wkwebview-engine",

    "clobbers": [

      "window.WkWebView"

    ]

  }

];

module.exports.metadata =

// TOP OF METADATA

{

  "cordova-plugin-whitelist": "1.3.3",

  "cordova-plugin-wkwebview-engine": "1.1.4"

};

// BOTTOM OF METADATA

});

  • id:cordova-plugin-wkwebview-engine + plugin.xml中的js-module 的name

  • file: js文件存放的路径 plugins/插件名称/ plugin.xml中的js-module的src

  • pluginId:插件名称

  • Clobbers:就是js-module中的clobbers

  • module.exports.metadata中各个参数

  • 插件名称:版本号


package.json


{
"name": "com.comtop.testwk",
"displayName": "testWK",
"version": "1.0.0",
"description": "A sample Apache Cordova application that responds to the deviceready event.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Apache Cordova Team",
"license": "Apache-2.0",
"dependencies": {
"cordova-ios": "^4.5.5",
"cordova-plugin-whitelist": "^1.3.3",
"cordova-plugin-wkwebview-engine": "^1.1.4"
},
"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},
"cordova-plugin-wkwebview-engine": {}
},
"platforms": [
"ios"
]
}
}

config.xml


 <?xml version="1.0" encoding="utf-8"?>

<widget xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" id="com.test.mm" version="1.0.0">
<name>poros-mm</name>
<description>A sample Apache Cordova application that responds to the deviceready event.</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">Apache Cordova Team</author>
<content src="index.html"/>
<plugin name="cordova-plugin-whitelist" spec="1"/>
<access origin="*"/>
<allow-intent href="http://*/*"/>
<allow-intent href="https://*/*"/>
<allow-intent href="tel:*"/>
<allow-intent href="sms:*"/>
<allow-intent href="mailto:*"/>
<allow-intent href="geo:*"/>
<platform name="android">
<allow-intent href="market:*"/>
</platform>
<platform name="ios">
<allow-intent href="itms:*"/>
<allow-intent href="itms-apps:*"/>
</platform>
<allow-navigation href="*"/>
<plugin name="cordova-plugin-wkwebview-engine" spec="^1.1.4"/>
<plugin name="cordova-plugin-file" spec="^6.0.1"/>
<plugin name="cordova-sqlcipher-adapter" spec="^0.4.0"/>
<plugin name="cordova-plugin-file-opener2" spec="^2.2.0"/>
<plugin name="cordova-plugin-advanced-http" spec="^2.1.1"/>
<plugin name="cordova-plugin-media-capture" spec="^3.0.3"/>
<plugin name="cordova-plugin-camera" spec="^4.0.3"/>
<plugin name="cordova-save-image-gallery" spec="^0.0.26"/>
<plugin name="cordova-plugin-device" spec="^2.0.3"/>
<plugin name="cordova-plugin-imagepicker" spec="^1.3.0"/>
<feature name="File">
<param name="ios-package" value="CDVFile"/>
<param name="onload" value="true"/>
</feature>
<feature name="CordovaHttpPlugin">
<param name="ios-package" value="CordovaHttpPlugin"/>
</feature>
<feature name="FileOpener2">
<param name="ios-package" value="FileOpener2"/>
</feature>
<feature name="SaveImageGallery">
<param name="ios-package" value="SaveImageGallery"/>
<param name="onload" value="true"/>
</feature>
<feature name="Device">
<param name="ios-package" value="CDVDevice"/>
</feature>
<feature name="Capture">
<param name="ios-package" value="CDVCapture"/>
</feature>
<feature name="Camera">
<param name="ios-package" value="CDVCamera"/>
</feature>
<preference name="CameraUsesGeolocation" value="false"/>
<feature name="ImagePicker">
<param name="ios-package" value="CTPicker"/>
</feature>
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine"/>
</feature>
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine"/>
<feature name="SQLitePlugin">
<param name="ios-package" value="SQLitePlugin"/>
</feature>
</widget>
  • Plugin:cordova框架中引入的插件名称和版本

  • feature: cordova.exec方法中“消息名称”与对应的“native类名”映射

  • preference:控制对应插件中的某些属性值


plugin.xml wkwebview插件的xml文件


<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:rim="http://www.blackberry.com/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android"
id="cordova-plugin-wkwebview-engine"
version="1.1.4">
<name>Cordova WKWebView Engine</name>
<description>Cordova WKWebView Engine Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,wkwebview,webview</keywords>
<repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-wkwebview-engine.git</repo> <engines>
<engine name="cordova-ios" version=">=4.0.0-dev" />
<engine name="apple-ios" version=">=9.0" />
</engines> <!-- ios -->
<platform name="ios">
<js-module src="src/www/ios/ios-wkwebview-exec.js" name="ios-wkwebview-exec">
<clobbers target="cordova.exec" />
</js-module> <js-module src="src/www/ios/ios-wkwebview.js" name="ios-wkwebview">
<clobbers target="window.WkWebView" />
</js-module> <config-file target="config.xml" parent="/*">
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine" />
</feature>
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
</config-file> <framework src="WebKit.framework" weak="true" /> <header-file src="src/ios/CDVWKWebViewEngine.h" />
<source-file src="src/ios/CDVWKWebViewEngine.m" />
<header-file src="src/ios/CDVWKWebViewUIDelegate.h" />
<source-file src="src/ios/CDVWKWebViewUIDelegate.m" />
<header-file src="src/ios/CDVWKProcessPoolFactory.h" />
<source-file src="src/ios/CDVWKProcessPoolFactory.m" />
</platform>
</plugin>
  • Plugin:cordova框架中引入的插件名称和版本

  • feature: cordova.exec方法中“消息名称”与对应的“native类名”映射

  • preference:控制对应插件中的某些属性值


有了这几个关键文件,cordova才能识别和调用到各个插件
  • Cordova plugin add做了什么

    • 填充cordova_plugins.js

      执行插件add命令之后,会去插件包中读plugin.xml信息,
      - id字段: plugin字段的id + js-module 的name
      - file字段: js文件存放的路径。 plugins/插件名称/ plugin.xml中的js-module的src
      - pluginId字段:插件名称
      - Clobbers:就是js-module中的clobbers
      - module.exports.metadata中各个参数 如插件名称:版本号
    • 填充package.json

      执行插件命令之后,会去插件包中读plugin.xml,获取包地址和包名,插入到dependencies和cordova字段中。
    • 填充config.xml

      执行插件命令之后,会去插件包中读plugin.xml信息
      读取对应平台的映射信息,插入到config.xml中
      - Plugin:cordova框架中引入的插件名称和版本
      - feature: cordova.exec方法中“消息名称”与对应的“native类名”映射
      - preference:控制对应插件中的某些属性值
    • 填充{plugin}.js

      每个插件包中都有对应的js文件,add命令会在其中嵌入如下代码
      
      cordova.define(包id, function(require, exports, module) {});
      
      cordova.define的目的是为了前注册包id到coedova对象中。
  • Cordova运行时做了什么

    cordova.js运行时,读取cordova_plugin.js内容,生成clobbers字段数组中对应的名称对象。比如上面cordova_plugin.js中的cordova.exec 对象,这个对象是ios-wkwebview-exec.js的实例。前端可以直接使用。
  • iOS现有项目自动化接入Cordova插件

    • 必要的前提

      工程中包含的web资源包含完整的Cordova运行的必要文cordova_plugins.js,exec.js,platform.js,cordova.js等必要资源文件。保证cordova框架能够正常

      说明一下,必须包含Cordova运行的基本js,html。
      cordova create 项目名称
      cordova platform add ios
      cordova plugin add xxx
      这些命令执行之后打开cordova工程我们看见的Staging资源里面的所有文件。我们需要把这些copy到自己现有的工程中。
      这一步可以使用脚本处理。
    • Cordova的add命令做了什么

      plugin.xml:
      每个插件都有一个plug.xml文件,用于标识此插件各个平台依赖的 源文件,资源,库文件 以及插件与实际类名的映射。 config.xml:
      cordova通过读取config.xml中的配置 找到插件对应的原生实现类,由此类调用对应的原生方法 1.add命令把plugin.xml中的映射 写到config.xml中
      2.add命令把plugin.xml中的依赖添加到工程。
    • 解析plugin.xml

      我们已经有了运行必须的js,xml,html等基础文件,了解了add命令做了什么事情之后,想要现有工程接入插件还差一步,就是把plugin.xml中的依赖添加到工程。
      1.打开cordova官网,https://cordova.apache.org/docs/en/latest/plugin_ref/spec.html 2.对照各个字段的意思把源文件/库/资源/头文件/编译设置对工程进行处理。使用工具XcodeProj进行项目的设置,如何使用可以参照我的另外一篇文章[Xcode工程文件pbxproj](https://www.cnblogs.com/xiongwj0910/p/11040820.html)

做完上面步骤,就完成了对现有工程中cordova插件的自动化接入了。

如有说的不对的地方请指正

Cordova-在现有iOS工程自动化接入Cordova插件的更多相关文章

  1. iOS 工程自动化 - 思路整理

    4 月份参加 2017@Swift 大会的时候有幸听到了 @zesming 大佬关于美团组件化的 Topic,有一张图印象特别深刻. 来自 @zesming 大佬 后来跟 @zesming 大佬沟通怎 ...

  2. iOS 工程自动化 - OCLint

    前言 最近一直在做 iOS 工程自动化方向的事情,所以把自己研究和实践的内容进行记录并分享,希望能给大家一些帮助. 为什么要使用 OCLint 做为一个静态代码分析工具,我们引入 OCLint 的目的 ...

  3. Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中

    一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...

  4. Flutter 集成到现有iOS工程

    前沿 由于我司已经有自己的App,flutter属于技术引进的一部分,也不太可能重新启动一个项目,因此目前我们是将flutter模块形式注入我们的App之中.即:将flutter模块集成到现在有iOS ...

  5. Flutter-现有iOS工程引入Flutter

    前言 Flutter 是一个很有潜力的框架,但是目前使用Flutter的APP并不算很多,相关资料并不丰富,介绍现有工程引入Flutter的相关文章也比较少.项目从零开始,引入Flutter操作比较简 ...

  6. 如何在原生工程中引入Cordova工程-for iOS 【转】

    http://blog.csdn.net/e20914053/article/details/50170487 如今混合开发方兴未艾,有的项目可能一开始是原生开发的,后期需要加入混合开发,如将Cord ...

  7. iOS 混合开发之 Cordova 实践

    在15年时,之前公司使用 Cordova 做混合开发使用,后来公司没有用到了,现在重新记录下. Cordova (官网:http://cordova.apache.org/)简介: Apache Co ...

  8. ionic cordova plugin for ios

    源代码结构目录: payplugin: |_src |_android |_PayPlugin.java |_ios |_CDVPayPlugin.h |_CDVPayPlugin.m |_www | ...

  9. PhoneGap,Cordova[3.5.0-0.2.6]:利用插件Cordova-SQLitePlugin来操作SQLite数据库

    在PhoneGap应用程序中,我们可以利用一款名叫Cordova-SQLitePlugin的插件来方便的操作基于浏览器内置数据库或独立的SQLite数据库文件,此插件的基本信息: 1.项目地址:htt ...

随机推荐

  1. IDEA配置远程git仓库

    一,在项目创建本地仓储 2,选择当前文件夹为本地仓储 3, 将代码添加到本地仓库 4,提交到本地仓库 5,提交到本地仓库 配置远程账号和地址 输入你自己的远程仓库----码云或者github,创建的 ...

  2. python cv2展示网络图片、图片编解码、及与base64转换

    从网络读取图像数据并展示 需要使用cv2.imdecode()函数,从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式:主要用于从网络传输数据中恢复出图像. # -*- coding: utf ...

  3. centos7搭建安装superset

    superset官网: https://superset.incubator.apache.org/ 系统环境:system:centos7 一.安装工具及依赖包安装工具包:yum -y instal ...

  4. spring容器启动完成后加载自定义逻辑

    业务需求中,可能会有一些逻辑需要在应用启动完成后,例如字典缓存,资源池初始化等等,代码如下 public class InitApplication implements ApplicationCon ...

  5. java面试01-网络知识

    1.网络七层协议 第一层:物理层 机械.电子.定时接口通信信道上的原始比特流传输 第二层:数据链路层 物理寻址,同时将原始比特流转变为逻辑传输线路 第三层:网络层 控制子网的运行‘如逻辑编址.分组传输 ...

  6. Zen Cart 138 在PHP5.3环境下出现的Fatal error: Cannot redeclare date_diff()

    Zen Cart 138 在PHP5.3环境下出现的Fatal error: Cannot redeclare date_diff() in includes/functions/functions_ ...

  7. .htaccess A网站单页面301到B网站单页面

      .htaccess 301问题 A网站  a.com/a.html 301到 B网站 b.com/b.html   RewriteRule ^a.com/a.html$ http://www.b. ...

  8. 代码管理工具 Git

    之前一直使用微软的代码管理工具TFS(Team Foundation Server)..NET CORE 2.0的发布后,考虑到.NET CORE项目可以跨平台,准备把项目迁移到.NET CORE 环 ...

  9. MyEclipse使用教程:unattended安装

    [MyEclipse CI 2019.4.0安装包下载] 以下内容适用于2013及以上版本. 运行无提示安装程序 1. 创建一个unattended response文件. 2. 要激活unatten ...

  10. C语言字符串追加,双色球等案例

    //C语言中没有字符串概念,有的只是字符型数组,以str1[]的值为例,该字符数组的长度为11--->包含了字母,空格,以及结束字符'\0'(斜杠0)//基于上述原因,读取一个字符型数组的有效方 ...