Cordova插件未定义。

8

我正在尝试使用Cordova的ZeroConf插件。我以前从未使用过任何Cordova插件。

这是我所做的步骤:

cordova create myApp
cordova platform add android
cordova platform add ios
cordova platform add browser
cordova plugins add https://github.com/cambiocreative/cordova-plugin-zeroconf

接下来,我更改了默认的onDeviceReady函数,以便“index.js”文件(位于myApp/www/目录中)如下所示:

var app = {
    ...

    onDeviceReady: function() {
        app.receivedEvent('deviceready');

        if(cordova && cordova.plugins) {
            console.log('cordova.plugins is available');
        } else {
            console.log('cordova.plugins NOT available');
        }
    },

    ...
};

app.initialize();

不幸的是,它始终记录“cordova.plugins不可用”。我首先检查了cordova是否存在,确实存在,但是cordova.plugins未定义。请注意,我在浏览器中进行测试(cordova run browser)以找到问题,一旦cordova.plugins不再未定义,我就可以使用ZeroConf插件。

我搜寻了几个小时,阅读了很多类似的主题,但没有一个能为我提供帮助。

我尝试过:

  • cordova plugin ls --> ZeroConf插件已安装 com.cambiocreative.cordova.plugin.zeroconf 1.0.9 "Cordova ZeroConf Plugin"

  • 确认index.html加载了cordova.js脚本

  • 我编辑了config.xml文件(位于myApp/www/config.xml),添加了<plugin name="com.cambiocreative.cordova.plugin.zeroconf" version="1" /> ,但这并没有帮助。还尝试使用<feature name="ZeroConf"><param name="android-package" value="com.cambiocreative.cordova.plugin.ZeroConf" /><param name="onload" value="true" /></feature>,但没有成功。

这是我在index.html中包含脚本的顺序(位于myApp/www/index.html):

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>

编辑:我尝试直接从“ zeroconf.js”文件访问ZeroConf对象,但没有成功。

我编辑了onDeviceReady函数:

onDeviceReady: function() {
    app.receivedEvent('deviceready');

    var el = document.getElementById("zcOK");

    if(typeof ZeroConf !== 'undefined') {
        el.innerHTML = "ZEROCONF READY";
    } else {
        el.innerHTML = "ZEROCONF NOT READY";
    } 
}

但是这会显示“ZEROCONF未准备好”...
这是我的索引现在的样子(我只添加了一个带有id="zcOK"的段落来显示上述内容)。
<p id="zcOK">ZeroConf test</p>
<!-- ORDER IN WHICH THE SCRIPTS ARE LOADED -->
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="../plugins/com.cambiocreative.cordova.plugin.zeroconf/www/zeroconf.js"></script>
<script type="text/javascript" src="js/index.js"></script> <!-- Contains the onDeviceReady function -->

然而,现在我不知道"ZeroConf"是否未定义是因为插件存在问题还是因为它在"index.html"中被包含,无法从"index.js"中访问?

Cordova插件在浏览器中无法使用,您必须在设备上或设备模拟器中进行测试。 - George Stocker
@GeorgeStocker 谢谢,我也像你想的那样。但是,我也在 iPhone 模拟器上进行了测试(通过运行 cordova 创建的 xcode 项目并显示 cordova.plugins 的值,但在那里也是 undefined)。 - Kevin
3个回答

7
检查 cordova-plugin-zeroconf 的 config.xml 和 JS 文件,我发现了以下声明:

plugin.xmlzeroconf.js


<js-module src="www/zeroconf.js" name="ZeroConf">
    <clobbers target="cambiocreative.CDVZeroConfig" />
</js-module>

因此,插件API应该在此命名空间中可用:cambiocreative.CDVZeroConfig

实际上,根据Cordova插件文档

... 标签允许在 <js-module> 中使用:

<clobbers target="some.value"/> 表示 module.exports 被插入到 window 对象中作为 window.some.value。您可以有任意多个 <clobbers>。任何不在 window 上的对象都会被创建。 ...


你有没有想过为什么调用 cambiocreative.CDVZeroConfig.register(...); 会在控制台中给出以下错误? HelloCordova[14770:2190065] ERROR: Method 'register:' not defined in Plugin 'ZeroConf'。我列出了 cambiocreative.CDVZeroConfig 的所有方法,它确实包含 register 字段(方法)... 我认为这与 "zeroconf.js" 文件有关,该文件执行 return exec(success, failure, "ZeroConf", "list", [type, timeout]);,而 ZeroConf 不再是正确的名称或其他类似的问题? - Kevin
我发现该插件有几个存储库(另一个是https://github.com/vstirbu/ZeroConf/):JS中的定义是相同的。对ZeroConf对象的引用(在zeroconf.js内部)似乎正确。不幸的是,我不了解这个插件及其目的。也许如果您分享一小段代码,我可以尝试一下... - beaver
我目前仅有一两个调用插件方法的操作。(使用“register”函数发布服务的一个调用,和使用“list”函数列出匹配给定标签的所有服务的另一个调用)。您可以在此处找到项目,包含这些调用的文件是“index.js”和“test.js”。同时,我也会搜索可能存在的问题。 https://drive.google.com/folderview?id=0BzEb6HZK4RZZc2FiTE44LVUxRjQ&usp=sharing - Kevin
我已经进行了几次测试,但都没有成功 :(。这里有一个文件夹,其中包含对您原始的cordova项目进行的一些编辑 https://drive.google.com/folderview?id=0B1hy5jkvdozoUTl5cUs1VGdvdzA&usp=sharing。我还添加了我的Android日志... - beaver
我也看到了这个问题(https://github.com/vstirbu/ZeroConf/issues/14),所以尝试更新jmdns.jar,但没有成功;添加了蓝牙权限...我对这个问题不够了解,无法做更多的事情,抱歉 :( - beaver
显示剩余2条评论

2

可能您所包含的插件没有使用cordova.plugin窗口。只需尝试调用插件函数,然后检查它们是否正常工作即可。


谢谢您的帮助!我该如何直接调用插件?我尝试直接在索引中包含“zeroconf.js”脚本,但没有成功。 - Kevin
@HyperZ 你尝试直接检查全局ZeroConf对象了吗? - beaver
@beaver 我几分钟前意识到了这一点,现在正在测试 :) 我会保持联系。 - Kevin
@beaver,我进行了广泛的测试,但是它没有起作用。 "ZeroConf"始终未定义。请注意,我编辑了帖子以反映我的更改。 - Kevin

0

对于那些遇到了(cordova.plugins === undefined)的人,但它应该是100%存在的。

/src/plugins/plugin_name/plugin.xml
找到类似这样的标签:

<js-module src="www/plugin_name.js" name="Plugin_name">
    <clobbers target="cordova.plugins.plugin_name" />
</js-module>

/scr/config.xml
如果该标签不存在,请在</widget>之前复制粘贴它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接