Подтвердить что ты не робот

Сохранение идентификатора регистрации GCM приложения, действующего во время автоматического обновления

В официальных документах и ​​этот вопрос Google рекомендует перерегистрировать GCM, потому что идентификатор регистрации может измениться.

Один гипотетический способ, которым это может случиться, заключается в том, что во время обновления все деинсталлируется и затем устанавливается. Если в течение этого промежутка времени получено уведомление GCM, может быть возвращен NotRegistered, а идентификатор регистрации GCM может быть недействительным.

Если Google Play автоматически обновляет мое приложение, какой самый надежный способ справиться с таким сценарием и перерегистрироваться? В приложении, таком как WhatsApp, пользователь может никогда явно не запускать какую-либо деятельность, если не получено уведомление GCM. Таким образом, пользователь в основном "потерян", пока он случайно не наткнется на активность.

В qaru.site/info/409266/... упоминается, что "Canonical ID" будет включен, чтобы сторонний сервер мог обновить идентификатор регистрации. Но в doc явно не указано, что этот тип сценария охвачен (т.е. GCM может ошибочно принять приложение как "удаленное" во время обновления разрыв, и в этом случае мне кажется, что канонический идентификатор не будет сгенерирован, и я перейду прямо к NotRegistered).

Как работает приложение с высокой доступностью, например WhatsApp или другие приложения для обмена сообщениями?

4b9b3361

Ответ 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.