Меняется ли токен устройства APNS после создания?

99

Меняется ли токен устройства push-уведомлений после создания?

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

001
источник
Убедитесь, что вы видите этот ответ, поскольку он предоставляет документацию по 4 местам, где изменяется токен устройства
Дорогая,

Ответы:

71

Из [Apple Documentation ApplePushService] 2

Форма этой фазы доверия к токенам гарантирует, что только APN генерирует токен, который он позже будет соблюдать, и может гарантировать, что токен, переданный ему устройством, является тем же самым токеном, который он ранее предоставил для этого конкретного устройства - и только для этого устройства.

Если пользователь восстанавливает данные резервной копии на новом устройстве или переустанавливает операционную систему, токен устройства изменяется.

малинуа
источник
В текущих документах последнее предложение исключено. Похоже (из другого вопроса SO, stackoverflow.com/questions/2751481/… ), что при восстановлении данных будут сохранены токены APN, но установка ОС и «очистка» сбрасывают их (если за ними не последует восстановление данных во вновь установленной операционной системе). система).
Роберт Альтман
1
@RobertAltman - Я не думаю, что это вся история. Я видел несколько регистраций в нашей базе данных с совершенно разных устройств с одним и тем же токеном APNS. Прямо сейчас я вижу перед собой iPad 2 и iPhone 3GS, которые отправили нам один и тот же токен. Может ли кто-нибудь еще подтвердить такое поведение?
DougW
@DougW, это странно. У вас все еще есть подобная проблема? Отредактировал ссылку и опубликовал из последних документов.
iosCurator 06
139

Официальная документация Apple по этому поводу неясна. Я заметил следующее: токен инвариантен для данного устройства, приложения и домена (производственная среда или песочница). Я считаю, что это должно оставаться верным, чтобы система работала надежно. Рассмотрим ситуацию, когда обновление приложения запускает новый токен APN; Если бы я использовал лучшее новое приложение, подобное Twitter, с включенными уведомлениями, что бы произошло, когда я обновил свое приложение из iTunes? Должен ли я ожидать, что он будет продолжать отправлять уведомления, даже если я не запускал приложения с тех пор, как «синхронизирую» обновление на своем устройстве? Изменение приложения не может повлиять на систему APN, поскольку ОС может получать уведомления от вашего имени, даже если вы не запустили обновленное приложение.

Чтобы быть ясным, Apple заявляет: «Приложение должно регистрироваться [на серверах APN] каждый раз при запуске и выдавать своему провайдеру текущий токен». Я полностью согласен; это защитит ваше приложение от неверных предположений или необычных ситуаций.

Один из ответов на вопрос, являются ли токены push-уведомлений уникальными для всех приложений для одного устройства? указывает, что токены устройства уникальны для каждой «установки операционной системы»; и что восстановление из резервной копии на устройство будет поддерживать токен, но очистка устройства приведет к получению нового токена. Это полностью согласуется с намерениями Apple обеспечить бесперебойную работу и конфиденциальность: очистка устройства достаточно серьезна, и, возможно, требует новой ассоциации, но пользователь, восстанавливающий изображение после обновления ОС, захочет сохранить свои существующие уведомления. Если я вспомню недавнее обновление iOS5 на моем iPad, я восстановил самую последнюю резервную копию после обновления, так что это поддержит согласованность моего токена уведомления. [Edit: восстановление резервной копии на другой устройство НЕ будет дублировать токен.]

предостережение: у меня нет окончательных знаний по этому вопросу, только некоторый разумный опыт работы с APN (в качестве стороннего разработчика). Как всегда, лучше всего проверить свои предположения.


Обновление (июнь 2012 г.):

Недавно у меня была возможность a> поговорить с инженерами Apple и b> провести несколько реальных тестов, и я хотел представить результаты:

Для полноты, когда я говорю о возврате токена APN, я подразумеваю контекст одного идентификатора пакета / приложения.

Во-первых, инженеры Apple заявили, что два устройства не должны возвращать один и тот же APN. Несмотря на комментарии ниже, я не смог определить обстоятельства, при которых это не помогло.

Во-вторых, вот последовательность и результаты тестирования обновления:

  1. Начните с iOS4, установленной на iPhone4; устройство резервного копирования в iTunes

  2. Обновление до iOS5
    Из предыдущего теста я знаю, что токен APN теперь другой.

  3. Восстановите резервную копию на устройстве
    . Токен APN теперь такой же, как на шаге 1.

  4. Сбросить iOS (чистое устройство)
    Изменения токена APN

  5. Сделайте резервную копию другого телефона в iTunes и восстановите эту резервную копию на тестовое устройство; в основном восстанавливаю "неправильную" резервную копию, как будто менял телефоны.
    Токен APN снова меняется; кроме того, он отличается и не соответствует токенам ни исходному, ни «клонированному» токену.

  6. Восстановите "правильную" резервную копию на устройство.
    Токен APN теперь такой же, как на шаге 1.

  7. Наконец, я обновил телефон до iOS6 (beta2), восстановил резервную копию и повторно протестировал. Как и ожидалось, токен продолжал соответствовать токену на шаге 1.

