PushPlugin TypeError:Object#<object>没有方法&#39;&#39; exec </object>

时间:2014-11-22 12:05:09

标签: cordova push-notification phonegap-pushplugin

背景

  1. 我安装了PushPlugin。根据我使用自动安装的文档。但是,当我运行cordova run android时,JavaScript会返回错误,并且无法读取未定义的属性pushNotification&#39;

  2. 如果我添加

    <script type="text/javascript" charset="utf-8" src="PushNotification.js"></script>
    

    然后错误更改为此问题标题中的错误。

  3. 这就是我的HTML加载脚本的方式

    <script type="text/javascript" src="cordova.js"></script>
    
    <script src="js/libs/jquery-1.10.2.js"></script>
    <script src="js/libs/handlebars-1.1.2.js"></script>
    <script src="js/libs/ember-1.5.1.js"></script>
    
    <script type="text/javascript" src="js/index.js"></script>
    <script type="text/javascript" src="js/model.js"></script>
    <script type="text/javascript" src="js/router.js"></script>
    <script type="text/javascript" src="js/controller.js"></script>
    <script type="text/javascript" src="js/view.js"></script>
    

    初始化代码位于index.jsdeviceready之后我致电pushNotification.register

    register完成后,我致电MyEmberApp.deferReadiness()

  4. 根据文档,自动安装插件后,我只需运行register。但这仍然导致“无法阅读pushNotification ....&#39;

  5. 似乎在PushNotification.js点火后会自动插入deviceready。但插件并没有这样做。如果我在index.html中插入脚本,则会出现错误Object has no method 'exec',因为deviceready尚未解雇。

  6. deviceready

    if ('device is android') {
        document.addEventListener("deviceready", this.onDeviceReady(), false);
    }
    
  7. 问题

    我做错了什么?我该怎么做?

    更新

    我刚才意识到我只尝试过自动安装。我还没有尝试过手动步骤。但这并不是直接插件安装不起作用的原因

2 个答案:

答案 0 :(得分:2)

我终于意识到错误是由EventListener deviceready造成的。我改变了

  if ('device is android') {
        document.addEventListener("deviceready", this.onDeviceReady(), false);
  }

  document.addEventListener("deviceready", this.onDeviceReady, false);

一切都落到了原地。虽然这是一个粗心的错误,但我仍然留下这个问题,这是其他可能遇到这个问题的人的答案

答案 1 :(得分:1)

我无法真正看到,为什么你的解决方案无效。我唯一能提供的就是我的工作解决方案。可能会有一些冗余或不必要的东西,因为在我开始工作之前我自己尝试了35个版本:

首先,我在App Initializer中附加pg事件并注册我的Notification Services:

Ember.Application.initializer({
    name: 'phonegap',

    /* ...... */

    initialize: function(container, application){
        // Push
        container.register('notification:manager', GambifyApp.NotificationManager, { singleton: true });
        container.register('notification:handler', GambifyApp.NotificationHandler, { instantiate: false });
        container.injection('notification:handler', 'appController', 'controller:application');
        container.injection('notification:handler', 'commentRoute', 'route:usergroup.comment');
    }
}

然后我的经理服务部门正在注册该设备:

GambifyApp.NotificationManager = window.GambifyApp.NotificationManager = Ember.Object.extend({
    init: function(){
        //var self = this;
        var pushNotification = Ember.get(window, 'plugins.pushNotification');
        if(!Ember.isEmpty(pushNotification)){
            if ( device.platform == 'android' || device.platform == 'Android' )
            {
                pushNotification.register(
                    this.successHandler,
                    this.errorHandler, {
                        "senderID":GambifyApp.config.android_sender_id,
                        "ecb":"window.GambifyApp.NotificationHandler.onNotificationGCM"
                    });
            }
        } else {
            Ember.Logger.error('pushNotification Plugin not running');
        }
        GambifyApp.NotificationHandler.manager = this;
    },

    successHandler: function (result) { },

    errorHandler: function (error) {
        Ember.Logger.error('Error while registering with push:' + error);
    },
});

然后在成功的情况下,用我的处理程序可以使用设备ID调用ECB:

GambifyApp.NotificationHandler =  window.GambifyApp.NotificationHandler = {

    manager: null,

    onNotificationGCM: function(e){
        console.log('---------- GCM Event:-----------');
        console.log(e);

        if(e.event === "registered") {
            console.log(e.regid); // Registraion ID
        }
    },

};

希望这可能有所帮助。