Как да се справя с 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;
    }
}

Така че всичко работи.

  • когато приложението е на преден план, получавам предупреждение.

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

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

Но когато запазя приложението на заден план и когато пристигне насочено известие, без да щракам върху известието, когато преместя приложението на предния план, не получавам предупреждение. И така, как да се справя с този тип ситуация?


person Anuj.T    schedule 23.03.2015    source източник
comment
Благодаря, Ajoy, направих всичко възможно да обясня проблема. Все пак ще отбележа предложението ти.   -  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