Arhn - архитектура программирования

GoogleCloudMessaging#register возвращает разные идентификаторы в одном приложении/устройстве?

Я использую GoogleCloudMessaging для реализации функции уведомлений в своем приложении. Но у меня проблема: когда я удаляю свое приложение и устанавливаю его снова, я получаю 2 разных идентификатора регистрации, что приводит к дублированию уведомлений в моем приложении. сильный>.

В документе сказано: "< em>Повторные вызовы этого метода вернут исходный идентификатор регистрации"

публичный строковый регистр (String... senderIds)

Зарегистрируйте приложение для GCM и верните идентификатор регистрации. Вы должны вызвать это один раз, когда ваше приложение установлено, и отправить возвращенный регистрационный идентификатор на сервер.

Повторные вызовы этого метода вернут исходный идентификатор регистрации.

Но в другом документе они придумали что-то под названием "< em>Канонические идентификаторы":

Канонические идентификаторы На стороне сервера, пока приложение ведет себя хорошо, все должно работать нормально. Однако, если ошибка в приложении вызывает несколько регистраций для одного и того же устройства, может быть сложно согласовать состояние, и вы можете получить повторяющиеся сообщения.

Итак, как я могу сделать это согласованным со всеми устройствами? Мой (сторонний) сервер хранит только идентификаторы регистрации, которые будут использоваться для отправки уведомлений. А вот и «Канонические идентификаторы», и все стало намного сложнее!

Означает ли это, что я должен отправлять уникальный идентификационный номер для каждого устройства при регистрации?

Это блок кода, который я использовал для регистрации устройства в GoogleCloudMessaging:

try {
    if (gcm == null) {
        gcm = GoogleCloudMessaging.getInstance(context);
    }
    regid = gcm.register(SENDER_ID);
    Log.d(TAG, "########################################");
    Log.d(TAG, "Current Device's Registration ID is: " + regid);
    Map<String, String> data = new HashMap<String, String>();
    data.put("regId", regid);
    try {
        Utils.post(Constants.SERVER_NOTIFY_REG_LINK, data);
        Log.d(TAG, "ID registered: " + regid);
    } catch (Exception e) {
        e.printStackTrace();
    }
} catch (IOException ex) {
    msg = "Error :" + ex.getMessage();
    Log.d(TAG, msg);
}

Ответы:


1

Да, регистрация приложения после его повторной установки может дать вам новый регистрационный идентификатор. Вы можете обрабатывать это либо на стороне сервера, либо на стороне клиента:

  • Сторона клиента: назначьте уникальный идентификатор экземпляра каждому экземпляру вашего приложения. Сохраните этот идентификатор во внешнем хранилище, чтобы он не удалялся при удалении приложения. Отправьте этот идентификатор на свой сервер вместе с идентификатором регистрации и замените старый идентификатор регистрации новым, если вы найдете в своей БД старый идентификатор регистрации, связанный с тем же идентификатором экземпляра.

  • Сторона сервера: всякий раз, когда вы получаете канонический идентификатор регистрации в ответе от GCM, удалите старый идентификатор регистрации из своей БД (и вставьте канонический идентификатор регистрации, если его еще нет в вашей БД).

Я предлагаю вам сделать и то, и другое, так как второе устраняет проблему только после того, как вы уже получили дублирующее сообщение, а первое не является полным доказательством (поскольку внешнее хранилище может быть удалено или недоступно).

25.09.2014
  • Спасибо за ваш ответ. Похоже, я должен пойти с вашим первым решением. Но я думаю, что unique instance ID во внешнем хранилище не очень хорошо, как вы упомянули. Есть ли что-нибудь более простое, что я мог бы использовать для идентификации устройств? Например ID устройства или что-то в этом роде? Во всяком случае, я буду google это прямо сейчас. Спасибо. 25.09.2014
  • К сожалению, уникального идентификатора устройства не существует. Таким образом, вы должны полностью полагаться на методы, предоставленные Google, чтобы не получать дубликаты сообщений. 06.11.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..