我尝试使用pushNotification注册我的设备,使用演示。 它不起作用。打印" Cordova PushNotification插件演示"和#34;注册android"然后看警报" OK" (successHandler函数有效)。问题是不能使用" ecb"。为什么?你能救我吗?
我与Cordova一起安装的插件有:PushPlugin,Device,Notification,InAppBrowser和Network Information。
我已经在我的LG L9和模拟器上试过了这款应用。同样的问题。
这是代码:
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8" src="jquery_1.5.2.min.js"></script>
<script type="text/javascript" src="PushNotification.js"></script>
<script type="text/javascript">
var pushNotification;
document.addEventListener("deviceready", onDeviceReady, false);
// device APIs are available
function onDeviceReady() {
pushNotification = window.plugins.pushNotification;
if (device.platform == 'android' || device.platform == 'Android') {
$("#app-status-ul").append("<li>registering android</li>");
window.plugins.pushNotification.register(successHandler, errorHandler, {
"senderID": "my_id",
"ecb": "onNotificationGCM"
}); // required!
} else {
$("#app-status-ul").append("<li>registering iOS</li>");
pushNotification.register(tokenHandler, errorHandler, {
"badge": "true",
"sound": "true",
"alert": "true",
"ecb": "onNotificationAPN"
}); // required!
}
}
// handle APNS notifications for iOS
function onNotificationAPN(e) {
if (e.alert) {
navigator.notification.alert(e.alert);
}
if (e.sound) {
var snd = new Media(e.sound);
snd.play();
}
if (e.badge) {
pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);
}
}
// handle GCM notifications for Android
function onNotificationGCM(e) {
navigator.notification.alert(e.event);
switch (e.event) {
case 'registered':
if (e.regid.length > 0) {
navigator.notification.alert(e.regid);
// Your GCM push server needs to know the regID before it can push to this device
// here is where you might want to send it the regID for later use.
$("#app-status-ul").append("<li>regID = " + e.regid +"</li>");
sessionStorage.setItem("deviceId",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) {
navigator.notification.alert('--INLINE NOTIFICATION--');
// if the notification contains a soundname, play it.
var my_media = new Media("/android_asset/www/" + e.soundname);
my_media.play();
} else { // otherwise we were launched because the user touched a notification in the notification tray.
if (e.coldstart) navigator.notification.alert('--COLDSTART NOTIFICATION--');
else navigator.notification.alert('--BACKGROUND NOTIFICATION--');
}
navigator.notification.alert(e.payload.message);
navigator.notification.alert('MESSAGE -> MSGCNT: ' + e.payload.msgcnt);
break;
case 'error':
navigator.notification.alert('ERROR -> MSG:' + e.msg);
break;
default:
navigator.notification.alert('EVENT -> Unknown, an event was received and we do not know what it is');
break;
}
}
function tokenHandler(result) {
navigator.notification.alert(result, null, 'Alert', 'OK');
sessionStorage.setItem("deviceId", result);
sessionStorage.setItem("notificationServer", "APNS");
// Your iOS push server needs to know the token before it can push to this device
// here is where you might want to send it the token for later use.
}
function successHandler(result) {
navigator.notification.alert(result, null, 'Alert', 'OK');
sessionStorage.setItem("deviceId", result);
sessionStorage.setItem("notificationServer", "GCM");
}
function errorHandler(error) {
navigator.notification.alert(error, null, 'Alert', 'OK');
}
document.addEventListener('deviceready', onDeviceReady, true);
</script>
<div id="home">
<div id="app-status-div">
<ul id="app-status-ul">
<li>Cordova PushNotification Plugin Demo</li>
</ul>
</div>
</div>
答案 0 :(得分:6)
正如Hanh Le所说,你需要从窗口对象中访问ecb-callback
喜欢这个
pushNotification.register(tokenHandler, errorHandler, {
"badge": "true",
"sound": "true",
"alert": "true",
"ecb": "window.onNotificationAPN"
}); // required!
然后替换
function onNotificationAPN(e) {
带
window.onNotificationAPN = function(e) {
编辑:以下是您认为应该以我认为应该运作的方式编辑的整个代码:
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8" src="jquery_1.5.2.min.js"></script>
<script type="text/javascript" src="PushNotification.js"></script>
<script type="text/javascript">
var pushNotification;
document.addEventListener("deviceready", onDeviceReady, false);
// device APIs are available
function onDeviceReady() {
pushNotification = window.plugins.pushNotification;
if (device.platform == 'android' || device.platform == 'Android') {
$("#app-status-ul").append("<li>registering android</li>");
pushNotification.register(successHandler, errorHandler, {
"senderID": "my_id",
"ecb": "window.onNotificationGCM"
}); // required!
} else {
$("#app-status-ul").append("<li>registering iOS</li>");
pushNotification.register(tokenHandler, errorHandler, {
"badge": "true",
"sound": "true",
"alert": "true",
"ecb": "window.onNotificationAPN"
}); // required!
}
}
// handle APNS notifications for iOS
window.onNotificationAPN = function(e) {
if (e.alert) {
navigator.notification.alert(e.alert);
}
if (e.sound) {
var snd = new Media(e.sound);
snd.play();
}
if (e.badge) {
pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);
}
}
// handle GCM notifications for Android
window.onNotificationGCM = function(e) {
navigator.notification.alert(e.event);
switch (e.event) {
case 'registered':
if (e.regid.length > 0) {
navigator.notification.alert(e.regid);
// Your GCM push server needs to know the regID before it can push to this device
// here is where you might want to send it the regID for later use.
$("#app-status-ul").append("<li>regID = " + e.regid +"</li>");
sessionStorage.setItem("deviceId",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) {
navigator.notification.alert('--INLINE NOTIFICATION--');
// if the notification contains a soundname, play it.
var my_media = new Media("/android_asset/www/" + e.soundname);
my_media.play();
} else { // otherwise we were launched because the user touched a notification in the notification tray.
if (e.coldstart) navigator.notification.alert('--COLDSTART NOTIFICATION--');
else navigator.notification.alert('--BACKGROUND NOTIFICATION--');
}
navigator.notification.alert(e.payload.message);
navigator.notification.alert('MESSAGE -> MSGCNT: ' + e.payload.msgcnt);
break;
case 'error':
navigator.notification.alert('ERROR -> MSG:' + e.msg);
break;
default:
navigator.notification.alert('EVENT -> Unknown, an event was received and we do not know what it is');
break;
}
}
function tokenHandler(result) {
navigator.notification.alert(result, null, 'Alert', 'OK');
sessionStorage.setItem("deviceId", result);
sessionStorage.setItem("notificationServer", "APNS");
// Your iOS push server needs to know the token before it can push to this device
// here is where you might want to send it the token for later use.
}
function successHandler(result) {
navigator.notification.alert(result, null, 'Alert', 'OK');
sessionStorage.setItem("deviceId", result);
sessionStorage.setItem("notificationServer", "GCM");
}
function errorHandler(error) {
navigator.notification.alert(error, null, 'Alert', 'OK');
}
document.addEventListener('deviceready', onDeviceReady, true);
</script>
<div id="home">
<div id="app-status-div">
<ul id="app-status-ul">
<li>Cordova PushNotification Plugin Demo</li>
</ul>
</div>
</div>
答案 1 :(得分:0)
您可以将onNotificationGCM
功能放在控制器之外。这是最适合我的解决方案。
push.js
onNotificationGCM
功能粘贴到push.js
内,而不使用任何angularjs API,例如angular.module
或.controller
答案 2 :(得分:0)
我已经找到了适用于iOS的解决方案。出现此问题的原因是PushPlugin.m
callback
属性在杀死应用时设置为nil
。因此,- (void)notificationReceived
回调中的line#202检查不满意。该问题的解决方法是在每次应用启动时打开推送通知时实例化PushPlugin
类。这可以通过在app start上注册推送通知插件来完成。
每次应用程序启动时调用javascript中的pushNotification.register
方法,这将实例化插件并分配相应的callback
插件。我已将以下代码添加到我的Ionic
应用的app.run()
部分
window.plugins.pushNotification.register(successCallback, errorCallback, {
badge: 'true',
sound: 'true',
alert: 'true',
ecb: 'window.onNotificationAPN'})