Ionic Framework PushPlugin:onNotificationGMC 未触发且无法获取 regID
Ionic Framework PushPlugin: onNotificationGMC is not fired and cannot obtain regID
我相信这个问题看起来像这个问题:
Cordova Push Plugin: onNotificationGMC is not fired and cannot obtain regID
但我使用的是 Ionic Framework。我按照本教程制作 PushProcessingService:
http://intown.biz/2014/04/11/android-notifications/
//factory for processing push notifications.
angular.module('starter.pusher', [])
.factory('PushProcessingService', function(MyService) {
function onDeviceReady() {
console.info('NOTIFY Device is ready. Registering with GCM server');
alert('NOTIFY Device is ready. Registering with GCM server');
//register with google GCM server
var pushNotification = window.plugins.pushNotification;
pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {'senderID': 'myappid', 'ecb': 'onNotificationGCM'});
}
function gcmSuccessHandler(result) {
console.info('NOTIFY pushNotification.register succeeded. Result = ' + result);
alert('NOTIFY pushNotification.register succeeded. Result = ' + result)
}
function gcmErrorHandler(error) {
console.error('NOTIFY ' + error);
}
return {
initialize: function() {
console.info('NOTIFY initializing');
document.addEventListener('deviceready', onDeviceReady, false);
},
registerID: function(regid) {
//Insert code here to store the user's ID on your notification server.
//You'll probably have a web service (wrapped in an Angular service of course) set up for this.
//For example:
MyService.registerNotificationID(regid).then(function(response) {
if (response.data.Result) {
console.info('NOTIFY Registration succeeded');
} else {
console.error('NOTIFY Registration failed');
}
});
},
//unregister can be called from a settings area.
unregister: function() {
console.info('unregister')
var push = window.plugins.pushNotification;
if (push) {
push.unregister(function() {
console.info('unregister success')
});
}
}
}
});
// ALL GCM notifications come through here.
function onNotificationGCM(e) {
console.log('EVENT -> RECEIVED:' + e.event + '');
alert('EVENT -> RECEIVED:' + e.event + '');
switch (e.event)
{
case 'registered':
if (e.regid.length > 0)
{
console.log('REGISTERED with GCM Server -> REGID:' + e.regid + '');
alert(e.regid);
//call back to web service in Angular.
//This works for me because in my code I have a factory called
// PushProcessingService with method registerID
var elem = angular.element(document.querySelector('[ng-app]'));
var injector = elem.injector();
var myService = injector.get('PushProcessingService');
myService.registerID(e.regid);
}
break;
case 'message':
// if this flag is set, this notification happened while we were in the foreground.
// you might want to play a sound to get the user's attention, throw up a dialog, etc.
if (e.foreground)
{
//we're using the app when a message is received.
console.log('--INLINE NOTIFICATION--' + '');
// if the notification contains a soundname, play it.
//var my_media = new Media('/android_asset/www/'+e.soundname);
//my_media.play();
alert(e.payload.message);
}
else
{
// otherwise we were launched because the user touched a notification in the notification tray.
if (e.coldstart)
console.log('--COLDSTART NOTIFICATION--' + '');
else
console.log('--BACKGROUND NOTIFICATION--' + '');
// direct user here:
window.location = '#/tab/dash';
}
console.log('MESSAGE -> MSG: ' + e.payload.message + '');
console.log('MESSAGE: ' + JSON.stringify(e.payload));
break;
case 'error':
console.log('ERROR -> MSG:' + e.msg + '');
alert('ERROR -> MSG:' + e.msg + '');
break;
default:
console.log('EVENT -> Unknown, an event was received and we do not know what it is');
alert('EVENT -> Unknown, an event was received and we do not know what it is');
break;
}
}
但是 onNotificationGCM(e) 回调似乎不起作用。我已经把它移到工厂里了,但问题仍然存在。我在 app.js:
中调用函数
app.run(function($ionicPlatform, PushProcessingService) {
try {
PushProcessingService.initialize();
} catch (err) {
alert(err);
}
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
});
})
请帮我解决这个问题。因为我已经卡了好几天了。谢谢!! :)
是否调用了设备就绪函数?您要添加设备就绪监听器吗?
这样做:
document.addListener("deviceready" function(){
var pushNotification = window.plugins.pushNotification;
pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {'senderID': 'myappid', 'ecb': 'onNotificationGCM'});
}
function gcmSuccessHandler(result) {
console.info('NOTIFY pushNotification.register succeeded. Result = ' + result);
alert('NOTIFY pushNotification.register succeeded. Result = ' + result)
}
function gcmErrorHandler(error) {
console.error('NOTIFY ' + error);
}
});
我终于尝试按照此处所述使用 ngCordova 推送通知插件:
http://ngcordova.com/docs/plugins/pushNotifications/
一切正常。
注意事项:插件无法在浏览器和模拟器中运行。它仅在真实设备中有效,在我的例子中,Android设备。
我希望这对遇到与我相同问题的人有所帮助。
我相信这个问题看起来像这个问题:
Cordova Push Plugin: onNotificationGMC is not fired and cannot obtain regID
但我使用的是 Ionic Framework。我按照本教程制作 PushProcessingService:
http://intown.biz/2014/04/11/android-notifications/
//factory for processing push notifications.
angular.module('starter.pusher', [])
.factory('PushProcessingService', function(MyService) {
function onDeviceReady() {
console.info('NOTIFY Device is ready. Registering with GCM server');
alert('NOTIFY Device is ready. Registering with GCM server');
//register with google GCM server
var pushNotification = window.plugins.pushNotification;
pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {'senderID': 'myappid', 'ecb': 'onNotificationGCM'});
}
function gcmSuccessHandler(result) {
console.info('NOTIFY pushNotification.register succeeded. Result = ' + result);
alert('NOTIFY pushNotification.register succeeded. Result = ' + result)
}
function gcmErrorHandler(error) {
console.error('NOTIFY ' + error);
}
return {
initialize: function() {
console.info('NOTIFY initializing');
document.addEventListener('deviceready', onDeviceReady, false);
},
registerID: function(regid) {
//Insert code here to store the user's ID on your notification server.
//You'll probably have a web service (wrapped in an Angular service of course) set up for this.
//For example:
MyService.registerNotificationID(regid).then(function(response) {
if (response.data.Result) {
console.info('NOTIFY Registration succeeded');
} else {
console.error('NOTIFY Registration failed');
}
});
},
//unregister can be called from a settings area.
unregister: function() {
console.info('unregister')
var push = window.plugins.pushNotification;
if (push) {
push.unregister(function() {
console.info('unregister success')
});
}
}
}
});
// ALL GCM notifications come through here.
function onNotificationGCM(e) {
console.log('EVENT -> RECEIVED:' + e.event + '');
alert('EVENT -> RECEIVED:' + e.event + '');
switch (e.event)
{
case 'registered':
if (e.regid.length > 0)
{
console.log('REGISTERED with GCM Server -> REGID:' + e.regid + '');
alert(e.regid);
//call back to web service in Angular.
//This works for me because in my code I have a factory called
// PushProcessingService with method registerID
var elem = angular.element(document.querySelector('[ng-app]'));
var injector = elem.injector();
var myService = injector.get('PushProcessingService');
myService.registerID(e.regid);
}
break;
case 'message':
// if this flag is set, this notification happened while we were in the foreground.
// you might want to play a sound to get the user's attention, throw up a dialog, etc.
if (e.foreground)
{
//we're using the app when a message is received.
console.log('--INLINE NOTIFICATION--' + '');
// if the notification contains a soundname, play it.
//var my_media = new Media('/android_asset/www/'+e.soundname);
//my_media.play();
alert(e.payload.message);
}
else
{
// otherwise we were launched because the user touched a notification in the notification tray.
if (e.coldstart)
console.log('--COLDSTART NOTIFICATION--' + '');
else
console.log('--BACKGROUND NOTIFICATION--' + '');
// direct user here:
window.location = '#/tab/dash';
}
console.log('MESSAGE -> MSG: ' + e.payload.message + '');
console.log('MESSAGE: ' + JSON.stringify(e.payload));
break;
case 'error':
console.log('ERROR -> MSG:' + e.msg + '');
alert('ERROR -> MSG:' + e.msg + '');
break;
default:
console.log('EVENT -> Unknown, an event was received and we do not know what it is');
alert('EVENT -> Unknown, an event was received and we do not know what it is');
break;
}
}
但是 onNotificationGCM(e) 回调似乎不起作用。我已经把它移到工厂里了,但问题仍然存在。我在 app.js:
中调用函数app.run(function($ionicPlatform, PushProcessingService) {
try {
PushProcessingService.initialize();
} catch (err) {
alert(err);
}
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
});
})
请帮我解决这个问题。因为我已经卡了好几天了。谢谢!! :)
是否调用了设备就绪函数?您要添加设备就绪监听器吗?
这样做:
document.addListener("deviceready" function(){
var pushNotification = window.plugins.pushNotification;
pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {'senderID': 'myappid', 'ecb': 'onNotificationGCM'});
}
function gcmSuccessHandler(result) {
console.info('NOTIFY pushNotification.register succeeded. Result = ' + result);
alert('NOTIFY pushNotification.register succeeded. Result = ' + result)
}
function gcmErrorHandler(error) {
console.error('NOTIFY ' + error);
}
});
我终于尝试按照此处所述使用 ngCordova 推送通知插件:
http://ngcordova.com/docs/plugins/pushNotifications/
一切正常。
注意事项:插件无法在浏览器和模拟器中运行。它仅在真实设备中有效,在我的例子中,Android设备。
我希望这对遇到与我相同问题的人有所帮助。