Android GCM отправлен успешно, но не принят на некоторых устройствах
На стороне сервера я использую библиотеку 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. Кроме того, мой метод значительно разрядит батарею.
Любое предложение?
Ответы
Ответ 1
- Убедитесь, что вы правильно установили
SENDER ID
, который вы получили от Google.
- Убедитесь, что ваше устройство зарегистрировано в сервисе Google GCM правильно.
- Убедитесь, что вы отправляете push к правильному регистровому идентификатору, который вы получили от Google. и что вы не получили сообщение об ошибке в сервисе Google GCM.
- Установили ли вы
delay_while_idle = 1
? Это означает, что сообщение не дойдет до устройства, если он простаивает (выключен, отключен, заблокирован экран и т.д.). Измените его на delay_while_idle = 0
, если вы хотите, чтобы ваше разрешение Wakelock имело какое-либо значение. Пожалуйста, прочитайте здесь.
- Несколько раз требуется время для поступления (но не слишком много времени, тогда есть проблема). Проверьте, что "время жить" от нажатия, которое вы отправили.
Ответ 2
У вас есть правильная версия Playstore для получения уведомления?
Вы зарегистрированы с помощью функциональной учетной записи Google на этих устройствах?
У меня также была проблема, когда я "принудительно останавливаю" приложение, вы не можете получать уведомления в любом приложении после "принудительной остановки" (начиная с android 3.1), поэтому будьте осторожны с этим.
Ответ 3
Если вы используете Wi-Fi, возможно, интернет-брандмауэр блокирует gcm. попробуйте использовать интернет со своей мобильной сим-картой.
Ответ 4
Контрольный список
- Убедитесь, что в Google Play Store обновлена последняя версия.
- Удостоверьтесь, что нет системных настроек уведомлений, которые блокируют
- Зайдите в приложение в Диспетчере приложений и снимите флажок "Уведомления"
- Если на Wi-Fi, переключите Wifi-соединение на другую точку доступа (если возможно)
- Перезагрузите устройство.
- Установите 'Push Notification Fixer' (установите это в любом случае)
Первоначальная установка уведомлений может быть досадливо произвольной и требует, чтобы устройство было "ногами" одним или несколькими из этих способов.