PushPlugin TypeError: Object #<Object> has no method ''exec

孤者浪人 提交于 2019-12-03 18:16:23

问题


Background

  1. I installed PushPlugin. According to the docs I used automatic installation. But when I run cordova run android, JavaScript returns the error, 'Cannot read property pushNotification of undefined'

  2. If I add

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

    then the error changes to the one in this question's title.

  3. This is how my HTML loads the scripts

    <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>
    

    Initialization code is in index.js where after deviceready I call pushNotification.register.

    After the register completes, I call MyEmberApp.deferReadiness()

  4. After automatically installing the plugin, I just have to run register, according to the docs. But this still leads to 'Cannot read pushNotification....'

  5. It seems that PushNotification.js is automatically inserted after deviceready fires. But the plugin is not doing so. If I insert the script in index.html, the error Object has no method 'exec' occurs because deviceready hasn't fired yet.

  6. deviceready

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

Question

What am I doing wrong? How should I do this?

Update

I just realized that I have only tried the automatic installation. I have not tried the manual steps. But that is no reason why the direct plugin install shouldn't work


回答1:


I finally realized that the error was due to the EventListener for deviceready. I changed

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

to

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

and everything fell right into place. Though this is a careless mistake, I still leave this question and it's answers for others who might encounter this issue




回答2:


I can't really see, why ur solution is not working. The only thing I can provide is my working solution. There might be some redundancies or unnecessary things in there, because I myself tried 35 Versions before I got it working:

First Thing is I attach to pg events in an App Initializer and register my 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');
    }
}

Then my Manager Service is registering the the device:

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);
    },
});

Then in a case of success the ECB is called with the device ID which is could by my handler:

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
        }
    },

};

Hope this might help.



来源:https://stackoverflow.com/questions/27077173/pushplugin-typeerror-object-object-has-no-method-exec

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!