Меняется ли токен устройства push-уведомлений после создания?
Пример, когда приложение обновляется? или в любом другом случае это может измениться ??
Ответы:
Из [Apple Documentation ApplePushService] 2
Форма этой фазы доверия к токенам гарантирует, что только APN генерирует токен, который он позже будет соблюдать, и может гарантировать, что токен, переданный ему устройством, является тем же самым токеном, который он ранее предоставил для этого конкретного устройства - и только для этого устройства.
Если пользователь восстанавливает данные резервной копии на новом устройстве или переустанавливает операционную систему, токен устройства изменяется.
Официальная документация Apple по этому поводу неясна. Я заметил следующее: токен инвариантен для данного устройства, приложения и домена (производственная среда или песочница). Я считаю, что это должно оставаться верным, чтобы система работала надежно. Рассмотрим ситуацию, когда обновление приложения запускает новый токен APN; Если бы я использовал лучшее новое приложение, подобное Twitter, с включенными уведомлениями, что бы произошло, когда я обновил свое приложение из iTunes? Должен ли я ожидать, что он будет продолжать отправлять уведомления, даже если я не запускал приложения с тех пор, как «синхронизирую» обновление на своем устройстве? Изменение приложения не может повлиять на систему APN, поскольку ОС может получать уведомления от вашего имени, даже если вы не запустили обновленное приложение.
Чтобы быть ясным, Apple заявляет: «Приложение должно регистрироваться [на серверах APN] каждый раз при запуске и выдавать своему провайдеру текущий токен». Я полностью согласен; это защитит ваше приложение от неверных предположений или необычных ситуаций.
Один из ответов на вопрос, являются ли токены push-уведомлений уникальными для всех приложений для одного устройства? указывает, что токены устройства уникальны для каждой «установки операционной системы»; и что восстановление из резервной копии на устройство будет поддерживать токен, но очистка устройства приведет к получению нового токена. Это полностью согласуется с намерениями Apple обеспечить бесперебойную работу и конфиденциальность: очистка устройства достаточно серьезна, и, возможно, требует новой ассоциации, но пользователь, восстанавливающий изображение после обновления ОС, захочет сохранить свои существующие уведомления. Если я вспомню недавнее обновление iOS5 на моем iPad, я восстановил самую последнюю резервную копию после обновления, так что это поддержит согласованность моего токена уведомления. [Edit: восстановление резервной копии на другой устройство НЕ будет дублировать токен.]
предостережение: у меня нет окончательных знаний по этому вопросу, только некоторый разумный опыт работы с APN (в качестве стороннего разработчика). Как всегда, лучше всего проверить свои предположения.
Недавно у меня была возможность a> поговорить с инженерами Apple и b> провести несколько реальных тестов, и я хотел представить результаты:
Для полноты, когда я говорю о возврате токена APN, я подразумеваю контекст одного идентификатора пакета / приложения.
Во-первых, инженеры Apple заявили, что два устройства не должны возвращать один и тот же APN. Несмотря на комментарии ниже, я не смог определить обстоятельства, при которых это не помогло.
Во-вторых, вот последовательность и результаты тестирования обновления:
Начните с iOS4, установленной на iPhone4; устройство резервного копирования в iTunes
Обновление до iOS5
Из предыдущего теста я знаю, что токен APN теперь другой.
Восстановите резервную копию на устройстве
. Токен APN теперь такой же, как на шаге 1.
Сбросить iOS (чистое устройство)
Изменения токена APN
Сделайте резервную копию другого телефона в iTunes и восстановите эту резервную копию на тестовое устройство; в основном восстанавливаю "неправильную" резервную копию, как будто менял телефоны.
Токен APN снова меняется; кроме того, он отличается и не соответствует токенам ни исходному, ни «клонированному» токену.
Восстановите "правильную" резервную копию на устройство.
Токен APN теперь такой же, как на шаге 1.
Наконец, я обновил телефон до iOS6 (beta2), восстановил резервную копию и повторно протестировал. Как и ожидалось, токен продолжал соответствовать токену на шаге 1.
На данный момент я почти уверен, что токены APN не могут дублироваться между разными устройствами; возможно, это могло произойти как ошибка в более ранних версиях iOS, но я уверен, что iOS5 (и, предположительно, iOS6) правильно обрабатывает токены APN.
Я просто понял , что я не добавил это: лексемы устройства будут меняться. Один из разработчиков Apple поделился со мной, что токены действительно истекают (я думаю, через 2 года). Для многих целей этого достаточно, чтобы его можно было рассматривать как инвариант.
[Я не волнуюсь, если мне придется обновлять свои тестовые сценарии новыми токенами каждые два года, тем более что я каждый год меняю телефоны.]
Я только что протестировал его с изменениями токена iOS9 и APN Push, если я переустановлю приложение.
ДА , токены устройства могут измениться.
Каждый раз, когда ваше приложение получает токен, оно должно сохранять его. Затем, когда новый маркер принимается (что будет происходить, в конце концов), сравнить новый маркер хранимой маркер и, если они различны:
nil
)На практике последний шаг, скорее всего, будет нетривиальным. Например, если у вас есть служба, которая отправляет предупреждения о погоде на токен устройства в зависимости от того, на какой почтовый индекс это устройство подписано, вам необходимо передать old_token
и new_token
указанную службу, чтобы она могла обновлять доставку.
Следовательно, вообще говоря, 100% API-интерфейсов, принимающих «токен устройства», также должны иметь какое-то UPDATE
средство для этого токена. Для того, чтобы не создавать для этого , чтобы построить для неправильно поставленные и не-доставленных уведомлений.
Токен устройства меняется с iOS 8 и новее
См. Текст с веб-сайта Apple ниже. Регистрация, планирование и обработка уведомлений пользователей
Токен устройства - это ваш ключ к отправке push-уведомлений в ваше приложение на определенном устройстве. Токены устройства могут изменяться, поэтому вашему приложению необходимо перерегистрироваться каждый раз при запуске и передавать полученный токен обратно на ваш сервер. Если вы не обновите токен устройства, удаленные уведомления могут не поступать на устройство пользователя. Токены устройств всегда меняются, когда пользователь восстанавливает данные резервной копии на новом устройстве или компьютере или переустанавливает операционную систему. При переносе данных на новое устройство или компьютер пользователь должен запустить ваше приложение один раз, прежде чем удаленные уведомления могут быть доставлены на это устройство.
Я думаю, стоит упомянуть, поскольку никто этого не делал, что токен меняется после того, как вы позвонили unregisterForRemoteNotifications
. Когда вы позвоните в registerForRemoteNotifications
следующий раз, токен будет другим. Мне не удалось найти подтверждения этому в документации Apple, но я сам был свидетелем такого поведения. Пожалуйста, имейте это в виду
Он не должен меняться, если ваше приложение не будет восстановлено на новом устройстве (в этот момент его не попросят снова принять push-уведомления, и он просто отправит вам зарегистрированный вызов, после чего вы должны принять новый токен).
Но Apple не гарантирует, что он никогда не изменится (поэтому в документации об этом не упоминается). Вам лучше запрограммировать худшее и предположить, что однажды это может измениться. Кроме того, регулярная отправка токена на ваш сервер позволяет вам удалять токены, которые не регистрировались какое-то время и, вероятно, деинсталлировали ваше приложение или потеряли интерес некоторое время назад (и в документации это указано как желаемое поведение!).
От - Apple Docs
APN могут выдавать новый токен устройства по разным причинам:
Пользователь устанавливает ваше приложение на новое устройство
Пользователь восстанавливает устройство из резервной копии
Пользователь переустанавливает операционную систему
Другие системные события
В результате приложения должны запрашивать токен устройства во время запуска.
Дополнительно:
ВАЖНЫЙ
Токены устройств APN имеют переменную длину. Не фиксируйте их размер жестко.
Ссылки быстро устаревают с яблоком! поэтому я цитирую то, что теперь кажется довольно ясным:
Никогда не кэшируйте токены устройства в своем приложении; вместо этого получите их из системы, когда они вам понадобятся. APN выдает вашему приложению новый токен устройства, когда происходят определенные события. Маркер устройства гарантированно будет другим, например, когда пользователь восстанавливает устройство из резервной копии, когда пользователь устанавливает ваше приложение на новое устройство и когда пользователь переустанавливает операционную систему. Получение токена вместо того, чтобы полагаться на кеш, гарантирует, что у вас есть текущий токен устройства, необходимый вашему провайдеру для связи с APN. Когда вы пытаетесь получить токен устройства, но он не изменился, метод выборки быстро возвращается.
Что касается push-уведомлений Apple
Токен устройства - это ваш ключ к отправке push-уведомлений в ваше приложение на определенном устройстве. Токены устройства могут изменяться, поэтому вашему приложению необходимо перерегистрироваться каждый раз при запуске и передавать полученный токен обратно на ваш сервер. Если вы не обновите токен устройства, удаленные уведомления могут не поступать на устройство пользователя. Токены устройств всегда меняются, когда пользователь восстанавливает данные резервной копии на новом устройстве или компьютере или переустанавливает операционную систему. При переносе данных на новое устройство или компьютер пользователь должен запустить ваше приложение один раз, прежде чем удаленные уведомления могут быть доставлены на это устройство.
Никогда не кэшируйте токен устройства; всегда получайте токен из системы, когда он вам нужен. Если ваше приложение ранее было зарегистрировано для удаленных уведомлений, повторный вызов метода registerForRemoteNotifications не влечет дополнительных накладных расходов, а iOS немедленно возвращает существующий токен устройства делегату вашего приложения. Кроме того, iOS вызывает ваш метод делегата при каждом изменении токена устройства, а не только в ответ на регистрацию или перерегистрацию вашего приложения.
По этой ссылке токен устройства
Маркер устройства, включенный в каждый запрос, представляет собой идентификатор устройства, получающего уведомление. APNs использует токены устройств для идентификации каждой уникальной комбинации приложения и устройства. Он также использует их для аутентификации маршрутизации удаленных уведомлений, отправляемых на устройство. Каждый раз, когда ваше приложение запускается на устройстве, оно извлекает этот токен из APN и пересылает его вашему провайдеру. Ваш провайдер хранит токен и использует его при отправке уведомлений этому конкретному приложению и устройству. Сам токен непрозрачен и постоянен, меняется только при удалении данных и настроек устройства. Только APN могут декодировать и читать токен устройства.
Да, это может измениться. В идеале, когда мы получаем токен через метод обратного вызова
- (void) application: (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken
Приложение должно зарегистрировать / обновить токен на удаленном сервере. Это обеспечит синхронизацию токена APNS и вашего сервера.
Согласно документации Apple ,
Получение и обработка токена устройства для конкретного приложения работает следующим образом:
Ваше приложение регистрируется в APN для удаленных уведомлений. Когда требуется новый токен устройства, APN генерирует его, используя информацию, содержащуюся в сертификате устройства. Он шифрует токен с помощью ключа токена и возвращает его на устройство, как показано средней стрелкой вправо. Система доставляет токен устройства обратно в ваше приложение, вызывая ваше приложение: didRegisterForRemoteNotificationsWithDeviceToken: метод делегата. После получения токена ваше приложение (в методе делегата) должно переслать его вашему провайдеру в двоичном или шестнадцатеричном формате. Ваш провайдер не может отправлять уведомления на устройство без этого токена. Дополнительные сведения см. В разделе «Регистрация для получения удаленных уведомлений» в разделе «Настройка поддержки удаленных уведомлений».
Реле токена устройства при установке приложения.
Это означает, что если вы переустановите приложение, оно изменится ; это не сработает, если вы сделаете это из резервной копии, обновления iOS и т. д.
Правильный способ использовать его, чтобы избежать каких-либо проблем, - получить тот, который указан NSPAppDelegate
при каждом запуске приложения, в методеdidRegisterForRemoteNotificationsWithDeviceToken