Официальная документация Apple по этому вопросу неясна. Я заметил следующее: токен является инвариантным для данного устройства, приложения и домена (производство или песочница). Я считаю, что это должно оставаться верным, чтобы система работала надежно. Рассмотрим ситуацию, когда обновление приложения вызывает новый токен APN; если бы я использовал самое новое новое приложение, похожее на Twitter, с включенными уведомлениями, что бы произошло, когда я обновил свое приложение из iTunes? Должен ли я ожидать, что по-прежнему будут отправляться уведомления, даже если я не запускаю приложения, поскольку я "синхронизирую" обновление на моем устройстве? Смена приложения не может повлиять на систему APN, поскольку ОС может получать уведомления от вашего имени, даже если вы не запустили обновленное приложение.
Чтобы было ясно, Apple заявляет, что "приложение должно регистрироваться [на серверах APN] каждый раз, когда оно запускается, и предоставлять своему провайдеру текущий токен". Я полностью согласен; это защитит ваше приложение от неверных предположений или необычных ситуаций.
Один из ответов на Являются ли маркеры push-уведомлений уникальными для всех приложений для одного устройства? указывает, что токены устройства уникальны для "установки операционной системы"; и что восстановление из резервной копии на устройство сохранит токен, но очистка устройства приведет к тому, что оно получит новый токен. Это полностью соответствовало бы намерениям Apple по обеспечению бесперебойной работы и конфиденциальности: стирание устройства является достаточно серьезным, чтобы, возможно, оно потребовало новой ассоциации, но пользователь, восстанавливающий изображение после обновления ОС, хотел бы сохранить свои существующие уведомления. Если я вспоминаю недавнее обновление iOS5 на своем iPad, я восстановил самую последнюю резервную копию после обновления, так что это поддержало бы согласованность моего маркера уведомлений. [Редактировать: восстановление резервной копии на другое устройство НЕ будет дублировать токен.]
нюанс:
У меня нет окончательных знаний по этому вопросу, просто есть некоторый разумный опыт работы с APN (в качестве стороннего разработчика). Как всегда, лучше всего проверить свои предположения.
Обновление (июнь 2012 г.):
Недавно у меня была возможность поговорить с инженерами Apple и провести несколько реальных испытаний, и я хотел представить результаты:
В завершение, когда я говорю о возврате токена APN, я предполагаю контекст одного идентификатора пакета / приложения.
Во-первых, инженеры Apple заявили, что два устройства не должны возвращать один и тот же APN. Несмотря на приведенные ниже комментарии, я не смог определить обстоятельства, когда это не удалось.
Во-вторых, вот последовательность тестирования обновления и результаты:
Начните с iOS4, установленной на iPhone4; устройство резервного копирования в iTunes
Обновление до iOS5
Из предыдущего теста я знаю, что токен APN теперь отличается
Восстановить резервную копию на устройство
Токен APN теперь совпадает с шагом 1.
Сброс iOS (чистое устройство)
Изменен токен APN
Сделайте резервную копию другого телефона в iTunes и восстановите эту резервную копию на тестовом устройстве; в основном, я восстанавливаю «неправильную» резервную копию, как будто я переключаю телефоны.
токен APN снова меняется; кроме того, он отличается и не соответствует токенам ни оригинальному токену, ни клонированному токену.
Восстановление «правильной» резервной копии на устройстве.
Токен APN теперь совпадает с шагом 1.
Наконец, я обновил телефон до iOS6 (бета2), восстановил резервную копию и повторно протестировал. Как и ожидалось, токен продолжал соответствовать токену на шаге 1.
На данный момент я вполне уверен, что токены APN нельзя дублировать между различными устройствами; возможно, это могло быть ошибкой в более ранних версиях iOS, но я уверен, что iOS5 (и, вероятно, iOS6) правильно обрабатывает токены APN.
Обновление (август 2012 г.)
Я только что понял, что не добавил это: токены устройства изменят . Один из разработчиков Apple поделился со мной, что токены действительно истекают (я думаю, что через 2 года). Для многих целей это достаточно долго, что можно считать инвариантом.
[Меня не беспокоит необходимость обновлять свои тестовые сценарии новыми токенами каждые два года, особенно с учетом того, что я меняю телефоны каждый год.]