Push-уведомление не регистрируется в приложении на iOS 13

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

Это ошибка в iOS 13 или я пропустил что-то новое в iOS 13?

Я использую Xcode Beta 6 и iOS 13 beta 8.


person Halil İbrahim YILMAZ    schedule 29.08.2019    source источник
comment
Я уже реализовал didRegisterForRemoteNotificationsWithDeviceToken. Работает на ios 12 или 11.   -  person Halil İbrahim YILMAZ    schedule 01.09.2019
comment
Итак, не могли бы вы добавить свою реализацию didRegisterForRemoteNotificationsWithDeviceToken в вопрос? Трудно сказать, в чем может быть проблема, если мы не видим ваш код   -  person Eugene Berdnikov    schedule 01.09.2019
comment
Привет, есть новости по этому вопросу?   -  person blyabtroi    schedule 06.09.2019
comment
Привет @blyabtroi, я переустановил бета-версию iOS 13, и это сработало.   -  person Halil İbrahim YILMAZ    schedule 06.09.2019


Ответы (4)


Вышеупомянутая проблема также может быть решена путем повторного подключения Wi-Fi или переключения между Wi-Fi и сотовыми данными.

Более того, следующие изменения в iOS 13 затронули реализацию push-уведомлений.

До iOS 13 многие из нас делали

(deviceToken as NSData).description 
// Used to return as follows

"<965b251c 6cb1926d e3cb366f dfb16ddd e6b9086a 8a3cac9e 5f857679 376eab7C>"

let tokenData = deviceToken as NSData
let token = tokenData.description

let token = "\(deviceToken)".replacingOccurrences(of: " ", with: "")
                            .replacingOccurrences(of: "<", with: "")
                            .replacingOccurrences(of: ">", with: "")

В iOS 13 Apple изменила реализацию своего метода описания для класса NSData. Итак, возвращается

"{length = 32, bytes = 0x965b251c 6cb1926d e3cb366f dfb16ddd ... 5f857679 376eab7c }" // in iOS 13.

Что в итоге нарушило реализацию push-уведомлений для многих приложений.

Отныне, если вам нужно преобразовать токен устройства регистрации push-уведомлений в строковое представление в кодировке Base16/шестнадцатеричном формате, вы должны сделать следующее для языка Swift.

let deviceTokenString = deviceToken.map { String(format: "%02x", $0) 
}.joined()

Для цели C используйте следующий код

- (NSString *)hexadecimalStringFromData:(NSData *)deviceToken {
  NSUInteger dataLength = deviceToken.length;
  if (dataLength == 0) {
    return nil;
  }

  const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (NSInteger index = 0; index < dataLength; ++index) {
    [hexString appendFormat:@"%02x", dataBuffer[index]];
  }
  return [hexString copy];
}

Я наткнулся на исчерпывающую статью по заданной теме https://nshipster.com/apns-device-tokens/

person Mihir    schedule 16.10.2019
comment
Спасибо за это предложение, но запрос другой. Почему в iOS13 больше не вызывается didRegisterForRemoteNotificationsWithDeviceToken? у меня такая же проблема сейчас - person Ugo Chirico; 26.10.2019
comment
Вы пробовали переподключить Wi-Fi? Мы столкнулись с аналогичной проблемой, и у нас сработало переподключение Wi-Fi. - person Mihir; 05.11.2019
comment
Решение, предоставленное @Mihir, работает для получения недопустимого токена устройства на iOS13 + Xcode11 с token.description. Если мы создали приложение с Xcode 10.1 и запустили его на iOS13, мы получим правильное значение из token.description. - person Abhay; 12.12.2019
comment
Это совершенно не связано с заданным вопросом. Если метод didRegisterForRemoteNotificationsWithDeviceToken никогда не вызывается, формат данных, передаваемых в этот вызов, не имеет значения. - person Kendall Helmstetter Gelner; 11.02.2020

Как я понял, попробовав много вещей по этой проблеме, это: иногда iOS принудительно устанавливает тип соединения для регистрации токена устройства на сервере Apple.

Если вы находитесь в сети WI-FI, а didRegisterForRemoteNotificationsWithDeviceToken не вызывается, даже если вы уверены, что реализуете поток удаленных уведомлений, попробуйте переключить 3G или 4G. Если это невозможно (тестовое устройство без SIM-карты), попробуйте перейти в режим полета и активировать беспроводную связь (что решило нашу проблему).

Если вы используете 3G - 4G, попробуйте переключиться на беспроводное соединение (могут быть проблемы, если вы используете vpn, прокси и т. д. сначала отключите их все).

Если другие пользователи Stackoverflow не предложили удалить приложение, а затем перезагрузить устройство.

person Canberk Ersoy    schedule 23.12.2019

Если didRegisterForRemoteNotificationsWithDeviceToken вообще не срабатывает, попробуйте это.

Я много раз пытался решить эту проблему с моей сетью Wi-Fi, но это не решило. Поэтому я переключил свою сеть на сотовые данные, и didRegisterForRemoteNotificationsWithDeviceToken снова начал срабатывать.

Кроме того, если вы использовали подключение к Интернету в MAC для совместного использования с помощью USB. Выключите его и подключите свой IPhone к обычному Wi-Fi или мобильным данным.

person Amal T S    schedule 03.12.2019
comment
К сожалению, не повезло с этим решением. - person Yedy; 17.12.2019
comment
Это сработало для меня. Однако, если вы использовали подключение к Интернету в MAC для совместного использования с помощью USB. Выключите его и подключите свой IPhone к обычному Wi-Fi или мобильным данным. - person Amal T S; 17.12.2019

если вы используете тестовое устройство (без сим-карты), попробуйте вставить сим-карту и установить приложение и дать , у меня это сработало.

person i'm SRK    schedule 24.02.2020