iPhone registerForRemoteNotificationTypes не генерирует ошибку, но не запускает делегат, который выдает маркер устройства - PullRequest
17 голосов
/ 12 июля 2010

Я занимаюсь разработкой приложения для iPhone, для которого требуется push-уведомление. Я следовал инструкциям по созданию сертификатов и изменению идентификатора приложения. Я не совсем уверен, что сделал это правильно, но я следовал инструкциям. Любая идея, как я могу проверить, все ли в порядке?

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

Кстати: мне кажется, этот вопрос звучал несколько раз. Это, кажется, всегда с сломанным в тюрьме телефоном. Мой телефон НЕ сломан в тюрьме.

Но когда я отлаживаю на iPhone, метод didRegisterForRemoteNotificationsWithDeviceToken никогда не срабатывает. Я буду очень признателен за помощь. Мой код следует.

-(void)applicationDidFinishLaunching:(UIApplication *)application 
{    
   rootController.delegate = self;
   [window addSubview:rootController.view];
   [window makeKeyAndVisible];

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

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
   NSString *str = 
    [NSString stringWithFormat:@"%@",deviceToken];
    NSLog(str);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err 
{ 
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(str);    
}

Ответы [ 7 ]

21 голосов
/ 22 августа 2012

Обычно, если didRegisterForRemoteNotificationsWithDeviceToken никогда не вызывается, это потому, что вы используете профиль обеспечения, который не APS-entitled. Если ваше приложение является рабочим приложением, оно должно быть подписано профилем распространения, чтобы толчки работали. Если это приложение для разработки, вы должны подписать его с профилем разработки.

РЕДАКТИРОВАТЬ: Также стоит отметить, что provisioning profile должен использовать явный идентификатор пакета. Толчки, отправленные на все, что подписано с использованием шаблона с подстановочными знаками, доставляться не будут.

9 голосов
/ 03 декабря 2013

У меня была такая же проблема.

Для меня это была настройка уведомлений для приложения, у которого все отключено.

Если в настройках iOS уведомления приложения отключены, этот метод вызываться не будет.

Как только я включил тип уведомления, он начал работать.

Settings App->Notification Settings->[My App]

2 голосов
/ 08 ноября 2010

Извлечение TN2265 , в котором есть подсказки для устранения проблем с push-уведомлениями. У меня была именно эта проблема сегодня, и оказалось, что WiFi отключен на iPod Touch. Так как вы сказали, что работаете с iPhone. это, вероятно, не так, но стоит ознакомиться с технической запиской для получения дополнительных возможностей.

1 голос
/ 11 августа 2015

Если вы компилируете, используя iOS8 + SDK (например, xcode 6+), то устаревшие методы API iOS7 игнорируются , и вы не получите ошибки.

Вам нужно что-то подобное, если вы хотите поддерживать iOS7 и 8:

// Have to explicitly use the iOS8 api as the deprecated API is silently ignored on iOS8, surprisingly.
if ([UIDevice currentDevice].systemVersion.intValue >= 8) { // iOS8+ API.
    UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge;
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
} else { // iOS7.
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
        UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
}

Если у вас возникли проблемы с отсутствием aps-environment в вашем профиле, вы, по крайней мере, получите полезный отзыв об ошибке с didFailToRegisterForRemoteNotificationsWithError

1 голос
/ 08 мая 2014

Согласно документации Apple «Устранение неполадок с push-уведомлениями» «Если ни делегировать приложение обратного вызова: didRegisterForRemoteNotificationsWithDeviceToken: ни application: didFailToRegisterForRemoteNotificationsWithError: вызывается, это означает, что это соединение еще не установлено.» ... «Система может неПодключение к Интернету ... режим aiplane. "

Я также наблюдаю это поведение, но НЕ из-за отсутствия подключения к Интернету, а потому, что, как указал IrFan, уведомления для приложения были отключены, как только вывключить уведомления, метод срабатывает.

Решение 1) НЕ полагайтесь ни на один из этих методов делегатов, когда-либо вызываемых.2) Если и когда вы получите ответный вызов делегата, действуйте в соответствии с ним.3) Отсутствие сетевого подключения, принудительные уведомления отключены для приложения, APS не включен или?заставит делегатов НЕ быть вызванным.

1 голос
/ 07 августа 2012

Проверьте настройки брандмауэра.

Из Ответ Скотта К :

Если ваше устройство iOS способно использовать сотовую сеть передачи данных, проверьте, что у него есть активный сотовый тарифный план. Отключить Wi-Fi в Настройки и посмотреть, можете ли вы по-прежнему просматривать веб-страницы с помощью Safari, для пример. С другой стороны, если push-сервис использует Wi-Fi, любой межсетевые экраны между вашим устройством или компьютером и Интернетом должны позволять TCP-трафик в / из порта 5223.

0 голосов
/ 04 июня 2018

Я столкнулся с той же проблемой в устройстве iOS 11.3, где не вызывался ни один из методов делегата. Итак, согласно документации Apple: -

https://developer.apple.com/library/content/technotes/tn2265/_index.html

Когда установлено первое приложение с поддержкой push, iOS или OS X пытается установить постоянное сетевое подключение к услуге push, которое будет использоваться всеми приложениями с поддержкой push в системе. Если не делегированы ни приложение обратного вызова: didRegisterForRemoteNotificationsWithDeviceToken: ни application: didFailToRegisterForRemoteNotificationsWithError: это означает, что это соединение еще не установлено.

Далее

Это не обязательно условие ошибки. Система может вообще не иметь подключения к Интернету, потому что она находится вне зоны действия любых вышек сотовой связи или точек доступа Wi-Fi или может находиться в режиме полета. Вместо того, чтобы рассматривать это как ошибку, ваше приложение должно продолжаться в обычном режиме, отключая только те функции, которые зависят от push-уведомлений.

Я попытался подключиться к другой сети и снова начать выполнение операции уведомления о регистрации и вуаля !, это работало как чудо. Итак, я думаю, что была проблема в регистрации для уведомления, которое не вызывало ни один из методов делегата.

...