1

对不起,我的英语不是很好。我正在使用科尔多瓦 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(从 CDVViewController.mm 的 getCommandInstance (2) 和 execute (3) 函数调用)

在 Codova.plist 中,我将 MNClientChannelPlugin 作为键和值。使用此配置,当我将 MNClientChannelPlugin 源 (.mm 和 .h) 放在 Plugins 文件夹中时,它可以工作,但当我使用 MNClientChannelPlugin.mm 创建静态库时,它就不行了。(我在我的项目中包含了这个库,并将 .h 标头放在 Plugins 文件夹中)。Cordova 似乎在库中找不到源...

Cordova 插件在 Cordova.Framework 中,而不是在带有 .m 和 .h 文件的 Plugins 文件夹中,因此似乎可以创建插件,将它们打包在库中并在基于 cordova 的项目中使用它们,但我没有为我工作......我查看了档案和提交,但没有找到任何解决方案。有谁知道可能是什么问题?

4

2 回答 2

1

是的,我已经找到了解决方案。

这是问题所在:

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

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

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

更好的是使用 -force_load 和静态库的名称。这是一篇对此有帮助的帖子,尽管我自己没有尝试过:

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

于 2012-05-10T14:14:27.517 回答
0

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

<key>PushNotification</key>
<string>PushNotification</string>

到“ Cordova.plist . 因此,如果您遇到我曾经遇到的上述错误,则表示您没有将其复制并粘贴到插件中。将键和字符串值移动到正确的位置应该可以消除错误。

快乐黑客!

于 2012-10-15T12:12:13.650 回答