Cordova 1.6.1 - 找不到插件,或者不是CDVPlugin

时间:2012-04-27 09:23:10

标签: ios static-libraries phonegap-plugins cordova

抱歉,我的英语不是很好。 我正在使用cordova 1.6.1。 我创建了一个新的基于cordova的项目,并将其扩展为添加插件。我使用我创建的插件构建一个静态库,并尝试运行包含此库的项目(该库可以在xcode的构建设置中找到),没有插件文件夹中的来源

运行我的应用程序时出现以下错误:

[INFO] ClientChannel(1)初始化... CDVPlugin类MNClientChannelPlugin(pluginName:MNClientChannelPlugin)不存在。 错误:找不到插件'MNClientChannelPlugin',或者不是CDVPlugin。检查Cordova.plist中的插件映射。

对这些错误的一些评论: 1)第一行是我写的JavaScript代码中的日志,这表示启动了“初始化”功能。此函数调用名为MNClientChannelPlugin的插件的init函数。 2)& 3)这些日志来自本机iOS cordova s​​dk(从getCommandInstance(2)和CDVViewController.mm的执行(3)函数调用)

在Codova.plist中,我将MNClientChannelPlugin作为键和值。使用此配置,当我将MNClientChannelPlugin源(.mm& .h)放入Plugins文件夹时,它可以正常工作,但是当我使用MNClientChannelPlugin.mm创建静态库时则不行。 (我在我的项目中包含了这个库,并将.h标题放在Plugins文件夹中)。 科尔多瓦似乎找不到图书馆的来源......

Cordova插件位于Cordova.Framework中,而不是在 插件文件夹与.m和.h文件,所以似乎可以创建 插件,将它们打包到库中,并在基于cordova的应用程序中使用它们 项目,但我不适合我... 我查看了档案和提交,但没有找到任何 解。有谁知道可能是什么问题?

2 个答案:

答案 0 :(得分:1)

是的,我找到了解决方法。

问题在于:

  • 您的MNClientChannelPlugin保存在静态库中
  • 您的主项目引用静态库
  • 链接器足够聪明,只能链接到主项目实际使用的类中。
  • 就链接器所知,您的项目不使用MNClientChannelPlugin,因为它没有在任何地方引用。
  • 它没有在任何地方被引用,因为只有在您的phonegap应用程序碰巧请求MNClientChannelPlugin实例时才会加载该类。
  • 如果没有将该类链接到您的最终二进制文件中,则会出现上述错误。

解决方案是强制链接器包含MNClientChannelPlugin对象。

简单的方法是将-all_load添加到主项目的“其他链接器标志”中。这将具有链接项目中每个静态库中的每个类的连锁效果。它确实有效。

更好的方法是使用-force_load和静态库的名称。这是一篇有关此问题的帖子,虽然我自己没有尝试过:

xcode-project-target-settings-syntax-for-linker-flag-force-load-on-iphone

答案 1 :(得分:0)

如果您使用的是Pushwoosh(我假设您是),说明中明确说明您应该复制并粘贴此代码:

<key>PushNotification</key>
<string>PushNotification</string>
插件 。因此,如果您遇到上述错误,则意味着您没有将其复制并粘贴到插件中。将键和字符串值移动到正确的位置应该消除错误。

快乐的黑客攻击!!!