【Xcode/Swift】紫の警告の対応方法:UIApplication. registerForRemoteNotifications() must be used from main thread only

警告内容

通知の許可アラートを表示するコードで、紫で以下のような警告が表示された。

UIApplication.registerForRemoteNotifications() must be used from main thread only

原因

原因は、UIApplication.registerForRemoteNotifications()をメインスレッドで実行していなかったから。

ちなみに、紫のエラーは、Xcode 9で新しく導入されたデバッグ機能(メインスレッドチェッカー)で、UI操作をメインスレッドで実行していない場合に起きる警告らしい。

対応方法

DispatchQueue.main.async {で囲うことで、メインスレッドで実行できるので以下のように修正する。

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