应用程序恢复后如何处理推送通知?

时间:2015-03-23 06:26:28

标签: cordova push-notification phonegap-plugins phonegap-pushplugin

尝试使用PushPlugin处理推送通知。 以下是我的代码。

onNotificationGCM: function(e) {
    switch( e.event )
    {
        case 'registered':
            if ( e.regid.length > 0 )
            {
                console.log("Regid " + e.regid);
                //alert('registration id = '+e.regid);
                sDeviceId = e.regid;
                //alert(sDeviceId);
            }
            break;

        case 'message':
            // this is the actual push notification. its format depends on the data model from the push server
            alert('message = '+e.message);
            alert('message = '+e.message+' msgcnt = '+e.msgcnt);
            if ( e.foreground )
            {
                alert("Notification Received");

            }
            else
            {  // otherwise we were launched because the user touched a notification in the notification tray.
                if ( e.coldstart )
                {
                    alert("coldstart");
                }
                else
                {
                    alert("other than coldstart");
                }
            }
            break;

        case 'error':
            alert('GCM error = '+e.msg);
            break;

        default:
            alert('An unknown GCM event has occurred');
            break;
    }
}

所以一切正常。

  • 当应用程序在前台时,我收到警报。

  • 在收到消息时单击通知应用程序    打开,我收到警报。(冷启动)

  • 当应用程序在后台然后单击时 通知应用程序进入前台,我得到了 警报。

但是当我将应用程序保留到后台并且当我将应用程序带到前面而没有点击通知时推送通知到达时我没有得到警报。那么如何处理这种情况呢?

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。简而言之,PushPlugin现在不支持此功能。但您可以非常轻松地修改它以满足您的需求

现在如何运作

当插件的GCMIntentService收到消息时,会调用onMessage。此方法获取传递给它的所有其他参数,并将其保存在extras中。在此之后,如果应用程序位于前台,此功能只需通过调用extrassendExtras传递给您。否则,它会调用createNotification,实际上会在状态栏中创建通知。

您的问题

根据我从您的问题中了解到的情况,如果在状态栏中收到通知后您打开应用而未触及通知,则不会收到提醒。

这就是:

  1. GCMIntentService收到消息
  2. 由于您的应用位于background,因此PushPlugin会调用createNotification
  3. 当您启动应用时,它没有提醒,因为您尚未触及状态栏中的通知
  4. 如果您触摸了通知,则会收到警报,因为通知意图会唤醒您的应用。当您的应用程序醒来时,它会查找cached extras,然后再次调用sendExtras将其传递到您的应用。

    解决方案

    我还没有对此进行过测试,但我坚信,如果您编辑插件,在致电sendExtras之前(或之后)createNotification,则会为您的应用程序缓存数据,而不管是否触摸通知或将其滑动。

    protected void onMessage(Context context, Intent intent) {
        Log.d(TAG, "onMessage - context: " + context);
        // Extract the payload from the message
        Bundle extras = intent.getExtras();
        if (extras != null)
        {
            // if we are in the foreground, just surface the payload, else post it to the statusbar
            if (PushPlugin.isInForeground()) {
                extras.putBoolean("foreground", true);
                PushPlugin.sendExtras(extras);
            }
            else {
                extras.putBoolean("foreground", false);
                // Send a notification if there is a message
                if (extras.getString("message") != null && extras.getString("message").length() != 0) {
                    createNotification(context, extras);
                }
            }
        }
    }
    

    将上述部分修改为:

    protected void onMessage(Context context, Intent intent) {
        Log.d(TAG, "onMessage - context: " + context);
        Bundle extras = intent.getExtras();
        if (extras != null)
        {
            if (PushPlugin.isInForeground()) {
                extras.putBoolean("foreground", true);
            }
            else {
                extras.putBoolean("foreground", false);
                if (extras.getString("message") != null && extras.getString("message").length() != 0) {
                    createNotification(context, extras);
                }
            }
            // call sendExtras always
            PushPlugin.sendExtras(extras);
        }
    }
    

答案 1 :(得分:1)

当应用程序在后台时,您可能需要将通知playload保存到 localStorage ,然后在应用程序的 resume 事件中从中读取它localStorage 并显示警告消息。

这是link with a similar problem