在Cordova 3.6.4上未定义window.plugin.pushNotification

时间:2015-02-08 19:06:14

标签: javascript android cordova

我是使用Cordova构建多平台应用程序的新手。我已经按照许多教程来创建推送通知,但是无法做到。我遵循的流程是:

  1. 在Google控制台中创建了一个项目,将Android的Google云端通知消息设置为“开启”。

  2. 创建项目如下

  3. CMD:

    Cordova create sampleApp com.sample sampleApp
    cordova platform add android
    cordova add plugin https://github.com/phonegap-build/PushPlugin.git 
    
    1. 编辑www/下的 index.html ,将 pushNotification.js 文件添加到其中。
    2. 更改www/js下的 index.js 文件以包含注册。
    3. 代码:

      var pushNotification = window.plugins.pushNotification;
          console.log(pushNotification);
          pushNotification.register(app.successHandler, app.errorHandler,{"senderID":"MY_SENDER_ID","ecb":"app.onNotificationGCM"});
      },successHandler: function(result) {
            alert('Callback Success! Result = '+result)
        },errorHandler:function(error) {
              alert(error);
          },onNotificationGCM: function(e) {
                    switch( e.event )
                    {
                        case 'registered':
                            if ( e.regid.length > 0 )
                            {
                                console.log("Regid " + e.regid);
                                alert('registration id = '+e.regid);
                            }
                        break;
             
                        case 'message':
                          // this is the actual push notification. its format depends on the data model from the push server
                          alert('message = '+e.message+' msgcnt = '+e.msgcnt);
                        break;
             
                        case 'error':
                          alert('GCM error = '+e.msg);
                        break;
             
                        default:
                          alert('An unknown GCM event has occurred');
                          break;
                    }
                }
      
      1. 添加所有要求后,我使用Cordova serve。然后打开 index.html 页面,我将window.plugin.pushNotification视为 undefined 。我做错什么可以帮助我。我已经坚持了很多天。
      2. 这是我的index.html文件

        <html>
        <head>
            <meta charset="utf-8" />
            <meta name="format-detection" content="telephone=no" />
            <meta name="msapplication-tap-highlight" content="no" />
            <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
            <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
            <link rel="stylesheet" type="text/css" href="css/index.css" />
            <title>Hello World</title>
        </head>
        <body>
            <div class="app">
                <h1>Apache Cordova</h1>
                <div id="deviceready" class="blink">
                    <p class="event listening">Connecting to Device</p>
                    <p class="event received">Device is Ready</p>
                </div>
            </div>
            <script type="text/javascript" src="cordova.js"></script>
            <script type="text/javascript" src="js/index.js"></script>
            <script type="text/javascript" src="PushNotification.js"></script>
        </body>
        

3 个答案:

答案 0 :(得分:3)

好的,我有完全相同的问题 - 我花了几个小时才找到解决方案。

首先,我没有必须包含&#34; PushNotification.js&#34;进入我的index.html文件。 Cordova构建管理器通过名为&#34; corodva_plugins.js&#34;的文件来管理包含。

当我查看上面提到的文件时,我发现了以下条目:

   {
        "file": "plugins/com.phonegap.plugins.PushPlugin/www/PushNotification.js",
        "id": "com.phonegap.plugins.PushPlugin.PushNotification",
        "clobbers": [
            "PushNotification"
        ]
    },

所以我看到调用插件的方法实际上不是pushNotification,而是PushNotification(资本&#34; P&#34;)。

//var pushNotification = window.plugins.pushNotification;
var pushNotification = window.plugins.PushNotification;

修改 看看PushNotification.js我发现插件运行良好 window.plugins.pushNotification ...但是,如果在控制器之前包含cordova.js。因此,如果您在使用它之前包含cordova.js(以及PushNotification.js),它将起作用。

答案 1 :(得分:2)

您需要等待 deviceready 事件,直到您可以使用插件。所以尝试像这样包装你的代码

document.addEventListener("deviceready", function() {
  // Here you can use it:
  var pushNotification = window.plugins.pushNotification;
  ...
}, false);

<强>更新

由于提问者告诉它已经包含在 deviceready 处理程序中,原因很可能是你使用serve来运行应用程序。您应该尝试使用cordova build从您的应用构建实际包,然后在实际设备或模拟器上进行测试。

答案 2 :(得分:0)

几天前我遇到了同样的问题,最后我可以搞清楚。有一个新版本的电话间隙推送插件,您正在使用的插件已被弃用。

为了使它工作,我已经安装了新版本的插件,我已将我的cordova更新到最新版本。

请参阅新推送插件的链接:https://github.com/phonegap/phonegap-plugin-push

但问题是一样的。我必须查看ng-cordova.js,我发现$cordovaPush的新版本是$cordovaPushV5。这是我们应该使用的。 github问题也提到了这个问题。

Github问题链接:https://github.com/driftyco/ng-cordova/issues/1152

之后您安装了新插件(并确保已按照此链接http://ngcordova.com/docs/install/中所述安装了ngCordova)。你准备好了。设备就绪事件后,您只需要执行以下操作:

var iosConfig = {
    badge: true,
    sound: true,
    alert: true
};

$cordovaPushV5.initialize(iosConfig).then(function() {
    // DO WHATEVER YOU LIKE
    $cordovaPushV5.register().then(function(deviceToken) {
        // Success -- send deviceToken to server, and store for future use
        console.log("deviceToken: " + deviceToken);
    }, function(error) {
        console.log("register error: ", err);
    });
});