Как обрабатывать Push-уведомления при возобновлении работы приложения?

Попытка обработать push-уведомление с помощью 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;
    }
}

Итак, все работает.

  • когда приложение находится на переднем плане, я получаю предупреждение.

  • когда щелкнуть уведомление, когда сообщение получено, приложение открывается, и я получаю предупреждение (холодный запуск)

  • когда приложение находится в фоновом режиме, а затем щелкает уведомление, приложение выходит на передний план, и я получаю предупреждение.

Но когда я держу приложение в фоновом режиме и когда приходит push-уведомление, не нажимая на уведомление, когда я вывожу приложение на передний план, я не получаю оповещения. Итак, как справиться с такой ситуацией?


person Anuj.T    schedule 23.03.2015    source источник
comment
Спасибо, Аджой, я изо всех сил старался объяснить проблему. Однако я приму к сведению ваше предложение.   -  person Anuj.T    schedule 07.04.2015


Ответы (2)


Я столкнулся с той же проблемой. Проще говоря, PushPlugin сейчас не поддерживает эту функцию. Но вы можете очень легко изменить его в соответствии с вашими потребностями.

Как это работает сейчас

Когда GCMIntentService плагина получает сообщение, onMessage. Этот метод извлекает все переданные ему дополнительные параметры, сохраняя их в extras. После этого, если приложение находится на переднем плане, эта функция просто передает вам extras, вызывая sendExtras. В противном случае он вызывает createNotification, что фактически создает уведомление в строке состояния.

Ваша проблема

Из того, что я понял из вашего вопроса, предупреждение не получено, если после получения уведомления в строке состояния вы открываете свое приложение, не касаясь уведомления.

Вот что происходит:

  1. GCMIntentService получает сообщение
  2. Поскольку ваше приложение находится в background, PushPlugin вызывает createNotification
  3. Когда вы запускаете свое приложение, оно не получает оповещения, потому что вы еще не коснулись уведомления в строке состояния.

Вы бы получили предупреждение, если бы коснулись уведомления, потому что тогда намерение уведомления разбудило бы ваше приложение. Когда ваше приложение просыпается, оно ищет кэшированные дополнения, а затем передает их вашему приложению, снова вызывая 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);
    }
}
person Ajoy    schedule 03.04.2015
comment
Спасибо за ответ Ajoy, это работает Можете ли вы помочь мне сделать то же самое в IOS? - person Anuj.T; 07.04.2015
comment
@AJ-- Извините, что заставил вас ждать. Я пытался понять код, но пока не смог. Как насчет того, чтобы обсудить это вместе в чате? - person Ajoy; 16.04.2015
comment
На самом деле я ничего не знаю об iOS. Так что обсуждение не будет полезным, сэр. В любом случае, я ищу решение в iOS. Если я его найду, я опубликую его здесь. - person Anuj.T; 16.04.2015

Когда приложение находится в фоновом режиме, возможно, вам нужно сохранить данные воспроизведения уведомления в localStorage, а затем в событии resume приложения прочитать его из localStorage и показать предупреждающее сообщение.

Вот ссылка с похожей проблемой

person Carlos Mayo    schedule 01.09.2015