Android 在模拟器上使用 PushPlugin 的 PushNotifications
Android PushNotifications with PushPlugin on emulator
我一直在关注 this sample 以获得在 android 模拟器上运行的 android pushNotifications(使用 GCM)。
在 $cordovaPush.register(config)
之后,我得到 Ok 作为响应。但它从不运行我的回调 [$scope.$on('$cordovaPush:notificationReceived'
]。
结果我从来没有得到我的注册 ID。
我创建了一个 google API 项目。我在调用 $cordovaPush.register(config)
.
时在 config.senderID 中使用该项目 ID
我还在我的模拟器中注册了一个 gmail 帐户。
我想我有 2 个问题。
1.Is 可以在 android 模拟器上获取(并注册)推送通知吗?
为什么我没有收到调用回调的 $cordovaPush:notificationReceived 事件?
app.controller('AppCtrl', 函数($scope, $cordovaPush, $cordovaDialogs, $cordovaMedia, $cordovaToast, ionPlatform, $http) {
$scope.notifications = [];
// call to register automatically upon device ready
ionPlatform.ready.then(function (device) {
$scope.register();
});
// Register
$scope.register = function () {
var config = null;
if (ionic.Platform.isAndroid()) {
config = {
"senderID": "12834957xxxx"
};
}
$cordovaPush.register(config).then(function (result) {
console.log("Register success " + result);
$cordovaToast.showShortCenter('Registered for push notifications');
$scope.registerDisabled=true;
}, function (err) {
console.log("Register error " + err)
});
}
$scope.$on('$cordovaPush:notificationReceived', function (event, notification) {
console.log(JSON.stringify([notification]));
if (ionic.Platform.isAndroid()) {
handleAndroid(notification);
}
});
// Android Notification Received Handler
function handleAndroid(notification) {
// ** NOTE: ** You could add code for when app is in foreground or not, or coming from coldstart here too
// via the console fields as shown.
console.log("In foreground " + notification.foreground + " Coldstart " + notification.coldstart);
if (notification.event == "registered") {
$scope.regId = notification.regid;
storeDeviceToken("android");
}
else if (notification.event == "message") {
$cordovaDialogs.alert(notification.message, "Push Notification Received");
$scope.$apply(function () {
$scope.notifications.push(JSON.stringify(notification.message));
})
}
else if (notification.event == "error")
$cordovaDialogs.alert(notification.msg, "Push notification error event");
else $cordovaDialogs.alert(notification.event, "Push notification handler - Unprocessed Event");
}
我也遇到了同样的问题。已在 ngCordova github 中报告,但尚未回复。
我设法修复了它。我知道如果您使用 angular 这不是一个好的解决方案,但这是我能够捕获寄存器 ID 的唯一方法。
在配置对象中,您必须指定 'ecb'
:
var androidConfig = {
"senderID": "388573974286",
"ecb": "function_to_be_called"
};
控制器外函数:
window.function_to_be_called = function (notification) {
switch(notification.event) {
case 'registered':
if (notification.regid.length > 0 ) {
alert('registration ID = ' + notification.regid);
}
break;
case 'message':
// this is the actual push notification. its format depends on the data model from the push server
alert('message = ' + notification.message + ' msgCount = ' + notification.msgcnt);
break;
case 'error':
alert('GCM error = ' + notification.msg);
break;
default:
alert('An unknown GCM event has occurred');
break;
}
};
修复比看起来简单得多。
我从:
$scope.$on('$cordovaPush:notificationReceived', function (event, notification) {
至:
$scope.$on('pushNotificationReceived', function (event, notification) {
而 debugging 我在 ng-cordova.js 上注意到了这一点:
angular.module('ngCordova.plugins.push', [])
.factory('$cordovaPush', ['$q', '$window', '$rootScope', function ($q, $window, $rootScope) {
return {
onNotification: function (notification) {
$rootScope.$apply(function () {
$rootScope.$broadcast('pushNotificationReceived', notification);
});
},
这意味着它正在为 'pushNotificationReceived' 进行广播。不是 'notificationReceived' 而是 documented.
即使你按照你说的更新事件名称,我还有另一个问题,它说:processmessage failed: message: jjavascript:angular.element(document.queryselector('[ng-app]')).injector().get('$cordovapush').onnotification({"event":"registered"
...
当 angular 找不到 'ng-app' 并且 returns 'undefined' angular.element(document.querySelector('[ng-app]'))
时会发生这种情况
所以要解决这个问题,您可以像这样手动设置“ecb
”:
angular.element(document.body).injector().get('$cordovaPush').onNotification
多亏了这个ionic forum entry
请从 ng-cordova-master\dist\ng-cordova.js
中的 http://ngcordova.com/docs/install/ 更新 lib/ng-cordova.js 中的 ng-cordova.js
我一直在关注 this sample 以获得在 android 模拟器上运行的 android pushNotifications(使用 GCM)。
在 $cordovaPush.register(config)
之后,我得到 Ok 作为响应。但它从不运行我的回调 [$scope.$on('$cordovaPush:notificationReceived'
]。
结果我从来没有得到我的注册 ID。
我创建了一个 google API 项目。我在调用 $cordovaPush.register(config)
.
我还在我的模拟器中注册了一个 gmail 帐户。
我想我有 2 个问题。
1.Is 可以在 android 模拟器上获取(并注册)推送通知吗?
为什么我没有收到调用回调的 $cordovaPush:notificationReceived 事件?
app.controller('AppCtrl', 函数($scope, $cordovaPush, $cordovaDialogs, $cordovaMedia, $cordovaToast, ionPlatform, $http) { $scope.notifications = [];
// call to register automatically upon device ready ionPlatform.ready.then(function (device) { $scope.register(); }); // Register $scope.register = function () { var config = null; if (ionic.Platform.isAndroid()) { config = { "senderID": "12834957xxxx" }; } $cordovaPush.register(config).then(function (result) { console.log("Register success " + result); $cordovaToast.showShortCenter('Registered for push notifications'); $scope.registerDisabled=true; }, function (err) { console.log("Register error " + err) }); } $scope.$on('$cordovaPush:notificationReceived', function (event, notification) { console.log(JSON.stringify([notification])); if (ionic.Platform.isAndroid()) { handleAndroid(notification); } }); // Android Notification Received Handler function handleAndroid(notification) { // ** NOTE: ** You could add code for when app is in foreground or not, or coming from coldstart here too // via the console fields as shown. console.log("In foreground " + notification.foreground + " Coldstart " + notification.coldstart); if (notification.event == "registered") { $scope.regId = notification.regid; storeDeviceToken("android"); } else if (notification.event == "message") { $cordovaDialogs.alert(notification.message, "Push Notification Received"); $scope.$apply(function () { $scope.notifications.push(JSON.stringify(notification.message)); }) } else if (notification.event == "error") $cordovaDialogs.alert(notification.msg, "Push notification error event"); else $cordovaDialogs.alert(notification.event, "Push notification handler - Unprocessed Event"); }
我也遇到了同样的问题。已在 ngCordova github 中报告,但尚未回复。
我设法修复了它。我知道如果您使用 angular 这不是一个好的解决方案,但这是我能够捕获寄存器 ID 的唯一方法。
在配置对象中,您必须指定
'ecb'
:var androidConfig = { "senderID": "388573974286", "ecb": "function_to_be_called" };
控制器外函数:
window.function_to_be_called = function (notification) {
switch(notification.event) {
case 'registered':
if (notification.regid.length > 0 ) {
alert('registration ID = ' + notification.regid);
}
break;
case 'message':
// this is the actual push notification. its format depends on the data model from the push server
alert('message = ' + notification.message + ' msgCount = ' + notification.msgcnt);
break;
case 'error':
alert('GCM error = ' + notification.msg);
break;
default:
alert('An unknown GCM event has occurred');
break;
}
};
修复比看起来简单得多。 我从:
$scope.$on('$cordovaPush:notificationReceived', function (event, notification) {
至:
$scope.$on('pushNotificationReceived', function (event, notification) {
而 debugging 我在 ng-cordova.js 上注意到了这一点:
angular.module('ngCordova.plugins.push', [])
.factory('$cordovaPush', ['$q', '$window', '$rootScope', function ($q, $window, $rootScope) {
return {
onNotification: function (notification) {
$rootScope.$apply(function () {
$rootScope.$broadcast('pushNotificationReceived', notification);
});
},
这意味着它正在为 'pushNotificationReceived' 进行广播。不是 'notificationReceived' 而是 documented.
即使你按照你说的更新事件名称,我还有另一个问题,它说:processmessage failed: message: jjavascript:angular.element(document.queryselector('[ng-app]')).injector().get('$cordovapush').onnotification({"event":"registered"
...
当 angular 找不到 'ng-app' 并且 returns 'undefined' angular.element(document.querySelector('[ng-app]'))
所以要解决这个问题,您可以像这样手动设置“ecb
”:
angular.element(document.body).injector().get('$cordovaPush').onNotification
多亏了这个ionic forum entry
请从 ng-cordova-master\dist\ng-cordova.js
中的 http://ngcordova.com/docs/install/ 更新 lib/ng-cordova.js 中的 ng-cordova.js