防止每次推送通知被执行iOS钛

时间:2014-06-24 23:08:58

标签: ios iphone notifications titanium titanium-alloy

如果我在应用程序处于前台时收到多个推送通知。回调方法将逐个执行每个推送通知。

        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次通知时失败。

2 个答案:

答案 0 :(得分:0)

您可以使用inBackground检查前景或背景中是否收到了Push这里的推送属性是 documentation

希望它有所帮助。

答案 1 :(得分:0)

我没有获得Titanium经验来为您提供实际代码,但这是您需要采取的方法:

  1. 收到通知后,检查(全局)布尔值receivedNotification是否为假
  2. 如果为false,则将其设置为true,将事件存储到全局中,并安排setTimeout函数(例如3秒)来处理事件并将receivedNotification重置为false
  3. 如果receivedNotification为真,请将全局事件更新为较新的通知
  4. 在通过计时器触发的流程事件方法中,您将执行当前在代码的第一部分中执行的操作。

    这将确保在收到事件后不超过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;
     }