0

Я делаю pushnotification для Android и IOS.Cordova PushNotification onNotificationGCM не называется

Я использовал кордову push-plugin https://github.com/phonegap-build/PushPlugin, кажется, отлично работает.

Информация: Я работаю над проектом AngularJS.

В моей NotificationHelper заводе у меня есть этот метод инициализации:

helper.init = function() { 

    // Instanciate push plugin notification 
    var pushNotification = window.plugins.pushNotification; 

    var errorHandler = function(error) { 
     logger.debug('errorHandler = ' + error); 
    }; 

    if ($rootScope.isAndroid()) { 
     var senderId = CONFIG.NOTIFICATION_ANDROID_SENDER_ID; 
     pushNotification.register(function(result) { 
      logger.debug('successHandler = ' + result); 
     }, errorHandler, { 
      'senderID' : senderId, 
      'ecb' : 'onNotificationGCM' 
     }); 
    } 
}; 

Я также определил эти методы на mains.js:

var onNotificationGCM = function(event) { 
    // call back to web service in Angular. 
    var elem = angular.element(document.querySelector('[ng-app]')); 
    var injector = elem.injector(); 
    var service = injector.get('NotificationHelper'); 
    service.onNotificationGCM(event); 
}; 

Это трюк, чтобы позвонить angularJS завод из основного JavaScript.

'onNotificationGCM' вызовите метод 'NotificationHelper.onNotificationGCM':

helper.onNotificationGCM = function(e) { 
    switch (e.event) { 
    case 'message': 
     // Notification happened while app was in the foreground 
     if (e.foreground) { 
      logger.debug('[notification] [message] Foreground : ' + JSON.stringify(e)); 
     } else { // Notification touched in the notification tray 
      logger.debug('[notification] [message] Background : ' + JSON.stringify(e)); 
      if (e.coldstart) { 
       // App was not running and user clicked on notification 
      } else { 
       // App was running and user clicked on notification 
      } 
     } 
     decriptPayloadNotification(e.payload); 
     break; 
    case 'registered': 
     logger.debug('[notification] [registered] : ' + JSON.stringify(e)); 
     if (e.regid.length > 0) { 
      registerUser(e.regid, 'gcm'); 
     } 
     break; 

    case 'error': 
     logger.debug('[notification] [error] : ' + JSON.stringify(e)); 
     break; 

    default: 
     logger.debug('[notification] [default] : Unknown, an event was received and we do not know what it is : ' + JSON.stringify(e)); 
     break; 
    } 
}; 

Во время первого использования, все работает хорошо:

  • 'Registered' событие получено
  • Уведомления принимаются
  • Когда я нахожусь на переднем плане, я получаю сообщение «сообщение»:

УведомлениеHelper: [уведомление] [сообщение] Foreground: {"event": "message", "from": "847593779913", "message": "Agenêts 23/03 10h \ r \ n", " collapse_key ":" do_not_collapse "," theeground ": true," loadload ": {" lt ":" school "," lv ":" E1154 "," notId ":" 35429 "," title ":" Agenêts le 23/03/2015" , "сообщение": "Agenêts 23/03 10h \ г \ п"}}

  • Когда я нахожусь на фоне, если я получаю Notif и Туш его на лоток уведомлений, я получать сообщение «сообщение»:

NotificationHelper: [уведомление] [сообщение] Справочная информация: {«событие»: «сообщение», «от»: «847593779913», «сообщение»: «la piscine sera fermée 1 journalee pour raison technique», «coldstart»: false , «collapse_key»: «do_not_collapse», «foreground»: false, «полезная нагрузка»: {«lt»: «плавательный бассейн», «lv»: «E114», «notId»: «29869», «title»: 23/04/2015 FERMETURE де ла Пискин», "сообщение": "La Piscine сывороток fermée 1 journée налить технику RAISON"}}

НО, если я убить мое приложение, все перестают работать.

Если я перезапущу приложение, я больше не буду получать сообщение 'message'event и' ​​onNotificationGCM 'не будет вызываться.

Я основал несколько статей говоря об этой проблеме, но без успеха:

Stackoverflow : Phonegap PushNotification to open a specific app page

ли кто-нибудь имеет представление об этой проблеме?

ответ

0

Я спрашивал себя, почему он правильно работал в первый раз и не следующие разы ... и я имел эту идею:

  • Возможно, функция обратного вызова подписана на плагин впервые, но не на следующий раз.

И это как раз источник моей проблемы. Я вызываю «pushNotification.register» только один раз, чтобы запустить плагин и получить идентификаторы ... Но в следующий раз, когда я запустил приложение, я не инициализирую снова плагин, поэтому pushplugin не знает, какой метод вызывать в запросе обратного вызова ,

Так ответ: Позвоните в «pushNotification.register» в каждом запуске приложения!

В моем коде, я должен вызвать метод ниже на каждом «deviceready» событие:

helper.init = function() { 

// Instanciate push plugin notification 
var pushNotification = window.plugins.pushNotification; 

var errorHandler = function(error) { 
    logger.debug('errorHandler = ' + error); 
}; 

if ($rootScope.isAndroid()) { 
    var senderId = CONFIG.NOTIFICATION_ANDROID_SENDER_ID; 
    pushNotification.register(function(result) { 
     logger.debug('successHandler = ' + result); 
    }, errorHandler, { 
     'senderID' : senderId, 
     'ecb' : 'onNotificationGCM' 
    }); 
} 
}; 
0

Если вы используете узел-GCM как сторона сервера уведомления толчка, я надеюсь, что это может помочь для Вашего вопроса: вещей, чтобы проверить:

  • использование ADB LogCat из консоли и проверить журналы устройств, чтобы увидеть если ваше устройство получает какое-либо уведомление (вы должны увидеть некоторые журналы из gcmservices, если вы получите). Я считаю, что вы должны увидеть некоторые журналы, потому что иначе вы, вероятно, не получили бы уведомления, когда приложение будет на переднем плане.
  • проверка, если добавить «название» и «сообщение» клавиши на данных сообщений (это сделать меня с ума раньше)
  • чек, если параметр delayWhileIdle ложна

переменной образец сообщения и метод я использую это ниже:

var pushAndroidSender = new gcm.Sender('Your GoogleApi Server Key Here'); 
var message = new gcm.Message({ 
    collapseKey: 'demo', 
    delayWhileIdle: false, 
    timeToLive: 3, 
    data: { 
     "message":"What's up honey?", 
     "title":"Come on" 
    } 
}); 
pushAndroidSender.send(message, registrationIds, function(err, result) { 
    if (err) { 
     console.error("this is an error: " + err); 
    } else { 
     console.log("this is a successful result:" + result); 
    } 
}); 
+0

Я думаю, только 'требуется message'. 'title' является необязательным – Ajoy

+0

Я сделал то, что вы сказали. 1) В adb logcat я вижу некоторые журналы из gcmservices. 2) У меня есть «заголовок» и «сообщение» в моих сообщениях. 3) И я установил для параметра delayWhileIdle значение false. Но у меня такая же проблема :( –