UIApplication.registerForRemoteNotifications () необходимо вызывать только из основного streamа

Xcode 9 (iOS 11), показывающий мне ошибку / предупреждение при регистрации для Push (удаленного) уведомления.

Вот сообщение об ошибке

введите описание изображения здесь

И вот код, я пробовал:

let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in if error == nil{ UIApplication.shared.registerForRemoteNotifications() } } 

Линия ошибки / предупреждения:

UIApplication.shared.registerForRemoteNotifications ()

Как это решить?

В быстрых4

Вы можете решить эту проблему с помощью

 DispatchQueue.main.async(execute: { UIApplication.shared.registerForRemoteNotifications() }) 

Надеюсь, это поможет …

Для цели C приведен код ниже

  dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication sharedApplication] registerForRemoteNotifications]; }); 

TL; DR:
Все манипуляции с пользовательским интерфейсом должны выполняться в главной теме, чтобы избежать проблем. Если этого не сделать, Main Thread Checker (недавно введенная функция отладки в XCode 9) вызовет проблемы во время выполнения. Поэтому оберните свой код в блоке Main Thread, как показано ниже, чтобы избежать сбоев и предупреждений во время выполнения.

 DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } 

В версиях Xcode перед версией. 9, предупреждения, связанные с основным streamом, будут печататься в текстовой области консоли. Во всяком случае, вы можете опционально отключить ( не рекомендуемый подход ) Main Thread Checker в настройках диагностики в Edit Scheme .

Объяснение:

Apple представила новую опцию отладки в XCode 9 для проверки проблем в Runtime для UIKit и других API, которые управляют элементами пользовательского интерфейса. Если в пользовательском интерфейсе UIKit есть какие-либо изменения в интерфейсе UIKit API, без блока Main thread, это может вызвать сбои пользовательского интерфейса и сбои. По умолчанию функция Main Thread Checker включена, чтобы уловить эти проблемы во время выполнения. Вы можете отключить Main Thread Checker в окне Edit Scheme, как показано ниже, хотя на самом деле это не рекомендуется:

Отключить Main Thread Checker

Если у вас есть старые SDK или Framework, при обновлении до Xcode 9 вы можете столкнуться с этим предупреждением, поскольку некоторые вызовы метода UIKit не были бы обернуты в главный stream. Обновление их до последней версии устранит проблему (если разработчик знает об этом и исправил ее).

Цитата из примечаний к выпуску XCode 9:

  • Новое в Xcode 9 – Main Thread Checker.
    • Включить обнаружение неправильного использования API-интерфейса API из фонового streamа
    • Обнаруживает вызовы метода AppKit, UIKit и WebKit, которые не выполняются в основном streamе.
    • Автоматически включается во время отладки и может быть отключена на вкладке «Диагностика» редактора схем.
    • Main Thread Checker работает с языками Swift и C.

Сообщение об ошибке довольно ясно: отправьте registerForRemoteNotifications в основной stream.

Я бы использовал granted параметр и обрабатывал error соответственно

 center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in if granted { DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { print(error!) // handle the error } } 

Это также правильный способ сделать в Swift 4.0

 UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {(granted,error) in if granted{ DispatchQueue.main.async { application.registerForRemoteNotifications() } } }) 

Надеюсь, это поможет

 DispatchQueue.main.async(execute: { UIApplication.shared.registerForRemoteNotifications() }) 

Это то, что сработало для меня. Предоставлено @ Mason11987 в принятом комментарии выше.

 DispatchQueue.main.async() { code } 
Interesting Posts

“App-release.apk”, как изменить это имя apk, созданное по умолчанию

Получение измененного имени из измененного имени

Неправильное отображение свойств объекта отчета Javascript Console

Очень медленная скорость DSL (Ethernet)

Поиск конкретных цветов пикселей BitmapImage

Программно изменить значение цветового ресурса, полученного из ответа API

Есть ли альтернатива string.Replace, которая не чувствительна к регистру?

Как подключиться к беспроводной сети, используя только командную строку в Linux?

Обнаружение изменения атрибута значения атрибута, который я сделал

Автоматически открывать NERDTree на вкладке «КАЖДЫЙ»

Получить указатель функции из std :: function при использовании std :: bind

Если вы переписываете поле в подclassе classа, подclass имеет два поля с тем же именем (и другого типа)?

Создание пользовательского editText с функцией тегов

Как использовать компонент Delphi TWebbrowser, работающий в режиме IE9?

Каков максимальный размер кучи с 64-битной JVM?

Давайте будем гением компьютера.