На данный момент я почти уверен, что токены APN не могут дублироваться между разными устройствами; возможно, это могло произойти как ошибка в более ранних версиях iOS, но я уверен, что iOS5 (и, предположительно, iOS6) правильно обрабатывает токены APN.


Обновление (август 2012 г.)

Я просто понял , что я не добавил это: лексемы устройства будут меняться. Один из разработчиков Apple поделился со мной, что токены действительно истекают (я думаю, через 2 года). Для многих целей этого достаточно, чтобы его можно было рассматривать как инвариант.

[Я не волнуюсь, если мне придется обновлять свои тестовые сценарии новыми токенами каждые два года, тем более что я каждый год меняю телефоны.]

Роберт Альтман
источник
Значит ли это, что вы можете использовать токен как способ однозначной идентификации пользователя? (что очень удобно в приложениях, где нужно «голосовать»?). Я могу представить себе ситуацию: пользователь голосует, а приложение отвечает случайным числом через уведомления. Этот номер необходимо повторно отправить на сервер, чтобы голос был действительным. Таким образом, голосование не может быть легко сфальсифицировано.
Toad
Также интересно: меняется ли токен при удалении приложения и его повторной установке. Или это похоже на вариант «восстановление из резервной копии»
Toad
@Toad Токен не изменится в результате удаления и повторной установки приложения.
Роберт Альтман
@Toad Я бы не подумал, что это будет хорошей формой идентификации пользователя; поскольку токен уникален для каждого устройства (а также для каждого приложения), пользователь с несколькими устройствами будет иметь несколько токенов.
Роберт Альтман
1
Меня интересует связь между сертификатами и токеном устройства. Если срок действия сертификата .p12 истекает, необходимо изменить новый сертификат. Я нашел ссылку «Когда требуется новый токен устройства, APN генерирует его, используя информацию, содержащуюся в сертификате устройства». Так разве нет возможности обновления токена устройства при смене сертификатов?
illusionJJ
51

Я только что протестировал его с изменениями токена iOS9 и APN Push, если я переустановлю приложение.

