cordova - PhoneGap应用程序中的"plugins is not defined"

标签 cordova phonegap-plugins

我目前正在尝试使用 PhoneGap LocalNotification 插件 ,
将 Android 4.1 与 Cordova 2.0.0 和 Sketcha(UI 库)一起使用。

更新 #2 20/9/12:我使用了 Bozzzi 的代码并进行了一些修复:

  • 将 }) 添加到 localnotification.js 的末尾(语法错误)。
  • 已更改 cordova.define("cordova/plugin/LocalNotification", function(require, exports, module)到:cordova.define("cordova/plugin/LocalNotification", function(require, exports, module) ,
    因此模块名称将与此功能匹配(在未找到模块之前):

    window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");

  • 从此改变:

    if (!window.plugins) { window.plugins = {}; } else if (!window.plugins.LocalNotification) { window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification"); }


  • 对此:
    if (!window.plugins) {
        window.plugins = {};
    }
    
    if (!window.plugins.LocalNotification) {
        window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");
    }
    

    在此更改之前,如果未找到 window.plugins,则会创建它,但不会创建 window.plugins.LocalNotification。

    在所有这些修复之后,我收到了这个错误:

    > 09-20 01:22:27.355: D/CordovaLog(8297):
    > file:///android_asset/www/index.html: Line 21 : PAPA AMERICANO ready
    > 09-20 01:22:27.360: I/Web Console(8297): PAPA AMERICANO ready at
    > file:///android_asset/www/index.html:21 09-20 01:22:27.370:
    > D/CordovaLog(8297): Uncaught TypeError: Cannot call method 'add' of
    > undefined 09-20 01:22:27.375: D/CordovaLog(8297):
    > file:///android_asset/www/index.html: Line 35 : Uncaught TypeError:
    > Cannot call method 'add' of undefined 09-20 01:22:27.375: E/Web
    > Console(8297): Uncaught TypeError: Cannot call method 'add' of
    > undefined at file:///android_asset/www/index.html:35 09-20
    > 01:22:29.185: D/DroidGap(8297): onMessage(spinner,stop) 09-20
    > 01:22:30.255: E/SKIA(8297): FimgApiStretch:stretch failed 09-20
    > 01:22:41.755: E/SKIA(8297): FimgApiStretch:stretch failed 09-20
    > 01:22:52.565: D/CordovaWebView(8297): >>> loadUrlNow() 09-20
    > 01:22:52.565: D/webkit(8297): Firewall not null 09-20 01:22:52.565:
    > D/webkit(8297): euler: isUrlBlocked = false
    


    出于某种原因 cordova.require("cordova/plugin/LocalNotification")不要设置window.plugins.LocalNotification值并且它一直未定义。
    这是我更新的 index.html(更新 #2):
    <!DOCTYPE HTML>
    <html manifest="" lang="en-US">
    <head>
        <meta charset="UTF-8">
        <title>AndroidSencha</title>
        <script id="microloader" type="text/javascript" src="cordova-2.0.0.js"></script>
        <script id="microloader" type="text/javascript" src="LocalNotification.js"></script>
        <script id="microloader" type="text/javascript">
    
        function onDeviceReady() {
            if (!window.plugins) {
                window.plugins = {};
            } else if (!window.plugins.LocalNotification) {
                window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");
            }
        }
    
        window.document.addEventListener("deviceready", appReady, false);
    
        function appReady() {
            console.log("PAPA AMERICANO ready");
    
            var d = new Date();
            d = d.getTime() + 2 * 1000; //60 seconds from now
            d = new Date(d);
    
            if (!window.plugins) {
                window.plugins = {};
            }
    
            if (!window.plugins.LocalNotification) {
                window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");
            }
    
            window.plugins.localNotification.add({
                date: d,
                message: 'This is an Android alarm using the statusbar',
                id: 123
            });
        }
    
        </script>
        <style type="text/css">
             /**
             * Example of an initial loading indicator.
             * It is recommended to keep this as minimal as possible to provide instant feedback
             * while other resources are still being loaded for the first time
             */
            html, body {
                height: 100%;
                background-color: #1985D0
            }
    
        </style>
    
        <!-- The line below must be kept intact for Sencha Command to build your application -->
        <script id="microloader" type="text/javascript" src="sdk/microloader/development.js"></script>
            <style type="text/css">
    .loadingText{
    color: white;
    font-family: "Avant Garde", Avantgarde, "Century Gothic", CenturyGothic, "AppleGothic", sans-serif;
    text-align: center;
    font-size: 20px;
    padding-top: 10%;
    }
    </style>
    </head>
    <body>
        <div id="appLoadingIndicator">
        <div class="loadingText"><div style="margin-bottom: 10px;">Loading, Please wait..</div>
        <div><img src="resources\images\smileloading.gif"></div></div>
        </div>
    
    </body>
    </html>
    

    这是我修复后的 localnotificaiton.js(更新 #2):
    cordova.define("cordova/plugin/LocalNotification", function(require, exports, module) {      
    
    var exec = require("cordova/exec");
    var LocalNotification = function () {};
    
    LocalNotification.prototype.add = function(options) {
                var defaults = {
                    date : new Date(),
                    message : '',
                    ticker : '',
                    repeatDaily : false,
                    id : ""
                };
            if (options.date) {
                    options.date = (options.date.getMonth()) + "/" + (options.date.getDate()) + "/"
                            + (options.date.getFullYear()) + "/" + (options.date.getHours()) + "/"
                            + (options.date.getMinutes());
                }
    
                for ( var key in defaults) {
                    if (typeof options[key] !== "undefined")
                        defaults[key] = options[key];
                }
    
                cordova.exec(null, null, "LocalNotification", "add",  new Array(defaults));
    };
    
    LocalNotification.prototype.cancel = function(notificationId) {
        cordova.exec(null, null, 'LocalNotification', 'cancel', new Array({
            id : notificationId
        }));
    };
    
    LocalNotification.prototype.cancelAll = function() {
        cordova.exec(null, null, 'LocalNotification', 'cancelAll', new Array());
    };
    
    
    var LocalNotification = new LocalNotification();
    module.exports = LocalNotification
    });
    

    更新#1:我已经将插件添加到 plugins.xml 文件中:
    <plugins>
    ...
      <plugin name="LocalNotification" value="com.phonegap.plugin.localnotification.LocalNotification"/>
    ...
    </plugins>
    

    我已经完成了提到的步骤here并替换了提到的损坏的java表达式here .

    不幸的是,当我运行应用程序时,出现以下错误(在模拟器和设备中):

    09-16 16:46:16.330: E/Web Console(27875): Uncaught ReferenceError: plugins is not defined at file:///android_asset/www/index.html:74



    This guy was facing the same problem但我在 index.html 中引用了 cordova javascript 文件,但它仍然无法正常工作。

    这是我的包资源管理器的样子(您可能会发现缺少一些东西):
    我不确定我是否应该拥有 plugins.xml 或拥有 config.xml 并在其中包含插件,
    我有两个以防万一

    Package Explorer

    提前致谢!

    最佳答案

    我更改了 LocalNotification.js,以便您可以复制代码。它适用于cordova 2.0(经过测试!)

    cordova.define("cordova/plugin/js/LocalNotification", function(require, exports, module) {      
    
    var exec = require("cordova/exec");
    var LocalNotification = function () {};
    
    LocalNotification.prototype.add = function(options) {
                var defaults = {
                    date : new Date(),
                    message : '',
                    ticker : '',
                    repeatDaily : false,
                    id : ""
                };
            if (options.date) {
                    options.date = (options.date.getMonth()) + "/" + (options.date.getDate()) + "/"
                            + (options.date.getFullYear()) + "/" + (options.date.getHours()) + "/"
                            + (options.date.getMinutes());
                }
    
                for ( var key in defaults) {
                    if (typeof options[key] !== "undefined")
                        defaults[key] = options[key];
                }
    
                cordova.exec(null, null, "LocalNotification", "add",  new Array(defaults));
    };
    
    LocalNotification.prototype.cancel = function(notificationId) {
        cordova.exec(null, null, 'LocalNotification', 'cancel', new Array({
            id : notificationId
        }));
    };
    
    LocalNotification.prototype.cancelAll = function() {
        cordova.exec(null, null, 'LocalNotification', 'cancelAll', new Array());
    };
    
    
    var LocalNotification = new LocalNotification();
    module.exports = LocalNotification;
    

    });

    现在你可以调用通知了。和:
        datum = '2012-09-20 15:51:00';  
    tt1 = datum.split(/[- :]/);
        dd = new Date(tt1[0], tt1[1]-1, tt1[2], tt1[3], tt1[4], tt1[5]);
    
    window.plugins.LocalNotification.add({ date: dd, message: "Some message", ticker : "Some ticker", repeatDaily : false, id: 1234 });
    

    关于cordova - PhoneGap应用程序中的"plugins is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12447870/

    相关文章:

    cordova - 使用phonegap更新SharePoint列表项

    objective-c - PhoneGap插件: AudioEncode success callback never called

    android - 在用户不知情的情况下用基于 cordova/phonegap 的应用程序交换现有的 native 应用程序

    ios - Cordova:我可以在 div 中显示 native 应用程序组件吗?

    javascript - Phonegap FileReader readAsText 返回 null 但 readAsDataURL 有效

    javascript - maxlength 不适用于 cordova android 应用程序中的输入类型文本

    android - PhoneGap/Cordova 中的 Chromecast 支持

    android - 媒体 API 似乎在 Phonegap 3 中不起作用

    angularjs - 如何向 Ionic/Phonegap 项目添加测试?

    cordova - Meteor cordova 不允许 CORS