TL; DR:
問題を回避するために、すべてのUI操作はメインスレッドで実行する必要があります。そうしなかった場合、メインスレッドチェッカー(XCode 9で新しく導入されたデバッグ機能)は実行時に問題を引き起こします。したがって、グリッチや実行時の警告を回避するために、コードを以下のようにメインスレッドブロックでラップします。
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
ver。より前のXcodeリリースでは 9、メインスレッドに関連する警告は、コンソール領域にテキストで出力されます。とにかく、オプションで、編集スキームの診断設定でメインスレッドチェッカーを無効にすることができます(推奨されるアプローチではありません)。
説明:
Appleは、UIKitおよびUI要素を操作する他のAPIのランタイムでの問題をチェックするために、XCode9に新しいデバッグオプションを導入しました。メインスレッドブロックなしで、実行時にUIKit APIからUI要素に変更があった場合、UIの不具合やクラッシュが発生する可能性が高くなります。メインスレッドチェッカーは、実行時にこれらの問題をキャッチするためにデフォルトで有効になっています。以下のように、[スキームの編集]ウィンドウでメインスレッドチェッカーを無効にすることができますが、実際には無効にすることはお勧めしません。
古いSDKまたはフレームワークを使用している場合、Xcode 9に更新すると、UIKitメソッド呼び出しの一部がメインスレッドでラップされていないため、この警告が表示される場合があります。それらを最新バージョンに更新すると、問題が修正されます(開発者がそれを認識して修正した場合)。
XCode 9ベータリリースノートからの引用:
- Xcode 9の新機能–メインスレッドチェッカー。
- バックグラウンドスレッドからのUIAPIの誤用の検出を有効にする
- メインスレッドで行われていないAppKit、UIKit、およびWebKitメソッド呼び出しを検出します。
- デバッグ中に自動的に有効になり、スキームエディタの[診断]タブで無効にできます。
- メインスレッドチェッカーはSwiftおよびC言語で動作します。
UIApplication.shared.registerForRemoteNotifications()
メインスレッドでラップする必要があります。:) ...メインスレッドでそれを呼び出す方法をグーグルさせる