Сохранение идентификатора регистрации GCM приложения, действующего во время автоматического обновления
В официальных документах и этот вопрос Google рекомендует перерегистрировать GCM, потому что идентификатор регистрации может измениться.
Один гипотетический способ, которым это может случиться, заключается в том, что во время обновления все деинсталлируется и затем устанавливается. Если в течение этого промежутка времени получено уведомление GCM, может быть возвращен NotRegistered
, а идентификатор регистрации GCM может быть недействительным.
Если Google Play автоматически обновляет мое приложение, какой самый надежный способ справиться с таким сценарием и перерегистрироваться? В приложении, таком как WhatsApp, пользователь может никогда явно не запускать какую-либо деятельность, если не получено уведомление GCM. Таким образом, пользователь в основном "потерян", пока он случайно не наткнется на активность.
В qaru.site/info/409266/... упоминается, что "Canonical ID" будет включен, чтобы сторонний сервер мог обновить идентификатор регистрации. Но в doc явно не указано, что этот тип сценария охвачен (т.е. GCM может ошибочно принять приложение как "удаленное" во время обновления разрыв, и в этом случае мне кажется, что канонический идентификатор не будет сгенерирован, и я перейду прямо к NotRegistered
).
Как работает приложение с высокой доступностью, например WhatsApp или другие приложения для обмена сообщениями?
Ответы
Ответ 1
Как насчет решения ниже:
Создайте BroadcastReceiver для намерения ACTION_PACKAGE_REPLACED. Вы получите это намерение, когда будет установлена новая версия пакета. Как только вы достигнете этого намерения, вы можете перерегистрироваться в GCM для нового регистрационного идентификатора.
Трансляция: Была установлена новая версия пакета приложений, заменившая существующую ранее версию. Данные содержат имя пакета.
Ответ 2
WhatsApp
не является хорошим примером. Если вы проверите список запущенных сервисов на своем Android-устройстве, вы увидите, что WhatsApp
постоянно работает на вашем устройстве. Поэтому они не полагаются на приложение, зарегистрированное в GCM (я не уверен, что они даже используют GCM).
Причина, по которой Google рекомендует перерегистрироваться после обновления приложения, - это преодолеть ошибку, которая может привести к незарегистрированному приложению во время обновления.
Единственная известная причина для изменения идентификатора регистрации - это старая ошибка приложений, которые незарегистрируются автоматически, если они получают сообщение при обновлении. До тех пор, пока эта ошибка не будет исправлена, приложениям по-прежнему необходимо вызвать register() после обновления, и до сих пор идентификатор регистрации может измениться в этом случае.
(Цитата из здесь).
Поскольку вы не можете перерегистрироваться в GCM до тех пор, пока ваше приложение не будет запущено снова, вы не сможете ничего более уверенного в себе, кроме проверки в своем основном действии, если версия приложения изменилась, а затем перерегистрироваться в GCM если он имеет.
Ответ 3
Было бы интересно узнать, по какой причине вы хотите использовать GCM в высокодоступном приложении. Особенно количество запросов и если они чувствительны к времени.
В целом, исходя из собственного опыта, я могу порекомендовать, что GCM далеко не доступен. Сообщения теряются или за пару минут доходят до клиента. Если вы действительно хотите гарантировать 100% доставку сообщений, вы должны использовать Сокеты в фоновом режиме и восстанавливать соединение каждый раз, когда он потеряется. (Btw: это подход, который использует WhatsApp).
Если вы хотите продолжить использование GCM: возможно, подумайте о том, чтобы перенести свое сообщение на сервер на минуту, когда сервер GCM отвечает NotRegistered.