Cordova那些事儿(二)——App中集成Cordova的正确姿势(iOS)

Cordova LOGO

【牢骚几句】
我们的项目中,我们需要把CordovaLib集成到项目中。由于时间紧,当时大致研究了一下各个文件之间的关系,然后按照这种规则,照猫画虎写了一下,完成了任务,当时看并没有什么问题。但是随着不断增加集成的插件,再加上自己编写的一些插件,发现没有按照Cordova的编写规范来做,在以下场景比较麻烦:

  • 插件管理:增加、删除、更新版本
  • 想在一个Cordova工程中复用这些插件
    全都要手工完成

最近看了下文档,结合之前项目中的经历,发现最简单有效的办法,其实还是按照Cordova-CLI的规则来玩,按照插件的规范编写插件,然后通过Cordova-CLI来将插件加入项目,这样的好处:

  • 方便插件管理
  • 方便在Cordova工程中进行插件复用

之前为了省事,虽然插件接口是按规则编写的,但都是每个平台直接编写原生插件,并且单独编写cordova_plugins.jsconfig.xml插件配置.js。这样看似省事,实际上就出现了上述的维护等问题。

【正题开始】
下面说下在普通iOS工程中,引入CordovaLib的正确姿势:
先发个总体步骤:

1. 创建原生工程;
2. 使用Cordova-CLI创建Cordova工程;
3. 从“Cordova工程”的“原生平台工程”中,提取需要的文件,主要是以下几部分:
    config.xml
    ios.json 或 android.json
    platform_www 文件夹
    插件的原生部分代码
4. 加入到之前创建的原生工程中。

以下是详细步骤说明

一、创建标准iOS工程,引入CordovaLib

使用Xcode创建标准iOS工程,通过Cocoapod引入CordovaLib,配置如下:

platform :ios, '8.0'
target 'TestCordovaLibIntegration' do
  pod 'Cordova'
end

如果要使用CordovaLib的4.x版本,则只能支持iOS 8以上。
如果需要兼容iOS 7,可以使用CordovaLib的3.x版本,3.x系列中,最新是3.8,Podfile配置如下:

platform :ios, '7.0'
target 'TestCordovaLibIntegration' do
    pod 'Cordova', '~> 3.8.0'
end
二、下载需要的插件,生成配置文件

以安装以下两个插件举例:

cordova-plugin-console
cordova-plugin-inappbrowser

使用Cordova-CLI创建工程,添加平台,引入插件
执行脚本如下:

# 创建工程
cordova create CordovaFileGenerator com.herbert.cordova.filegenerator CordovaFileGenerator
# 进入 Cordova 工程目录
cd CordovaFileGenerator
# 添加 iOS 原生工程
cordova platform add ios
cordova platform add android
# 添加需要的插件
cordova plugin add cordova-plugin-console
cordova plugin add cordova-plugin-inappbrowser
三、将Cordova工程中需要的文件,提取到单独的文件夹 CordovaFiles 中

提取相关文件
以下为执行的 shell 脚本:

cd CordovaFileGenerator
# 创建存放 Cordova 文件的目录
mkdir -p ../CordovaFiles/iOS
mkdir -p ../CordovaFiles/Android
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 复制 iOS 相关文件 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 复制 config.xml
cp -rf ./platforms/ios/CordovaFileGenerator/config.xml ../CordovaFiles/iOS/config.xml
# 复制 ios.json
cp -rf ./platforms/ios/ios.json ../CordovaFiles/iOS/ios.json
# 复制原生代码文件
cp -rf ./platforms/ios/CordovaFileGenerator/Plugins/ ../CordovaFiles/iOS/Plugins
# 复制 Web 文件
cp -rf ./platforms/ios/platform_www/ ../CordovaFiles/iOS/www
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 完成复制 iOS 相关文件 <<<<<<<<<<<<<<<<<<<<<<<<<<<<

