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

How to handle Push notification when application is resumed?

正在尝试使用 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;
    }
}

一切正常。

但是当我将应用程序保持在后台并且当我将应用程序置于最前面时推送通知到达而没有单击通知时我没有alert.So如何处理这种情况?

我遇到了同样的问题。简单的说,PushPlugin现在不支持这个功能。但是你可以很容易地修改它以满足你的需要

现在如何运作

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

你的问题

根据我从你的问题中了解到的情况,如果在状态栏中收到通知后,你打开你的应用程序而没有触及通知,则不会收到警报。

事情是这样的:

  1. GCMIntentService 收到消息
  2. 由于您的应用在 background,PushPlugin 调用 createNotification
  3. 当您启动您的应用程序时,它不会收到任何提醒,因为您还没有触摸状态栏中的通知

如果您触摸了通知,您就会收到警报,因为通知意图会唤醒您的应用程序。当您的应用程序唤醒时,它会查找 cached extras,然后通过再次调用 sendExtras.

将它们传递给您的应用程序

解决方法

我还没有测试过这个,但我坚信如果你编辑你的插件,在你调用 createNotification 之前(或之后)sendExtras,数据将为你的应用程序缓存无论您是触摸通知还是将其滑开。

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);
    }
}

当应用程序处于后台时,您可能需要将通知播放量保存到 localStorage,然后在 resume 事件中该应用程序从 localStorage 读取它并显示警报消息。

这是一个link with a similar problem