Intereting Posts

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

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

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

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

В https://stackoverflow.com/a/14955308/111021 упоминается, что «Canonical ID» будет включен, чтобы сторонний сервер мог обновить идентификатор регистрации. Но в документе явно не указано, что такой сценарий охвачен (например, GCM может ошибочно принять приложение как «удаленное» во время разрыва обновления, и в этом случае мне кажется, что канонический идентификатор не будет сгенерирован, и я буду Перейдите прямо к NotRegistered ).

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

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

Как насчет решения ниже:

Создайте BroadcastReceiver для намерения ACTION_PACKAGE_REPLACED . Вы получите это намерение, когда будет установлена ​​новая версия пакета. После получения этого намерения вы можете перерегистрироваться в GCM для нового регистрационного идентификатора.

Broadcast Action: новая версия пакета приложений была установлена, заменив существующую ранее версию. Данные содержат имя пакета.

WhatsApp не является хорошим примером. Если вы проверите список запущенных сервисов на своем Android-устройстве, вы увидите, что WhatsApp постоянно поддерживает службу на вашем устройстве. Поэтому они не полагаются на приложение, зарегистрированное в GCM (я не уверен, что они даже используют GCM).

Причина, по которой Google рекомендует перерегистрироваться после обновления приложения, – это преодолеть ошибку, которая может привести к незарегистрированному приложению во время обновления.

Единственной известной причиной изменения идентификатора регистрации является старая ошибка приложений, которые автоматически регистрируются, если они получают сообщение при обновлении. До тех пор, пока эта ошибка не будет исправлена, приложениям по-прежнему необходимо вызвать register () после обновления, и до сих пор идентификатор регистрации может измениться в этом случае.

(Цитата отсюда ).

Поскольку вы не можете перерегистрироваться в GCM до тех пор, пока ваше приложение не будет запущено снова, нет ничего более надежного в том, что вы можете сделать, кроме проверки в своем основном действии, если версия приложения изменилась, а затем перерегистрироваться в GCM, если она ,

Было бы интересно узнать, по какой причине вы хотите использовать GCM в высокодоступном приложении. Особенно количество запросов, и если они чувствительны к времени.

В общем, по собственному опыту я могу порекомендовать, что GCM далеко не доступен. Сообщения теряются или за пару минут доходят до клиента. Если вы действительно хотите гарантировать 100% доставку сообщений, вы должны использовать Сокеты в фоновом режиме и восстанавливать соединение каждый раз, когда он потеряется. (Btw: это подход WhatsApp).

Если вы хотите продолжить использование GCM: возможно, подумайте о том, чтобы перенести свое сообщение на сервер на минуту, когда сервер GCM отвечает NotRegistered.