Николай Деркач
источник
7
я могу подтвердить это
roocell
1
Я тоже могу это подтвердить
Мухаммад Аднан
1
Да, это меняется :(
Азик Абдулла
кто-нибудь может сказать, почему это происходит?
Sushobhit
Да, это изменится
Вед Раунияр
22

ДА , токены устройства могут измениться.

Каждый раз, когда ваше приложение получает токен, оно должно сохранять его. Затем, когда новый маркер принимается (что будет происходить, в конце концов), сравнить новый маркер хранимой маркер и, если они различны:

  1. Обновите локальное хранилище устройства (в том числе, возможно nil)
  2. Обновите все на устройстве, которое использует токен, чтобы узнать о новом токене.
  3. Обновите все API, которым известен этот токен, на новый токен.

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

Следовательно, вообще говоря, 100% API-интерфейсов, принимающих «токен устройства», также должны иметь какое-то UPDATEсредство для этого токена. Для того, чтобы не создавать для этого , чтобы построить для неправильно поставленные и не-доставленных уведомлений.

ИК1
источник
звучит хорошо, но что я удалил и переустановил приложение? в этом сценарии токен устройства, который я сохранил в локальном хранилище, будет удален
Куф
@ Куф, ты получил ответ на этот вопрос? У меня то же самое - даже если приложение удалено / переустановлено, как бы мы сравнили токен системы?
nkirkes
@nkirkes см. этот вопрос для более подробной информации
Куф
Три пункта «обновления», о которых вы говорили, являются ли они ответственностью iOS, SDK или нас самих?
somenickname
7

Токен устройства меняется с iOS 8 и новее

См. Текст с веб-сайта Apple ниже. Регистрация, планирование и обработка уведомлений пользователей

Токен устройства - это ваш ключ к отправке push-уведомлений в ваше приложение на определенном устройстве. Токены устройства могут изменяться, поэтому вашему приложению необходимо перерегистрироваться каждый раз при запуске и передавать полученный токен обратно на ваш сервер. Если вы не обновите токен устройства, удаленные уведомления могут не поступать на устройство пользователя. Токены устройств всегда меняются, когда пользователь восстанавливает данные резервной копии на новом устройстве или компьютере или переустанавливает операционную систему. При переносе данных на новое устройство или компьютер пользователь должен запустить ваше приложение один раз, прежде чем удаленные уведомления могут быть доставлены на это устройство.

Нитья
источник
2
URL мертв! Пожалуйста, исправьте.
Ramis
4

Я думаю, стоит упомянуть, поскольку никто этого не делал, что токен меняется после того, как вы позвонили unregisterForRemoteNotifications. Когда вы позвоните в registerForRemoteNotificationsследующий раз, токен будет другим. Мне не удалось найти подтверждения этому в документации Apple, но я сам был свидетелем такого поведения. Пожалуйста, имейте это в виду

Андрей Чернуха
источник
3

Он не должен меняться, если ваше приложение не будет восстановлено на новом устройстве (в этот момент его не попросят снова принять push-уведомления, и он просто отправит вам зарегистрированный вызов, после чего вы должны принять новый токен).

Но Apple не гарантирует, что он никогда не изменится (поэтому в документации об этом не упоминается). Вам лучше запрограммировать худшее и предположить, что однажды это может измениться. Кроме того, регулярная отправка токена на ваш сервер позволяет вам удалять токены, которые не регистрировались какое-то время и, вероятно, деинсталлировали ваше приложение или потеряли интерес некоторое время назад (и в документации это указано как желаемое поведение!).

Джейк
источник
Вы правы: нельзя предполагать, что токен постоянный; соблюдайте правила взаимодействия, определенные в документации APN. Фактически, разработчики Apple сказали мне, что токен в конечном итоге изменится (примерно через 2 года).
Роберт Альтман
1
Возродить старую дискуссию, но кому-то это может пригодиться: на этой неделе я потратил некоторое время, работая над автономным сервером Parse, и у меня возникли проблемы с тестированием - оказалось, что каждый раз, когда я обновлял свое приложение для разработчиков (поскольку я делал количество изменений UX), идентификатор токена менялся с каждой установкой программного обеспечения ... разве это не слишком весело? (вздох)
ChrisH
3

От - Apple Docs

APN могут выдавать новый токен устройства по разным причинам:

  • Пользователь устанавливает ваше приложение на новое устройство

  • Пользователь восстанавливает устройство из резервной копии

  • Пользователь переустанавливает операционную систему

  • Другие системные события

В результате приложения должны запрашивать токен устройства во время запуска.

Дополнительно:

ВАЖНЫЙ

Токены устройств APN имеют переменную длину. Не фиксируйте их размер жестко.

Лал Кришна
источник
2

Ссылки быстро устаревают с яблоком! поэтому я цитирую то, что теперь кажется довольно ясным:

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

Из этого руководства

Фуцюань
источник
0

Что касается push-уведомлений Apple

Токен устройства - это ваш ключ к отправке push-уведомлений в ваше приложение на определенном устройстве. Токены устройства могут изменяться, поэтому вашему приложению необходимо перерегистрироваться каждый раз при запуске и передавать полученный токен обратно на ваш сервер. Если вы не обновите токен устройства, удаленные уведомления могут не поступать на устройство пользователя. Токены устройств всегда меняются, когда пользователь восстанавливает данные резервной копии на новом устройстве или компьютере или переустанавливает операционную систему. При переносе данных на новое устройство или компьютер пользователь должен запустить ваше приложение один раз, прежде чем удаленные уведомления могут быть доставлены на это устройство.

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

Мохит Гаур
источник
0

По этой ссылке токен устройства

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

Lucianoenrico
источник
0

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

  • (void) application: (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken

Приложение должно зарегистрировать / обновить токен на удаленном сервере. Это обеспечит синхронизацию токена APNS и вашего сервера.

Согласно документации Apple ,

Получение и обработка токена устройства для конкретного приложения работает следующим образом:

Ваше приложение регистрируется в APN для удаленных уведомлений. Когда требуется новый токен устройства, APN генерирует его, используя информацию, содержащуюся в сертификате устройства. Он шифрует токен с помощью ключа токена и возвращает его на устройство, как показано средней стрелкой вправо. Система доставляет токен устройства обратно в ваше приложение, вызывая ваше приложение: didRegisterForRemoteNotificationsWithDeviceToken: метод делегата. После получения токена ваше приложение (в методе делегата) должно переслать его вашему провайдеру в двоичном или шестнадцатеричном формате. Ваш провайдер не может отправлять уведомления на устройство без этого токена. Дополнительные сведения см. В разделе «Регистрация для получения удаленных уведомлений» в разделе «Настройка поддержки удаленных уведомлений».

iosCurator
источник
0

Реле токена устройства при установке приложения.

Это означает, что если вы переустановите приложение, оно изменится ; это не сработает, если вы сделаете это из резервной копии, обновления iOS и т. д.

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

Альберто Скампини
источник