# >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 复制 Android 相关文件 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 复制 config.xml
cp -rf ./platforms/android/res/xml/config.xml ../CordovaFiles/Android/config.xml
# 复制 android.json
cp -rf ./platforms/android/android.json ../CordovaFiles/Android/android.json
# 复制原生代码文件
mkdir -p ../CordovaFiles/Android/Plugins/org/apache/cordova/
cp -rf ./platforms/android/src/org/apache/cordova/ ../CordovaFiles/Android/Plugins/org/apache/cordova/
# 复制 Web 文件
cp -rf ./platforms/android/platform_www/ ../CordovaFiles/Android/www/
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 完成复制 Android 相关文件 <<<<<<<<<<<<<<<<<<<<<<<<

得到如下文件列表:

./CordovaFiles/
|-Android/
|  |-Plugins/
|  |  '-org/
|  |     '-apache/
|  |        '-cordova/
|  |           |-inappbrowser/
|  |           |  |-InAppBrowser.java
|  |           |  |-InAppBrowserDialog.java
|  |           |  '-InAppChromeClient.java
|  |           '-whitelist/
|  |              '-WhitelistPlugin.java
|  |-www/
|  |  |-cordova-js-src/
|  |  |  |-android/
|  |  |  |  |-nativeapiprovider.js
|  |  |  |  '-promptbasednativeapi.js
|  |  |  |-plugin/
|  |  |  |  '-android/
|  |  |  |      '-app.js
|  |  |  |-exec.js
|  |  |  '-platform.js
|  |  |-plugins/
|  |  |  '-cordova-plugin-inappbrowser/
|  |  |      '-www/
|  |  |          '-inappbrowser.js
|  |  |-cordova.js
|  |  '-cordova_plugins.js
|  |-android.json
|  '-config.xml
'-iOS/
   |-Plugins/
   |  |-cordova-plugin-console/
   |  |  |-CDVLogger.h
   |  |  '-CDVLogger.m
   |  |-cordova-plugin-inappbrowser/
   |  |  |-CDVInAppBrowser.h
   |  |  '-CDVInAppBrowser.m
   |  '-README
   |-www/
   |  |-cordova-js-src/
   |  |  |-exec.js
   |  |  '-platform.js
   |  |-plugins/
   |  |  |-cordova-plugin-console/
   |  |  |  '-www/
   |  |  |     |-console-via-logger.js
   |  |  |     '-logger.js
   |  |  '-cordova-plugin-inappbrowser/
   |  |     '-www/
   |  |        '-inappbrowser.js
   |  |-cordova.js
   |  '-cordova_plugins.js
   |-config.xml
   '-ios.json
四、将提取出的文件加入到原生工程中

提取出的内容整体结构如下:

.
|-Plugins/ ......... 原生插件代码————以源码形式加入工程
|-www/ ............. Web 相关内容,以及插件代码的 js 部分————以资源形式加入工程
|-config.xml ....... 工程配置————以源码形式加入工程
'-ios.json ......... 引用插件的描述————以源码形式加入工程

其中:

  • config.xml是CordovaLib直接读取的,必须放在指定位置,iOS是直接的目录下,Android应该是xml文件夹
  • Plugins/中的内容,是插件的原生代码部分,需要参与编译,必须作为源码引入
  • ios.json 本身没有任何实际用途,但是里面记录着引用的插件及配置,加入进来备用。后文中描述“远程页面”(如:www.baidu.com)无法加入<script src="cordova.js"></script>的情况,就需要手工加载插件,这时解析ios.json比较方便方便
五、补充说明

发现iOS版的CordovaLib 4.3.0之后,访问远程链接,会导致调用系统浏览器打开。
解决方法:
config.xml中增加如下代码:

    <feature name="IntentAndNavigationFilter">
        <param name="ios-package" value="CDVIntentAndNavigationFilter" />
        <param name="onload" value="true" />
    </feature>
    <allow-navigation href="http://*/*" />
    <allow-navigation href="https://*/*" />

注意:!!!
不要指定为 <allow-navigation href="*" />,这样会导致拉起其他App时失败。

(完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容