Сообщение о приоритете GCM не вызывает пробуждение моего приложения

У меня есть устройство Android, оптимизирующее приложение. Итак, мое приложение спит в фоновом режиме, но оно должно проснуться, если получено приоритетное сообщение GCM. Как указано здесь:

Высокий приоритет. GCM пытается немедленно доставлять сообщения с высоким приоритетом, позволяя службе GCM разбудить спящее устройство, когда это возможно, и открыть сетевое соединение с вашим сервером приложений. Например, приложениям с мгновенным обменом сообщениями, чатом или оповещениями о голосовых вызовах обычно требуется открыть сетевое соединение и убедиться, что GCM доставляет сообщение на устройство без задержки.

и здесь:

GCM оптимизирован для работы с режимами ожидания Doze и App Standby с помощью высокоприоритетных сообщений GCM. Сообщения с высоким приоритетом GCM позволяют надежно разбудить ваше приложение для доступа к сети, даже если устройство пользователя находится в режиме ожидания или приложение находится в режиме ожидания приложения. В режиме ожидания или ожидания приложения система доставляет сообщение и предоставляет приложению временный доступ к сетевым службам и частичной блокировке пробуждения, а затем возвращает устройство или приложение в состояние ожидания.

Я использую этот код для отправки приоритетных сообщений с моего сервера C # на устройства Android:

private string SendMessageUsingGCM(String sRegistrationId, string sTextToSend, string sCollapseKey)
{
    String GCM_URL = @"https://gcm-http.googleapis.com/gcm/send";
    bool flag = false;
    string sError = "";

    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("registration_id={0}&collapse_key={1}", sRegistrationId, sCollapseKey);
    sb.AppendFormat("&delay_while_idle=0&priority=high");
    sb.AppendFormat("&data.msg=" + HttpUtility.UrlEncode(sTextToSend));  //Para poder enviar caracteres especiales como ä, ë, arábigos...
    string msg = sb.ToString();

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(GCM_URL);
    req.Method = "POST";
    req.ContentLength = msg.Length;
    req.ContentType = "application/x-www-form-urlencoded";
    req.Timeout = 20000;

    req.Headers.Add("Authorization:key=" + MyAthorizationKey);

    try
    {
        using (StreamWriter oWriter = new StreamWriter(req.GetRequestStream()))
        {
            oWriter.Write(msg);
        }

        using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
        {
            using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
            {
                string respData = sr.ReadToEnd();

                if (resp.StatusCode == HttpStatusCode.OK)   // OK = 200
                {
                    if (respData.StartsWith("id="))
                        flag = true;
                    else
                        sError = respData;
                }
                else if (resp.StatusCode == HttpStatusCode.InternalServerError)   // 500
                    sError = "Internal server error. Try later.";
                else if (resp.StatusCode == HttpStatusCode.ServiceUnavailable)    // 503
                    sError = "Server not available temnporatily. Try later.";
                else if (resp.StatusCode == HttpStatusCode.Unauthorized)          // 401
                    sError = "The API Key is not valid.";
                else
                    sError = "Error: " + resp.StatusCode;
            }
        }
    }
    catch (WebException e)
    {   //The remote server returned an error: (502) Bad Gateway. //Más info: http://stackoverflow.com/questions/2159361/error-502-bad-gateway-when-sending-a-request-with-httpwebrequest-over-ssl
        //The remote server returned an error: (500) Internal Server Error. Más info: http://stackoverflow.com/questions/4098945/500-internal-server-error-at-getresponse
        sError = "WebException: " + e.ToString();
    }
    catch (Exception e)
    {
        sError = "Exception: " + e.ToString();
    }


    if (flag == true)
        return "Ok";

    return "Error " + sError;
}

Но мое приложение не просыпается. Даже если я разблокирую устройство.

Я обнаружил, что как только мое устройство «блокирует» мое приложение из-за того, что оно находится в оптимизированном списке, мое приложение больше не будет получать сообщения. Похоже, что система просто полностью убивает приложение и не получит никаких сообщений GCM. Я использую Galaxy S4 с Lollipop. Любая помощь?


person Ton    schedule 14.03.2016    source источник
comment
Я нашел здесь кого-то, у кого такая же проблема: developer.samsung.com/forum/board/thread/   -  person Ton    schedule 14.03.2016


Ответы (1)


Формат обычного текста не поддерживает приоритет сообщений. Для использования поля приоритета необходимо использовать формат application / json.

person Arthur Thompson    schedule 15.03.2016
comment
Спасибо. Не могли бы вы предоставить ссылку, в которой говорится об этом? - person Ton; 15.03.2016
comment
Посмотрите справочную документацию, текстовая ссылка не включает параметр приоритета. developers.google.com/cloud-messaging/ - person Arthur Thompson; 15.03.2016
comment
Ну, я не знаю, смотрю ли я не в том месте, но я вижу поле приоритета в обоих протоколах (протокол HTTP и протокол XMPP) - person Ton; 15.03.2016
comment
Ой, извини. Я только что узнал, что есть 3 способа. 1: сообщения HTTP в нисходящем направлении (JSON). 2: сообщения HTTP в нисходящем направлении (обычный текст). 3: сообщения XMPP в нисходящем направлении (JSON). Думаю, я использую номер 2, и это единственный, который не допускает приоритета (мне не повезло), и я также не могу найти в сети четкий и простой пример для номера 1 - person Ton; 15.03.2016