【问题标题】:Cordova 3.3.1-0.1.2 (Phonegap) plugins doesn't workCordova 3.3.1-0.1.2 (Phonegap) 插件不起作用
【发布时间】:2014-02-18 18:07:04
【问题描述】:

我有一个适用于 iOS 的 cordova 3.3.1-0.1.2 测试项目,我使用以下插件 (cordova plugin ls):

[ 'com.phonegap.plugins.PushPlugin',
  'org.apache.cordova.console',
  'org.apache.cordova.device',
  'org.apache.cordova.splashscreen' ]

我已经添加了类似cordova plugin add org.apache.cordova.device 的插件。在我的 git 存储库中,我看到它向 plugins/org.apache.cordova.device 目录添加了一堆文件,在我的 iOS 插件目录中创建了一个 CDVDevice.h 和一个 CDVDevice.m,更新了 ios.json,更新了 *.xcodeproj 文件并将插件添加到我的config.xml 里面的platforms/ios/test-app/config.xml:

<feature name="Device">
    <param name="ios-package" value="CDVDevice" />
</feature>

但是当我尝试访问 JS 中的 devicewindow.device 属性时,它告诉我 device 未定义。奇怪的是,pushPlugin 存在:

document.addEventListener("deviceready", function () {
   console.log(device);
   console.log(window.device);
   console.log(window.plugins.pushNotification);
});

window.plugins 对象仅将pushNotification 插件列为属性。很奇怪,因为它们都安装好了,而且在安装过程中,cordova 说,一切正常。

对于过时的和与phonegap 混合的文档,我有点困惑,但如果其中一个可以工作,那也没关系。我还看到了一个插件定义,在这样的config.xml

<gap:plugin name="org.apache.cordova.device" />

谁能解释一下,有什么区别?我正在使用cordova 3.3的方式(使用feature)是否已经过时?当我尝试使用&lt;gap:plugin... 格式时,我的应用在启动时崩溃。

所以,请帮我解决这个问题,让我清醒一下;)

【问题讨论】:

  • 您是否运行cordova build 来准备/编译代码?
  • 是的,我运行 cordova build,它将所有内容复制到正确的目录,但仍然存在同样的问题

标签: android ios git plugins cordova


【解决方案1】:

不幸的是,没有一个答案奏效。幸运的是,我在这个邮件列表中找到了解决方案:

http://mail-archives.apache.org/mod_mbox/cordova-dev/201312.mbox/%3CCABiQX1Vat5XvmKkWt=+viL9oXWnOiAz5ee95h8oJp0j4MU9pJQ@mail.gmail.com%3E

他们说,这是cordova 3.3.1 中的一个错误。在这个版本中,插件被复制到不同平台的.staging 目录中。

因此,现在可以使用 npm 降级到 cordova 3.3.0(在 Mac OS X 上):

sudo npm remove -g cordova
sudo npm view cordova versions
sudo npm install -g cordova@3.3.0-rc.1

还要检查是否也可以从 phonegap 安装 cordova。如果您使用cordova,而不使用phonegap功能(如远程构建),您可以使用

安全地删除phonegap包
sudo npm remove -g phonegap

更新

当前版本 3.4.0 运行良好,没有这个问题。

【讨论】:

    【解决方案2】:

    从 Cordova 项目的根目录,进入 ./platforms/ios/

    cd platforms/ios
    

    这里应该有一个 ./build 文件夹 - 它包含以前构建的包,然后 Cordova 将其用于“延迟加载” - 也就是说,Cordova 不必经常从不同位置获取文件,而是将它们存储在本地。但是,我发现这是有问题的。

    删除此文件夹:

    sudo rm -r build
    

    消失后,重建您的 Cordova 项目:

    cordova build
    

    然后它应该重新创建构建文件夹,但更重要的是,您的插件将列在config.xml

    【讨论】:

      【解决方案3】:

      检查 index.html 文件是否有正确的 &lt;script&gt;&lt;/script&gt; 行。

      通过 CLI 创建新项目时遇到问题。 index.html 文件引用了 phonegap.js 而不是 cordova.js

      【讨论】:

        【解决方案4】:

        使用gap:plugin 的插件定义用于配置phonegap 构建的插件(因此本地构建不需要它)。


        正如 MBillau 所建议的,只有在您运行 cordova prepare ios(或启动准备然后构建项目的 cordova build ios)后,插件才会添加到平台中。

        运行prepare时,插件的javascript文件应该被复制到platforms/ios folderwww/plugins/pluginfullname/www文件夹中。

        如果文件不存在,则可能是ios.json 文件损坏的问题。在这种情况下,有时卸载然后重新安装插件可以解决问题。在某些情况下,您必须删除 ios.json 文件,并清空项目根目录下的插件文件夹(可能还有平台文件夹),然后重新安装所有插件。


        如果 window.plugins 对象只列出了 pushnotification 插件,那只是因为它是该对象中唯一安装的插件:

        • org.apache.cordova.consoleconsolecordova.logger
        • org.apache.cordova.devicewindow.device
        • org.apache.cordova.splashscreennavigator.splashscreen

        要知道要使用的 javascript 对象名称,您必须阅读插件的文档或查看插件的 plugin.xml 文件中的 js-module/clobbers 属性。

        【讨论】:

        • 感谢您的回答!我查了一下,一切看起来都很好。这些文件被复制到目的地,我有正确的名称,但在deviceready 事件之后它们仍然不可用。我还尝试删除整个插件,然后重新安装它们,但没有运气。还有什么我可以尝试的吗?
        • 我忘了提到的一个文件是位于platforms/ios 文件夹中www 文件夹中的cordova_plugins.js。 cordova.js 使用这个文件来枚举插件(它应该从 ios.json 构建)。如果它不适用于您的项目,我建议清理插件和平台文件夹并重新安装插件或尝试使用新项目。
        • 嗯,cordova_plugins.js 文件存在,并列出了我安装的所有插件。但也删除所有插件,重新安装没有任何效果。还有其他想法吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多