PushPlugin TypeError: Обект #‹Object› няма метод ''exec

Фон

  1. Инсталирах PushPlugin. Според документите използвах автоматична инсталация. Но когато стартирам cordova run android, JavaScript връща грешката „Не може да прочете свойството pushNotification на undefined“

  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.js, където след deviceready извиквам pushNotification.register.

    След като register завърши, извиквам MyEmberApp.deferReadiness()

  4. След автоматично инсталиране на приставката, просто трябва да стартирам register, според документите. Но това все още води до „Не мога да прочета pushNotification....“

  5. Изглежда, че PushNotification.js се вмъква автоматично след задействане на deviceready. Но плъгинът не го прави. Ако вмъкна скрипта в index.html, възниква грешка Object has no method 'exec', защото deviceready още не е задействан.

  6. deviceready

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

Въпрос

какво правя грешно Как трябва да направя това?

Актуализация

Току що разбрах, че съм пробвал само автоматичната инсталация. Не съм пробвал ръчните стъпки. Но това не е причина директната инсталация на приставката да не работи


person Ajoy    schedule 22.11.2014    source източник
comment
Гласувам да затворя този въпрос като извън темата, защото възникна в резултат на грешка в настройката ми. Следователно въпросът е неуместен   -  person Ajoy    schedule 23.02.2015


Отговори (2)


Най-накрая разбрах, че грешката се дължи на EventListener за deviceready. промених се

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

to

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

и всичко си дойде на мястото. Въпреки че това е небрежна грешка, все пак оставям този въпрос и отговорите му за други, които може да се сблъскат с този проблем

person Ajoy    schedule 20.12.2014

Наистина не виждам защо вашето решение не работи. Единственото, което мога да предложа, е моето работещо решение. Може да има някои излишъци или ненужни неща там, защото аз самият опитах 35 версии, преди да го накарам да работи:

Първото нещо е, че прикачвам към pg събития в инициализатор на приложения и регистрирам моите услуги за уведомяване:

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

След това, в случай на успех, ECB се извиква с ID на устройството, което може да се направи от моя манипулатор:

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

};

Надявам се това да помогне.

person m0c    schedule 26.11.2014
comment
Благодаря, че го разгледахте. Преди да опитам различен подход, опитах да инсталирам плъгина Cordova Device, но това също не проработи. - person Ajoy; 27.11.2014
comment
Изглежда, че начинът, по който инициализирах и използвах Ember, вероятно е причината. Работя върху това - person Ajoy; 27.11.2014
comment
Опитах всичко, премахнах платформа, добавих платформа, премахнах плъгини, добавих ги. Премахнах и целия ember код само с плъгините и въпреки това грешката не се промени - person Ajoy; 28.11.2014
comment
Актуализирах въпроса си. Може би ще успеете да ме насочите в правилната посока сега! - person Ajoy; 28.11.2014
comment
Опитвали ли сте да създадете приложението с build.phonegap.com, може би проблемът е с версията или нещо подобно - person m0c; 02.12.2014