Приоритетное сообщение 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://stackru.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://stackru.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. Любая помощь?
1 ответ
Простой текстовый формат не поддерживает приоритет сообщений. Вам нужно использовать формат application/json, чтобы использовать поле приоритета.