1

У меня есть мое устройство Android, оптимизирующее мое приложение. Поэтому мое приложение спит в фоновом режиме, но оно должно проснуться, если получено сообщение GCM приоритета. As staten here:Сообщение о приоритете GCM не пробуждает мое приложение

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

и here:

GCM оптимизирован для работы с дремоты и приложение резервных холостых режимах при помощи высокого приоритета сообщений ГКМ. Высокоприоритетные сообщения GCM позволяют надежно разбудить ваше приложение для доступа к сети, даже если устройство пользователя находится в режиме «Доза» или приложение находится в режиме ожидания приложения. В Doze или App В режиме ожидания система отправляет сообщение и предоставляет приложению временный доступ к сетевым службам и частичным wakelocks, затем возвращает устройство или приложение в состояние ожидания.

Я использую этот код для отправки приоритетных сообщений от моего 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. Любая помощь?

+0

Я нашел кого-то, у кого была моя проблема: http://developer.samsung.com/forum/board/thread/view.do?boardName=General&messageId=286651&frm=7&tagValue=smartmanager&curPage=1 – Ton

ответ

1

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

+0

Спасибо. Не могли бы вы указать любую ссылку, в которой говорится об этом? – Ton

+0

Посмотрите на справочные документы, ссылка на обычный текст не включает параметр приоритета. https://developers.google.com/cloud-messaging/http-server-ref#send-downstream –

+0

Ну, я не знаю, смотрю ли я не туда, но вижу, что в протоколы (протокол HTTP и протокол XMPP) – Ton

Смежные вопросы