Push-уведомления Apple - получение пустого push-токена из производственного приложения - push-токены будут отправлены после исправления проблемы с профилем подготовки

Мы добавили получение push-уведомлений в приложение для iPhone. Все работало в среде test / sandbox, мы получали идентификаторы токенов из приложения и могли отправлять push-уведомления с нашего сервера.

Но теперь приложение одобрено и вышло из Appstore, и мы получали пустые идентификаторы push-токенов / уведомлений, отправленные на наш сервер. У нас их уже более 600 ... Обратите внимание, что конечные пользователи получают всплывающее окно, подтверждающее получение уведомлений в приложении, приложение просто отправляет пустые токены на наш сервер после утверждения. Так что, вероятно, сервер APNS раздает пустые токены.

Следующая проблема показала нам, что это, вероятно, связано с отсутствием права на «push-уведомление» в профиле подготовки, который мы использовали для создания сборки для магазина приложений: Как проверить, включены ли push-уведомления в профиле подготовки распространения iOS?

Отсутствие прав возникло из-за ошибки на веб-сайте предварительной поддержки Apple, но после «Измените любой существующий профиль перед загрузкой нового», как указано в следующей статье http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ProvisioningDevelopment/ProvisioningDevelopment.html

Теперь у нас есть правильное разрешение в нашем файле .mobileprovision:

<key>Entitlements</key>
<dict>
 ..   
 <key>aps-environment</key>
 <string>production</string>
 ..

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

Я надеюсь, что это может помочь другим. Но теперь, чтобы перейти к моему актуальному вопросу: начнем ли мы получать новые push-токены также для более 600 пользователей, которые уже загрузили текущую версию, когда они установят следующее обновление из магазина? Или нам нужно добавить начальный код в наше приложение? Метод registerForRemoteNotifications сейчас вызывается только при запуске приложения. Будет ли он также срабатывать, когда идентификатор push-токена изменяется с пустого ('') на фактический токен? Конечно, мы не хотим ждать еще одну (небольшую) неделю для утверждения нового AppStore и только потом узнаем, что push-уведомления по-прежнему не работают для некоторых пользователей. Я надеюсь, что какой-нибудь эксперт нам расскажет.

Примечание. Мы используем приложение для iPhone, разработанное в MonoTouch, и используем (старую) библиотеку APNS-Sharp для отправки уведомлений с нашего сервера, но я не думаю, что эти детали имеют отношение к этой проблеме.


person Bart    schedule 05.03.2013    source источник


Ответы (1)


Когда эти 600+ пользователей установят следующее обновление и снова запустят приложение, ваше приложение вызовет registerForRemoteNotifications (поскольку вы сказали, что вызываете его при запуске) и получит непустой токен устройства (когда вызывается application:didRegisterForRemoteNotificationsWithDeviceToken:). Apple заявляет в своих документах, что вы всегда должны вызывать этот метод при запуске вместо использования кэшированной копии токена устройства, потому что токен устройства не гарантированно останется прежним. Так что проблем возникнуть не должно.

Вот соответствующая цитата из документов APNS:

Приложение должно регистрироваться каждый раз при запуске и выдавать своему провайдеру текущий токен. Он вызывает метод registerForRemoteNotificationTypes:, чтобы начать процесс регистрации. Параметр этого метода принимает битовую маску UIRemoteNotificationType (или, для OS X, NSRemoteNotificationType), которая определяет начальные типы уведомлений, которые приложение желает получать, например значки и звуки, но не предупреждающие сообщения. В iOS пользователи могут после этого изменить включенные типы уведомлений в предпочтении Уведомления в приложении «Настройки». Как в iOS, так и в OS X вы можете получить текущие активные типы уведомлений, вызвав метод enabledRemoteNotificationTypes. Операционная система не отображает значки, не отображает предупреждающие сообщения и не воспроизводит звуки предупреждений, если какой-либо из этих типов уведомлений не включен, даже если они указаны в полезной нагрузке уведомления.

Это также актуально:

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

person Eran    schedule 05.03.2013
comment
Спасибо @Eran, отличный ответ! Я снова подробно проверил свой код iPhone (на самом деле это было какое-то время), и я думаю, действительно, токен push должен быть отправлен нам при изменении с пустого на правильное значение. Я подожду и назову ваш ответ окончательным, на случай, если встретятся действительно великолепные ответы, а также до тех пор, пока наше приложение не выйдет из магазина и не заработает. Насколько я понимаю, это можно сделать только один раз: P. - person Bart; 06.03.2013
comment
Да, это работает! Никаких изменений кода в приложении не потребовалось. Мы начали получать push-токены от пользователей после выхода следующей версии. Приложение, конечно, сбрасывается / перезапускается после обновления, поэтому при запуске вызывается RegisterForRemoteNotifications, и с новым правом теперь APNS ДЕЙСТВИТЕЛЬНО дает нам токены. - person Bart; 24.03.2013