Pull to refresh

Comments 4

Урок №1: Будьте готовы часто получать SERVICE_NOT_AVAILABLE

А что в данном случае возвращает GooglePlayServicesUtil.isGooglePlayServicesAvailable(context)?
Может сервисы не доступны или не обновлены?

Урок №2: Будьте готовы к повторяющимся ошибкам вызова register, даже если рабочий registration ID создан

Вы о чем? Механизм с получением registartionID через broadcat использовался с с2dm, в GCM его возвращает сразу метод.

или пользователь делает сброс к заводским установкам (factory reset)

если пользователь делает factory reset ваше приложение удаляется, оО.

На этом все. Печально, что для того, что бы обеспечить бесперебойную работу GCM, пришлось идти на подобные «танцы с бубном» и еще печальней, что большинство этих моментов совершенно не документированы самим Google.

Если не читать документацию и делать абы как, то да действительно не будет работать.
Если следовать документации, все прекрасно работает, как ни странно.
А что в данном случае возвращает GooglePlayServicesUtil.isGooglePlayServicesAvailable(context)?
Может сервисы не доступны или не обновлены?
Насколько я понимаю, этот метод проверяет наличие установленного в системе пакета Google Play Services и его версию, а не факт доступности подключения.
Только что проверил его работу, отключив работу 3G и WiFi сразу перед вызовом isGooglePlayServicesAvailable — результат ConnectionResult.SUCCESS.

Вы о чем? Механизм с получением registartionID через broadcat использовался с с2dm, в GCM его возвращает сразу метод.
Большей частью эта ошибка преследует тех, кто до сих пор использует c2dm, тем не менее, согласно документации метод public String register (String… senderIds) throws IOException, таким образом в случае ошибок связи с гугловыми сервисами будет выбрасываться именно исключение, в статье же приводится альтернативная попытка получения registartion ID

если пользователь делает factory reset ваше приложение удаляется, оО.
Согласен, этот кейс тут приведен скорее как один из теоретических примеров, когда может измениться Android ID.
Что не отменяет случая с обновлением прошивки телефона без потери установленного софта. Изменил формулировку в статье.
Насколько я понимаю, этот метод проверяет наличие установленного в системе пакета Google Play Services и его версию, а не факт доступности подключения.
Только что проверил его работу, отключив работу 3G и WiFi сразу перед вызовом isGooglePlayServicesAvailable — результат ConnectionResult.SUCCESS.

Этот метод проверяет не только установлены или нет, а также актуальная ли версия, не отключены ли сервисы в системе. Если статус отличный от ConnectionResult.SUCCESS, то вы однозначно не сможете воспользоватся пушами.

Большей частью эта ошибка преследует тех, кто до сих пор использует c2dm

А зачем использовать c2dm, если он уже немалое время deprecated? Понятное дело, что вы с ним будете испытывать проблемы, не зря же его перестали поддерживать.
Во вторых, вы пытаетесь ввести читателя в заблуждение, вначале говорите о GCM, а потом плавно на c2dm переходите и говорите какая плохая документация для GCM, ничего не работает.

тем не менее, согласно документации метод public String register (String… senderIds) throws IOException, таким образом в случае ошибок связи с гугловыми сервисами будет выбрасываться именно исключение, в статье же приводится альтернативная попытка получения registartion ID

Понятное дело, что может возникнуть, если у вас нет конешина к интернету. Этот кейс прекрасно описан в ссылке, которую вы приводили:
} catch (IOException ex) {
      msg = "Error :" + ex.getMessage();
     // If there is an error, don't just keep trying to register.
     // Require the user to click a button again, or perform
     // exponential back-off.
}


И с GCM вам никак не может слушание несуществующего броадкаста. В чем вина гугла, если вы не обрабатываете ошибку?
Я думал статья о том как обеспечить надежную доставку GCM :(
В этом основная проблема — подвисание сообщений при GPRS соединении
Sign up to leave a comment.

Articles