Токен устройства не соответствует приложению
JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанный на формате JSON. Как правило, используется для передачи данных для аутентификации в клиент-серверных приложениях. Токены создаются сервером, подписываются секретным ключом и передаются клиенту, который в дальнейшем использует данный токен для подтверждения своей личности.
В этой статье разберу, что такое Access токен, Refresh токен и как с ними работать.
Для дальнейших разборов будет использован токен:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODEzNTcwMzl9.E4FNMef6tkjIsf7paNrWZnB88c3WyIfjONzAeEd4wF0
После того, как посетитель прошел авторизацию в нашей системе, указав свой логин и пароль, система выдает ему 2 токена: access token и refresh токен.
После чего посетитель, когда хочет получить с сервера данные, например, свой профиль, вместе с запросом он передает Access токен, как на примере выше. Сервер, получив его проверяет, что он действительный (об этом чуть ниже), вычитывает полезные данные из него (тот же user_id) и, таким образом, может идентифицировать пользователя.
Токен разделен на три основные группы: заголовок, полезные данные и сигнатура, разделенные между собой точкой.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 - это первая часть токена - есть заголовок. Она закодирована в Base64 и если её раскодировать, получим строку:
Это можно проверить прям в браузере, выполнив в консоле или js коде:
const header = atob('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'); console.log(header);typ - это наш тип токена JWT. Alg - алгоритм шифрования HMAC-SHA256. Их может быть несколько, но здесь буду говорить именно об этом алгоритме.
Вторым блоком идет eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODEzNTcwMzl9
Это есть полезные данные, так же закодированные в Base64. После раскодирования получим:
Данные могут быть любыми. Главное, чтобы по ним можно было идентифицировать пользователя. В нашем случае - это user_id и exp - время окончания действия текущего токена.
Поскольку необходимо ограничивать токен по времени, поле exp обязательно. По нему можно проверить, актуален ли токен или нет.
Последняя часть токена - наиболее важная. У нас это E4FNMef6tkjIsf7paNrWZnB88c3WyIfjONzAeEd4wF0
Как вы уже могли заметить - первые данные передаются практически в открытом виде и раскодировать их может любой. Но шифровать их нет необходимости. Цель токена - подтвердить, что эти данные не были изменены. Вот для этих целей и выступает сигнатура. И чтобы её сгенерировать нужен приватный ключ. Ну или некая секретная фраза, которая находится только на сервере. Только с помощью этого ключа мы можем создать сигнатуру и проверить, что она была создана именно с помощью его.
Она получается примерно следующим образом:
Берем заголовок, например и кодируем его в base64, получаем ту самую часть eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Тоже самое проделываем с данными eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODEzNTcwMzl9
После этого склеиваем их и получаем eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODEzNTcwMzl9
Далее эти данные шифруем с помощью нашего алгоритма HMAC-SHA256 и ключа.
const header = '<"alg":"HS256","typ":"JWT">' // строка const payload = '' // строка // кодируем заголовок и данные в base64 const headerBase64 = base64urlEncode(header) const payloadBase64 = base64urlEncode(payload) // склеиваем точкой полученные строки const data = headerBase64 + '.' + payloadBase64 // кодируем алгоритмом шифрования нашим ключем шифрования const secret = '123456' const sig = HMAC-SHA256(data, secret) // и, наконец, получаем окончательный токен const jwt = data + '.' + sig"alg":"HS256","typ":"JWT">Для проверка токена необходимо проделать ту же операцию.
Берем склейку заголовок + данные, кодируем с помощью алгоритма HMAC-SHA256 и нашего приватного ключа. А далее берем сигнатуру с токена и сверяем с результатом кодирования. Если результаты совпадают - значит данные подтверждены и можно быть уверенным, что они не были подменены.
Основной токен, про который шла речь выше, обычно имеет короткий срок жизни - 15-30 минут. Больше давать не стоит.
Как только время выйдет, пользователю снова придется проходить авторизацию. Так вот чтобы этого избежать, существует Refresh токен. С помощью него можно продлить Access токен.
В действительности, Refresh токен обязательно должен быть одноразовым. Его задача - получить новую пару токенов. Как только это было сделано, предыдущий токен будет считаться недействительным. Срок жизни Refresh токена уже может быть большим - до года, а может даже и больше.
У него, обычно, нет какой-то структуры и это может быть некая случайная строка.
Генерируется Access токен и после случайная строка, например T6cjEbghMZmybUd_fhE
С нашего нового Access токена eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODEzNTcwMzl9.E4FNMef6tkjIsf7paNrWZnB88c3WyIfjONzAeEd4wF0 беру последние шесть знаков, получаю Ed4wF0
Склеиваю и получаю рефреш токен T6cjEbghMZmybUd_fhEEd4wF0
Это сделано для привязки Access токена к Refresh. Для получения новых токенов необходимо передать эти два токена. Делается проверка на их связку и только после валидируется Access токен. Если и второй этап прошел успешно, тогда получаем с базы данных по текущему user_id рефреш токен и сверяем с тем, что к нам пришел. Если они совпадают, тогда генерируются новые токены и в базе данных обновляется Refresh токен на новый.
Refresh токен хранится в LocalStorage и используется только когда Access токен перестал быть актуальным.
Представим ситуацию, когда у нас каким-то образом украли Access токен. Да, это уже плохо и где-то у нас брешь в безопасности. Злоумышленник в этом случае сможет им воспользоваться не более чем на 15-30 минут. После чего токен "протухнет" и перестанет быть актуальным. Ведь нужен второй токен для продления.
Если украли Refresh токен, то без Access токена (который недоступен в JS) продлить ничего нельзя и он оказывается просто бесполезным.
Самая неприятная ситуация - это когда удалось увести сразу 2 токена. В этом случае злоумышленник сможет пользоваться системой неограниченное время. Точнее когда пользователь попытается войти в систему, его не пустит, т.к. его Refresh токен уже будет неактуальным, и ему придется вводить логин и пароль. Только в этом случае злоумышленник потеряет контроль над чужой учетной записью.
В своей реализации Refresh токена использовал общую длину 24 знака. Первые 6 знаков - это дата его "протухания", следующие 12 знаков - случайно сгенерированные данные. И в конце 6 знаков - это часть Access токена последней части сигнатуры.
Дату протухания внедрил прям в токен с той целью, чтобы не хранить эту информацию где-то в другом месте, например, в базе данных.
Дата содержит год, месяц, день, час и минуты. Хранится в ASCII
Кодирование даты на Golang:
// приводим к целочисленному числу uint32. Итого 32 бита. // расчет простой: год 12 бит, месяц 4 бита, день 5 бит и т.д. Таким образом в аккурат умещаемся в 32 бита или 4 байта. date := uint32(year<<20) | uint32(month<<16) | uint32(day<<11) | uint32(hour<<6) | uint32(minute) // в цикле кодируем байты в ASCII. 1 знак это шесть бит. Итого и получаем шесть знаков даты по таблице ASCII - печатные знаки. for n := 0; n < 6; n++ < b6Bit = byte(date>>i) & 0x3F sBuilder.WriteByte(byte8bitToASCII(b6Bit)) . >Всю реализацию на Go можно изучить на Github-е
В этой статье попытался рассказать о взаимодействии двух токенов и как ими пользоваться. В сети достаточно много информации о Access токенах, однако мало, как мне показалось, информации о Refresh токенах.
После установки драйверов и во время использования цифровой подписи потенциально могут возникнуть ошибки. Причины часто кроются в программных ошибках, неправильных действиях пользователя. На практике большинство проблем можно решить самостоятельно, без обращения за помощью в удостоверяющий центр или к специалистам по обслуживанию компьютерной техники. Рассмотрим основные ошибки, с которыми приходится сталкиваться пользователям и которые реально решить своими силами.
Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва
Ошибку можно заметить на вкладке «Сертификаты» непосредственно в панели управления Рутокен. Проблема возникает во время установки ЭЦП и связана с неполной настройкой. Речь про отсутствие специального корневого доверенного сертификата, который выдает удостоверяющий центр.
Первым шагом к устранению ошибки остается обновление комплекта драйверов. Если проблема не исчезла или последние у вас имеют актуальную версию, выполните действия по следующему алгоритму:
- выберите ваш сертификат в панели управления;
- нажмите кнопку «Свойства»;
- выберите вкладку «Путь сертификации».
Если в открывшемся дереве вы видите лишь ваш личный сертификат, то надо установить еще один, который был выдан в удостоверяющем центре, и сделать доверенным.
Ошибка: Rutoken перестает определяться (Windows 10)
Потенциально могут возникать периодические ошибки из-за недоступности сертификатов, невозможности запустить панель управления. Одновременно светодиод на токене горит, а сам Рутокен имеется в Диспетчере устройств. Подобная ситуация может быть связана со спецификой работы материнской платы компьютера, когда при переходе из энергосберегающего режима в штатный не происходит «пробуждения» токена. Выходом здесь станет его отключение либо повторное подключение Рутокена (для этого достаточно достать USB-токен из разъема и подключить опять).
В случае если ошибка не исчезла, обратитесь за консультацией в удостоверяющий центр, где вы оформили ЭЦП и приобрели Рутокен.
Ошибка: Панель управления не видит Рутокен ЭЦП 2.0
Для решения проблемы выполните следующие действия:
- подключите токен к другому USB-разъему или компьютеру для оценки работоспособности;
- определите наличие устройства через «Диспетчер устройств» в разделе «Контроллеры USB»;
- проконтролируйте наличие доступа к веткам реестра
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais и
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\Readers у текущего пользователя и Local Service (если необходимо, то добавьте), также убедитесь, что Служба "Смарт-карта" запущена от имени NT AUTHORITY\LocalService ("Пуск" - "Панель управления" - "Администрирование" - "Службы").;
Если ничего не помогло и ошибка осталась, обращайтесь в удостоверяющий центр «Астрал». Мы предлагаем услуги по генерации ЭЦП любых типов на выгодных условиях, а также комплексное техническое сопровождение. Для решения проблем мы готовы проконсультировать по телефону либо найти выход с помощью удаленного подключения к вашему компьютеру. Получить дополнительную информацию можно по телефону либо оставив заявку на сайте. Мы оперативно ответим и предоставим консультацию.
После создания токен устройства push-уведомлений когда-либо меняется?
Пример , когда приложение обновляется? или в любом другом случае это может измениться??
Когда мы регистрируем устройство с APNS для push-уведомления, мы получаем токен устройства обратно. Есть ли какой-либо срок действия, связанный с этим токеном на APNS? Есть ли какая-то временная шкала, после которой APNS отбросит этот токен?
У нас есть таблица, в которой хранятся токены устройств Apple. Эти таблицы различны для тестирования и для живого приложения. Я хочу обновить эту базу данных вручную с помощью моего токена устройства iPhone для целей тестирования. Есть ли в любом случае я могу прочитать маркер устройства с моего.
Официальная документация Apple по этому вопросу неясна. Я заметил следующее: токен инвариантен для данного устройства, приложения и домена (производство и песочница). Я считаю, что это должно оставаться верным для того, чтобы система работала надежно. Рассмотрим ситуацию, когда обновление приложения запускает новый токен APN; если бы я использовал самое большое новое приложение, похожее на Twitter, с включенными уведомлениями, что произойдет, когда я обновлю свое приложение с iTunes? Должен ли я ожидать, что это будут ли по-прежнему отправляться уведомления, даже если я не запускал приложения с момента установки обновления на свое устройство? Изменение приложения не может повлиять на систему APN, так как OS может получать уведомления от вашего имени, даже если вы не запустили обновленное приложение.
Чтобы быть ясным, Apple заявляет, что "Приложение должно регистрироваться [на серверах APN] каждый раз, когда оно запускается, и предоставлять своему поставщику текущий токен". Я полностью согласен; это защитит ваше приложение от неверных предположений или необычных ситуаций.
предостережение: У меня нет окончательных знаний по этому вопросу, просто некоторый разумный опыт работы с APN (в качестве стороннего разработчика). Как всегда, лучше всего проверить свои предположения.
Обновление (июнь 2012):
Недавно у меня была возможность а> поговорить с инженерами Apple и б> провести некоторые тесты в реальном мире, и я хотел представить результаты:
Чтобы быть полным, когда я говорю о возврате токена APN, я предполагаю контекст одного bundle identifier/application.
Во-первых, инженеры Apple заявили, что два устройства не должны возвращать один и тот же APN. Несмотря на приведенные ниже комментарии, я не смог определить обстоятельства, при которых это не удается.
Во-вторых, вот последовательность тестирования обновления и результаты:
Начните с iOS4, установленного на iPhone4; устройство резервного копирования в iTunes
Обновление до iOS5
Из предыдущего теста я знаю, что токен APN теперь отличаетсяВосстановите резервную копию на устройстве
Токен APN теперь совпадает с шагом 1.Сброс iOS (чистое устройство)
Токен APN изменяетсяСоздайте резервную копию другого телефона на iTunes и восстановите эту резервную копию на тестовом устройстве; в основном я восстанавливаю резервную копию "wrong", как если бы я переключал телефоны.
Токен APN снова изменяется; кроме того, он отличается и не соответствует токенам ни исходного токена, ни токена "cloned".Восстановите резервную копию "correct" на устройстве.
Токен APN теперь совпадает с шагом 1.Наконец, я обновил телефон до iOS6 (beta2), восстановил резервную копию и повторно протестировал. Как и ожидалось, токен продолжал соответствовать токену на шаге 1.
На данный момент я почти уверен, что токены APN не могут дублироваться между различными устройствами; возможно, это могло произойти как ошибка в более ранних версиях iOS, но я уверен, что iOS5 (и, предположительно, iOS6) правильно обрабатывают токены APN.
Обновление (август 2012)
Я только что понял, что не добавил этого: токены устройства изменятся. Один из разработчиков Apple поделился со мной, что срок действия токенов действительно истекает (по-моему, через 2 года). Для многих целей это достаточно долго, что можно считать инвариантом.
[Я не волнуюсь, если мне придется обновлять свои тестовые сценарии новыми токенами каждые два года, тем более что я каждый год меняю телефоны.]
Я реализую ios APNS, я пишу код в AppDelegate.m и передаю токен устройства моему контроллеру представления( используйте NSUserDefaults) . Затем в контроллере просмотра есть кнопка, когда пользователь нажимает на нее, он отправляет маркер устройства на мой сервер. Но вопрос все-таки встает. Если.
iOS маркер устройства для push-уведомления-это непрозрачный идентификатор устройства. Поставщик не может получить какую-либо информацию, связанную с устройством, из маркера устройства. Основываясь на руководстве по программированию Apple Push Notification, поставщик должен предоставить маркер.
Форма этой фазы доверия токенов гарантирует, что только APNs генерирует токен, который он позже выполнит, и он может убедиться, что токен, переданный ему устройством, является тем же самым токеном, который он ранее предоставил для этого конкретного устройства—и только для этого устройства.
Если пользователь восстанавливает данные резервной копии на новое устройство или переустановит операционную систему, маркер устройства изменяется.
Я только что протестировал его с помощью iOS9 и изменений Push-токенов APN, если я переустановлю приложение.
YES , маркеры устройств могут изменяться.
Каждый раз, когда ваше приложение получает токен, оно должно хранить его. Затем, всякий раз, когда будет получен новый токен (что в конечном итоге произойдет), сравните новый токен с сохраненным токеном и, если они отличаются:
- Обновите локальное хранилище устройства (в том числе, возможно, до nil )
- Обновите все на устройстве, которое использует токен, чтобы быть в курсе нового токена
- Обновите все APIs, которые знают об этом токене, до нового токена.
С практической точки зрения последний шаг, скорее всего, будет нетривиальным. Например, если у вас есть служба, которая отправляет предупреждения о погоде на маркер устройства на основе кода zip, на который подписано это устройство, вам необходимо передать old_token и new_token в указанную службу, чтобы она могла обновить доставку.
Следовательно, вообще говоря, 100% из APIs, принимающий "device token", также должен иметь какое-то средство UPDATE для этого токена. Не создавать для этого-значит создавать для неправильно доставленных и не доставленных уведомлений.
Маркер устройства действительно меняется с iOS 8 и более поздних версий
Маркер устройства-это ваш ключ к отправке push-уведомлений в приложение на определенном устройстве. Маркеры устройств могут изменяться, поэтому ваше приложение должно перерегистрироваться каждый раз при запуске и передавать полученный маркер обратно на сервер. Если вы не обновите маркер устройства, удаленные уведомления могут не попасть на устройство пользователя. Маркеры устройств всегда меняются, когда пользователь восстанавливает резервные копии данных на новое устройство или компьютер или переустанавливает операционную систему. При переносе данных на новое устройство или компьютер пользователь должен запустить приложение один раз, прежде чем удаленные уведомления могут быть доставлены на это устройство.
Я думаю, что стоит упомянуть, поскольку никто этого не делал, что токен меняется после того, как вы позвонили unregisterForRemoteNotifications . Когда вы в следующий раз вызовете registerForRemoteNotifications , токен будет другим. Мне не удалось найти подтверждения этому в документах Apple, но я сам был свидетелем такого поведения. Пожалуйста, имейте это в виду
Но Apple не гарантирует, что он никогда не изменится (поэтому в документации об этом никогда не упоминается). Вам лучше подготовиться к худшему и предположить, что однажды все может измениться. Кроме того, регулярная отправка токена на ваш сервер позволяет вам удалять токены, которые не регистрировались в течение некоторого времени и, вероятно, деинсталлировали ваше приложение или потеряли интерес некоторое время назад (и в документации это указано как желаемое поведение!).
Пользователь устанавливает ваше приложение на новое устройство
Пользователь восстанавливает устройство из резервной копии
Пользователь переустановит операционную систему
Другие системные события
I M P O R T A N T
APNs маркеры устройств имеют переменную длину. Не стоит жестко кодировать их размер.
Ссылки быстро устаревают с apple! поэтому я цитирую то, что сейчас кажется совершенно ясным :
Никогда не кэшируйте маркеры устройств в своем приложении; вместо этого получите их из системы, когда они вам понадобятся. APNs выдает вашему приложению новый токен устройства при наступлении определенных событий. Маркер устройства гарантированно будет отличаться, например, когда пользователь восстанавливает устройство из резервной копии, когда пользователь устанавливает приложение на новое устройство и когда пользователь переустановит операционную систему. Получение маркера вместо того, чтобы полагаться на кэш, гарантирует, что у вас есть текущий маркер устройства, необходимый вашему поставщику для связи с APNs. Когда вы пытаетесь получить маркер устройства, но он не изменился, метод выборки быстро возвращается.
Маркер устройства-это ваш ключ к отправке push-уведомлений в приложение на определенном устройстве. Маркеры устройств могут изменяться, поэтому ваше приложение должно перерегистрироваться каждый раз при запуске и передавать полученный маркер обратно на сервер. Если вы не обновите маркер устройства, удаленные уведомления могут не попасть на устройство пользователя. Маркеры устройств всегда меняются, когда пользователь восстанавливает резервные копии данных на новое устройство или компьютер или переустанавливает операционную систему. При переносе данных на новое устройство или компьютер пользователь должен запустить приложение один раз, прежде чем удаленные уведомления смогут быть доставлены на это устройство.
Никогда не кэшируйте маркер устройства; всегда получайте маркер из системы, когда он вам нужен. Если ваше приложение ранее регистрировалось для удаленных уведомлений, повторный вызов метода registerForRemoteNotifications не влечет за собой никаких дополнительных накладных расходов, а iOS немедленно возвращает существующий маркер устройства делегату приложения. Кроме того, iOS вызывает ваш метод делегата при каждом изменении маркера устройства, а не только в ответ на регистрацию или повторную регистрацию вашего приложения.
По этой ссылке токен устройства
Маркер устройства, включенный в каждый запрос, представляет идентификатор устройства, получающего уведомление. APNs использует маркеры устройств для идентификации каждого уникального приложения и комбинации устройств. Он также использует их для проверки подлинности маршрутизации удаленных уведомлений, отправляемых на устройство. Каждый раз, когда ваше приложение запускается на устройстве, оно извлекает этот токен из APNs и пересылает его вашему поставщику. Ваш провайдер хранит токен и использует его при отправке уведомлений в это конкретное приложение и устройство. Сам токен непрозрачен и постоянен, он меняется только при удалении данных и настроек устройства. Только APNs может декодировать и считывать маркер устройства.
Да , это может измениться. В идеале, когда мы когда-либо получаем токен с помощью метода обратного вызова
- (недействительно)заявка:(UIApplication *)заявка didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
Приложение должно зарегистрировать / обновить токен на удаленном сервере. Это гарантирует, что токен на APNS и ваш сервер будут синхронизированы.
Реле токена устройства при установке приложения.
Это означает, что если вы переустановите приложение, оно изменится ; оно не изменится, если вы сделаете это из резервной копии, ecc обновления iOS..
Правильный способ использовать его, чтобы избежать каких-либо проблем, состоит в том, чтобы получить тот, который указан на NSPAppDelegate при каждом запуске приложения, в методе didRegisterForRemoteNotificationsWithDeviceToken
Похожие вопросы:
Насколько мне известно, как только мы получили маркер устройства от APNS, мы не можем получить его снова. (За исключением того, что резервное копирование данных на новое устройство или компьютер.
Я предоставляю APNS в iOS, и все работает хорошо, Проблема в том, что каждый раз, когда я запускаю приложение, оно дает мне токен устройства, а затем сохраняет его в базе данных MYSQL. мой вопрос .
Я пытаюсь использовать push-сервер Urban Airship APNS development. Когда я запускаю их примерное приложение, мне кажется, что я не могу получить маркер устройства. Что нужно сделать, чтобы.
Когда мы регистрируем устройство с APNS для push-уведомления, мы получаем токен устройства обратно. Есть ли какой-либо срок действия, связанный с этим токеном на APNS? Есть ли какая-то временная.
У нас есть таблица, в которой хранятся токены устройств Apple. Эти таблицы различны для тестирования и для живого приложения. Я хочу обновить эту базу данных вручную с помощью моего токена.
Я реализую ios APNS, я пишу код в AppDelegate.m и передаю токен устройства моему контроллеру представления( используйте NSUserDefaults) . Затем в контроллере просмотра есть кнопка, когда.
iOS маркер устройства для push-уведомления-это непрозрачный идентификатор устройства. Поставщик не может получить какую-либо информацию, связанную с устройством, из маркера устройства. Основываясь.
Я использую push-уведомления Azure и замечаю, что APNS отправляет мне новый токен устройства каждый раз, когда мое приложение запускается. Согласно документации Apple, маркеры устройств, как.
Меняется ли токен устройства push-уведомлений после создания?
Пример, когда приложение обновляется? или в любом другом случае это может измениться ??
Убедитесь, что вы видите этот ответ, поскольку он предоставляет документацию по 4 местам, где изменяется токен устройства
@RobertAltman - Я не думаю, что это вся история. Я видел несколько регистраций в нашей базе данных с совершенно разных устройств с одним и тем же токеном APNS. Прямо сейчас я вижу перед собой iPad 2 и iPhone 3GS, которые отправили нам один и тот же токен. Может ли кто-нибудь еще подтвердить такое поведение? @DougW, это странно. У вас все еще есть подобная проблема? Отредактировал ссылку и опубликовал из последних документов.Форма этой фазы доверия к токенам гарантирует, что только APN генерирует токен, который он позже будет соблюдать, и может гарантировать, что токен, переданный ему устройством, является тем же самым токеном, который он ранее предоставил для этого конкретного устройства - и только для этого устройства.
Если пользователь восстанавливает данные резервной копии на новом устройстве или переустанавливает операционную систему, токен устройства изменяется.
Официальная документация Apple по этому поводу неясна. Я заметил следующее: токен инвариантен для данного устройства, приложения и домена (производственная среда или песочница). Я считаю, что это должно оставаться верным, чтобы система работала надежно. Рассмотрим ситуацию, когда обновление приложения запускает новый токен APN; Если бы я использовал лучшее новое приложение, подобное Twitter, с включенными уведомлениями, что бы произошло, когда я обновил свое приложение из iTunes? Должен ли я ожидать, что он будет продолжать отправлять уведомления, даже если я не запускал приложения с тех пор, как «синхронизирую» обновление на своем устройстве? Изменение приложения не может повлиять на систему APN, поскольку ОС может получать уведомления от вашего имени, даже если вы не запустили обновленное приложение.
Чтобы быть ясным, Apple заявляет: «Приложение должно регистрироваться [на серверах APN] каждый раз при запуске и выдавать своему провайдеру текущий токен». Я полностью согласен; это защитит ваше приложение от неверных предположений или необычных ситуаций.
предостережение: у меня нет окончательных знаний по этому вопросу, только некоторый разумный опыт работы с APN (в качестве стороннего разработчика). Как всегда, лучше всего проверить свои предположения.
Обновление (июнь 2012 г.):
Недавно у меня была возможность 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.
Обновление (август 2012 г.)
Я просто понял , что я не добавил это: лексемы устройства будут меняться. Один из разработчиков Apple поделился со мной, что токены действительно истекают (я думаю, через 2 года). Для многих целей этого достаточно, чтобы его можно было рассматривать как инвариант.
[Я не волнуюсь, если мне придется обновлять свои тестовые сценарии новыми токенами каждые два года, тем более что я каждый год меняю телефоны.]
Читайте также: