向IBM Worklight 6.1添加自定义cordova插件



我正在尝试为iOS平台添加自定义Cordova插件,当我将其与在Cordova上添加插件的过程进行比较时,我遇到了一些问题。

我要使用的插件是https://github.com/phonegap-build/StatusBarPlugin

对于cordova,我过去只使用命令行c ordova plugin add com.phonegap.plugin.statusbar

首先,我试图在本地文件夹修改,但我注意到,如果我这样做,它的工作,但它会被擦除下次我再次部署为iOS平台。其次,我试图在apps/myapp/iphone或apps/myapp/common下添加文件(plugin js文件和cordova_plugins.js文件),但这会导致一个问题:cordova_plugins.js文件格式似乎变得不太好。

而不是这样的工作格式:

cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
    {
        "file": "plugins/org.apache.cordova.battery-status/www/battery.js",
        "id": "org.apache.cordova.battery-status.battery",
        "clobbers": [
            "navigator.battery"
        ]
    },
,
    {
        "file": "plugins/com.phonegap.plugin.statusbar/www/statusbar.js",
        "id": "com.phonegap.plugin.statusbar.statusbar",
        "clobbers": [
            "window.StatusBar"
        ]
    }
]
});

它有这样的格式不能正常工作:

/* JavaScript content from worklight/cordova_plugins.js in JS Resources */
/*
* Licensed Materials - Property of IBM
* 5725-I43 (C) Copyright IBM Corp. 2006, 2013. All Rights Reserved.
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
    {
        "file": "plugins/org.apache.cordova.battery-status/www/battery.js",
        "id": "org.apache.cordova.battery-status.battery",
        "clobbers": [
            "navigator.battery"
        ]
    }
]
});
/* JavaScript content from worklight/cordova_plugins.js in folder common */
/* JavaScript content from worklight/cordova_plugins.js in JS Resources */
/*
* Licensed Materials - Property of IBM
* 5725-I43 (C) Copyright IBM Corp. 2006, 2013. All Rights Reserved.
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
    {
        "file": "plugins/org.apache.cordova.battery-status/www/battery.js",
        "id": "org.apache.cordova.battery-status.battery",
        "clobbers": [
            "navigator.battery"
        ]
    },
    {
        "file": "plugins/com.phonegap.plugin.statusbar/www/statusbar.js",
        "id": "com.phonegap.plugin.statusbar.statusbar",
        "clobbers": [
            "window.StatusBar"
        ]
    }
]
});

我该怎么办?我应该把这些文件放在哪里?什么是适当的方式来添加这个自定义插件,特别是如果我想添加它只为iOS,而不是为Android?

更新:从MobileFirst 7.1开始,SDK现在可以作为Cordova插件使用。

对于那些有兴趣在他们的MobileFirst (Worklight)项目中添加第三方插件的人,我在下面描述了我自己的安装方法,等待IBM发布功能版本。

这个概念本质上是:

  1. 创建Cordova项目
  2. 添加所需的插件,
  3. 创建MobileFirst项目,
  4. 将插件文件从两个项目复制到一个暂存区(这样我们可以很容易地识别它们),
  5. 合并config.xml和cordova_plugin.js文件(即用Cordova项目的插件信息补充MobileFirst文件)和
  6. 将分级和修改后的文件复制到MobileFirst.

免责声明:根据公认的答案,IBM不支持/建议修改cordova_plugin.js文件

首先我们需要创建Cordova项目(加上插件)和MobileFirst项目(步骤1-4)。我已经使用Ionic Keyboard插件作为一个例子,不用说,这种方法(创建一个Cordova项目和合并文件)适用于任何支持的插件和目标。

## Create a directory to contain your MobileFirst project e.g. mkdir example; cd example; ##
## Create Cordova project ##
mkdir .tmp
cd .tmp/
cordova create plugins com.plugins plugins;
cd plugins/
cordova platform add ios;
cordova plugin add com.ionic.keyboard;
cd ../..
## Create mobile first project ##
mfp create hybrid
cd hybrid/
mfp add hybrid hybrid
mfp add environment iphone
## Generate native files ##
mfp build
cd ..
## Create staging ##
mkdir -p plugins/native/www/default/worklight
mkdir -p plugins/resources/mobilefirst/
mkdir -p plugins/resources/cordova/
mkdir -p plugins/hm/
## Copy config.xml ##
cp hybrid/apps/hybrid/iphone/native/config.xml plugins/resources/mobilefirst/
cp .tmp/plugins/platforms/ios/plugins/config.xml plugins/resources/cordova/
## Copy Cordova files ##
cp -R hybrid/apps/hybrid/iphone/native/www/default/worklight/ plugins/resources/mobilefirst/
## Copy plugins JS ##
cp -R .tmp/plugins/platforms/ios/www/plugins plugins/native/www/default/worklight/
cp -R .tmp/plugins/platforms/ios/www/ plugins/resources/cordova/
## Copy classes ##
cp -R .tmp/plugins/platforms/ios/Plugins/Plugins/com.ionic.keyboard/ plugins/hm/
## Delete the Cordova project as we have copied all of the artefacts we need ##
rm -R .tmp
## Create the config and cordova_plugin.js which is going to override the mfp build version ##
cp plugins/resources/mobilefirst/config.xml plugins/native/
cp plugins/resources/mobilefirst/cordova_plugins.js plugins/native/www/default/worklight/

分阶段的config.xml和cordova_plugins.js文件现在准备合并(步骤5)。

打开plugins/resources/cordova/config.xml文件,将该特性复制到plugins/native/config.xml文件中。

<feature name="Keyboard">
  <param name="ios-package" onload="true" value="IonicKeyboard" />
</feature>

打开plugins/resources/cordova/cordova_plugins.js文件,将插件对象复制到plugins/native/www/default/worklight/cordova_plugins.js文件中。

{
  "file": "plugins/com.ionic.keyboard/www/keyboard.js",
  "id": "com.ionic.keyboard.keyboard",
  "clobbers": [
    "cordova.plugins.Keyboard"
  ]
}

现在我们准备将合并的文件复制到MobileFirst项目中(步骤6a)。

## Copy from staging to Worklight ##
cp -R plugins/hm/ hybrid/apps/hybrid/iphone/native/Classes/

第一次复制文件Xcode不会自动拾取新类,所以在Xcode中打开项目,右键单击classes并添加文件到…添加对话框中显示的文件。

最后,我们可以将plugins/native目录中的文件复制到MobileFirst项目中(步骤6b)。不幸的是,我们需要在每次mfp构建之后复制这个目录,因为mfp每次都会重置cordova_plugins.js文件。

## Do this after every mfp build ##
rm -f hybrid/apps/hybrid/iphone/native/www/default/worklight/cordova_plugins.js
cp -R plugins/native/ hybrid/apps/hybrid/iphone/native/

一旦完成,将客户端代码添加到混合应用程序并进行测试(不要忘记在mfp构建后再次运行第6步),例如

<input type="text">
window.addEventListener('native.keyboardshow', keyboardShowHandler);
function keyboardShowHandler(e){
    alert('Keyboard height is: ' + e.keyboardHeight);
}

我希望这个指南是有用的。我每天都使用这个过程(尽管是作为Grunt的一部分),并期待IBM发布一个功能版本。

Worklight 6.1.0。x还不支持添加预制的Cordova 3。使用plugman或在纯Cordova应用程序中执行的任何其他过程(包括尝试编辑您要编辑的文件)来使用x插件。这是当前版本的Worklight中一个已知的限制。

我要做的是阅读在Worklight中创建Cordova插件的培训材料,然后将您想要添加的插件的源代码复制过来。

可能还有其他方法,但目前都不方便。

上面提到的Chris解决方案有一个问题。如果你遵循正确的过程,插件肯定会工作,但以后会有严重的后果。例如:因为plugins文件夹和cordova_plugins.js文件会在每次mfp构建时被覆盖,所以生成的wlapp文件永远不会添加插件代码。因此,如果你使用直接更新,你的代码将被覆盖,一旦你上传这个wlapp文件,插件将停止工作。

最新更新