如果我在应用程序处于前台时收到多个推送通知。回调方法将逐个执行每个推送通知。
callback : function(e) {
if (e.inBackground == 1) {
//came from background - do something.
} else {
// Titanium.UI.iPhone.setAppBadge(null);
//check type, if it is chat.
if (type == 'chat') {
//check if window is already opened or not, if so fire event handler
if (currentWindow == '_chatWindow') {
//update view directly after entering app from the background. Fire event handler
Ti.App.fireEvent('_updateChat', {});
} else if (currentWindow == '_messages') {
//refresh messages screen if on messages screen and chat message arrives
//update view directly after entering app from the background. Fire event handler
Ti.App.fireEvent('_updateMessages', {});
} else {
//display local notification
}
}
如果推送通知来自后台,则很容易处理,因为激活的推送通知是用户选择刷卡的通知。但是,如果多个推送通知进入前台并说出它的聊天,它将多次执行它们。
如何更好地处理前台推送通知?感谢
更新
尝试此代码没有太多运气
Ti.App.addEventListener('_displayNotification', function(e) {
//store all push notifications in array
var pushArray = [];
var countPushNotifications;
//currentTime to cross reference
var currentTime = new Date();
if (currentTime - Alloy.Globals.pushTime < 3000) {
//do something
pushArray.add(e.PushNotificationData);
} else {
//after 3 seconds remove event handler
//fire event to filter array and process notification, reset time for next event
Alloy.Globals.pushTime = null;
Ti.App.removeEventListener('_displayNotification', {});
}
//first push notification, will be the current time
if(Alloy.Globals.pushTime==null){
Alloy.Globals.pushTime = currentTime;
}
});
尝试在阵列中获取所有推送通知,以便进一步过滤。
更新2:
if (Alloy.Globals.countPushNotificationsFlag == 1) {
Alloy.Globals.countPushNotificationsFlag = null;
setTimeout(function() {
Ti.App.fireEvent('_displayNotification', {
PushMessage : message
});
}, 6000);
} else {
Alloy.Globals.countPushNotificationsFlag = 1;
Ti.App.fireEvent('_displayNotification', {
PushMessage : message
});
}
我试图替代执行推送通知。
第1次通知 - 立即触发。 第二次通知 - 6秒后开火。 第3次通知 - 即时。 第4次通知 - 6秒后开火。
依旧......
但是代码仅适用于
通知1和2.
点击第3次通知时失败。
答案 0 :(得分:0)
您可以使用inBackground检查前景或背景中是否收到了Push这里的推送属性是 documentation
希望它有所帮助。
答案 1 :(得分:0)
我没有获得Titanium经验来为您提供实际代码,但这是您需要采取的方法:
receivedNotification
是否为假setTimeout
函数(例如3秒)来处理事件并将receivedNotification
重置为false receivedNotification
为真,请将全局事件更新为较新的通知在通过计时器触发的流程事件方法中,您将执行当前在代码的第一部分中执行的操作。
这将确保在收到事件后不超过3秒处理事件,并且最多每3秒钟处理一次事件。
您的代码看起来非常接近,除非您尝试立即触发第一个事件,然后在延迟后触发后续事件。不幸的是,我不相信这是可能的,因为你无法看到是否有立即排队的事件。我认为你总是要承担延迟,但是你可以调整延迟以在响应性和减少的API调用之间找到平衡 -
if (Alloy.Globals.countPushNotificationsFlag == null) {
Alloy.Globals.countPushNotificationsFlag = 1;
Alloy.Globals.messageToPush=message;
setTimeout(function() {
Alloy.Globals.countPushNotificationsFlag = null;
Ti.App.fireEvent('_displayNotification', {
PushMessage : Alloy.Globals.messageToPush
});
}, 3000);
}
else {
Alloy.Globals.messageToPush=message;
}