На стороне сервера я использую библиотеку GCM server 1.0.2, предоставляемую Google. На стороне клиента я настроил GCM, как указано в официальной документации .
Моя проблема в том, что все работает отлично на большинстве устройств, но на нескольких устройствах push не получают.
if (case1)
message = new Message.Builder()
.timeToLive(0)
.collapseKey("0")
.delayWhileIdle(false)
.addData("msg", msg).build();
else if (case2)
message = new Message.Builder()
.collapseKey("2")
.addData("msg", msg).build();
else
message = new Message.Builder().addData("msg", msg).build();
Result result = sender.sendNoRetry(message, regId);
System.out.println("Message ID:"+result.getMessageId());
System.out.println("Failed:" + result.getErrorCodeName());
Из того, что я вижу из тестов с указанным выше кодом, ошибок нет. Идентификатор сообщения присутствует, но кодовое имя ошибки равно null (что является признаком успешного нажатия).
Я пробовал почти все настройки. Протестировано с TTL, клавишей свернуть, задержка при включении и выключении простоя.
Каковы некоторые случаи, которые могут вызвать блокировку (?) GCM push? И как я могу это решить?
ИЗМЕНИТЬ
Я понятия не имею, почему, но временное решение ниже решило мою проблему.
В GcmIntentService # onHandleIntent просто удалите
GcmBroadcastReceiver.completeWakefulIntent(intent);
Эта строка освобождает бодрствование. Мне любопытно, потому что на других устройствах push-сообщения отправляются непрерывно, даже если эта строка не была удалена.
Это не решение, потому что этот документ утверждает, что после каждой работы я должен называть completeWakeFulIntent. Кроме того, мой метод значительно разрядит батарею.
Любое предложение?