IOS: как зарегистрироваться для push-уведомлений?

Я пытаюсь реализовать Push Notifications для моего приложения iOS 5 в руководстве от Ray Wenderlich: http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12.

Я добавил следующее в мой метод didFinishLaunchingWithOptions в приложении AppDelegate:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
    (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

При запуске приложения на моем устройстве (а не в симуляторе) всплывающее/предупреждающее сообщение о том, что я принимаю push-уведомления, не отображается. Я вставил точку отладки в строке, и я вижу, что вызывается registerForRemoteNotificationTypes.

Почему ничего не происходит?

Ответ 1

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

Вы также можете перейти в приложение настройки в центр уведомлений, посмотреть, включено ли ваше приложение в список.

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

Ответ 2

У меня была эта точная проблема (с тем же учебником), и я обнаружил, что я подписываю код с неправильным профилем подготовки.

В частности, я только активировал push-оповещения "Производство" для моего приложения (так как я не хотел делать сертификаты дважды и т.д.), но мои настройки сборки в Xcode использовали "iPhone Development" как стандартную "идентификацию подписи кода" для "Release", а не "iPhone Distribution", как и следовало ожидать. Это, по-видимому, значение по умолчанию в моем тестовом приложении.

Надеюсь, я могу остановить другого, теряющего время на ту же проблему.

Ответ 3

Из iOS 8 появился новый метод для этого. Прямо от UIApplication.h:

- (void)registerForRemoteNotifications NS_AVAILABLE_IOS(8_0);

Вызов этого приведет к вызову application:didRegisterForRemoteNotificationsWithDeviceToken: или application:didFailToRegisterForRemoteNotificationsWithError: для делегирования приложения.

Примечание: эти обратные вызовы будут выполнены только в том случае, если приложение успешно зарегистрировалось для уведомлений пользователей с помощью registerUserNotificationSettings: или если оно включено для обновления фонового приложения.