Intereting Posts
Эффективное изменение яркости экрана Android Studio 2.1.3 – Проблема с DefaultSourceDirectorySet Использование Facebook для регистрации нового пользователя в Android-приложении Фоновая служба с приемником местоположения в android Пользовательские графические артефакты Перепрограммировать высоту TextView Нарисуйте географически точную дугу на карте для Android Использование HTC Wildfire для разработки Android Android EditText / TextView, как заставить каждое слово начинаться с верхнего регистра, а все остальные символы слов – строчными буквами Внутренняя прокладка Spinner больше на Android 6.0.1 Создайте программный андроид spinner Ошибка GridView в горизонтальном расстоянии Начало программирования на динамических языках в Android ((J) Ruby, Clojure …) Android: Как свернуть строку состояния на Android 4.2? Как правильно добавлять и удалять контактные пузыри в multiautocompletetextview с помощью токенизатора пространства, такого как gmail, в поле в android

Сохранение идентификатора регистрации 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.