Как управлять изменениями токенов apns для iOS

У меня возникла проблема, когда пользователь начал получать двойные уведомления после удаления и переустановки моего приложения, поскольку устройство отправило на мой сервер 2 разных токена APNS - один из первой установки, а другой после переустановки приложения. Поскольку жетоны были разными, я не мог знать, что это одно и то же устройство.

Пока не вышла iOS 9, каждый раз, когда я удалял и переустанавливал приложение, у меня всегда был один и тот же APNS, поэтому было легко узнать, что это то же устройство, которое использовал пользователь, как и раньше. Начиная с iOS 9, токен APNS меняется при каждой установке.

Мой вопрос: как узнать, удаляет ли клиент и переустанавливает приложение, и обновляет свой токен APNS вместо добавления нового токена?

Я спрашиваю, так как это звучит для меня как то, с чем приходилось сталкиваться большинству разработчиков iOS, но я не смог найти передовой практики от Apple, как решить эту проблему, поэтому я надеялся, что другие могут поделиться своим опытом с этой проблемой.


person Kuf    schedule 15.12.2015    source источник
comment
Нужно ли пользователю входить в систему или идентифицировать себя, чтобы использовать приложение и получать уведомления?   -  person Ares    schedule 15.12.2015
comment
@ares Да, но у каждого пользователя может быть несколько подключенных устройств, поэтому, когда пользователь подключается, я не могу сказать, изменилось ли это устройство или APNS после переустановки.   -  person Kuf    schedule 15.12.2015
comment
Как насчет прикрепления '[[UIDevice currentDevice] name];' к метаданным токена?   -  person Ares    schedule 15.12.2015
comment
@Ares имя устройства не уникально (например, «iPhone Джо»)   -  person Kuf    schedule 15.12.2015
comment
Почему ты говоришь, что не можешь? Этот API доступен с 6.0 NS_AVAILABLE_IOS(6_0);. Я не понимаю   -  person sahara108    schedule 15.12.2015
comment
@ sahara108 Я ушел с работы, завтра попробую и доложу, tnx   -  person Kuf    schedule 15.12.2015
comment
@ sahara108 значение может измениться после переустановки приложения с документы Apple: The value changes when the user deletes all of that vendor’s apps from the device and subsequently reinstalls one or more of them   -  person Kuf    schedule 15.12.2015
comment
Я подумал, что они изменили его :(. Значит, вам нужно записать это значение в свою связку ключей.   -  person sahara108    schedule 15.12.2015
comment
@ sahara108 спасибо за вклад   -  person Kuf    schedule 15.12.2015


Ответы (1)


Вот как мы ее решили:

При каждом запуске приложения:

  1. создать токен push-уведомления
  2. is there a token in localstorage?
    • yes - compare the tokens to localstorage. are they identical?
      • yes - return
      • no - обновить сервер новым токеном и после ответа сервера с 'OK' сохранить его локально в локальном хранилище и связке ключей
    • no - check is there a token in keychain
      • yes - compare the tokens to keychain. are they identical?
        • yes - save token in localstorage and return
        • no - обновить сервер новым токеном, и после ответа сервера с «OK» сохранить его локально в локальном
          хранилище и связке ключей.
    • no - обновить сервер новым токеном и после ответа сервера с 'OK' сохранить его локально в локальном хранилище и связке ключей

Если у кого-то есть более элегантный способ решить эту проблему, я хотел бы услышать об этом

person Kuf    schedule 15.12.2015
comment
Я бы предпочел использовать клавишу identifierForVendor. При каждом запуске приложения проверяйте, выходит ли значение клавиши appnameVendor. Если не загрузите его из системы и запишите. Отправьте на сервер новый токен и значение этого appnamVendor. Сервер позаботится о создании нового или обновлении одного базового, значение которого - person sahara108; 16.12.2015
comment
@ sahara108 Я думал об этом (это то, что я делаю для Android), но поскольку мне нужно сохранить токен, чтобы узнать, был ли он изменен, я использую токен вместо добавления другой сохраненной переменной в цепочку для ключей. - person Kuf; 16.12.2015
comment
Вы сохраняете только одну переменную в обоих случаях. Единственное отличие состоит в том, что если у вас несколько приложений, вы можете повторно использовать identifierForVendor, поскольку он одинаков во всем приложении. - person sahara108; 16.12.2015
comment
Это то, что делают большинство провайдеров, таких как Braze? Я не могу найти их, чтобы указать это в документе. - person somenickname; 16.05.2018