UIApplication.registerForRemoteNotifications() 只能从主线程调用
UIApplication.registerForRemoteNotifications() must be called from main thread only
Xcode 9 (iOS 11) 在注册推送(远程)通知时显示 error/warning。
这是错误信息
这里是代码,我已经试过了:
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
if error == nil{
UIApplication.shared.registerForRemoteNotifications()
}
}
Error/Warning 行:
UIApplication.shared.registerForRemoteNotifications()
如何解决?
TL;DR:
所有 UI 操作都应该在主线程中完成以避免出现问题。如果未能这样做,Main Thread Checker(Xcode 9 中新引入的调试功能)将在运行时产生问题。因此,将您的代码包装在如下所示的主线程块中,以避免出现故障和运行时警告。
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
在 Xcode 版本之前发布。 9、与主线程相关的警告将以文本方式打印在控制台区域。无论如何,您可以选择禁用(不是推荐的方法)诊断设置中的主线程检查器编辑方案.
解释:
Apple 在 Xcode 9 中引入了一个新的调试选项,用于在运行时检查 UIKit 和其他 API 操作 UI 元素的问题。如果在运行时 UIKit API 中的 UI 元素有任何变化,没有主线程块,很可能导致 UI 故障和崩溃。 Main Thread Checker 默认启用以在运行时捕获这些问题。您可以在 Edit Scheme window 中禁用 Main Thread Checker,如下所示,尽管不建议这样做:
如果您有任何较旧的 SDK 或框架,当更新到 Xcode 9 时,您可能会遇到此警告,因为某些 UIKit 方法调用不会包含在主线程中.将它们更新到最新版本将解决问题(如果开发人员知道并修复它)。
引自Xcode 9 beta 发行说明:
- New in Xcode 9 – Main Thread Checker.
- ** 启用检测 UI API
misuse from background thread**
- 检测不是在主线程上进行的 AppKit、UIKit 和 WebKit 方法调用。
- 在调试期间自动启用,可以在方案编辑器的“诊断”选项卡中禁用。
- Main Thread Checker 适用于 Swift 和 C 语言。
在 swift4
您可以通过
解决这个问题
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
希望这会有所帮助...
错误信息很清楚:分派registerForRemoteNotifications
到主线程。
我会使用 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
}
}
对于Objective C,下面的代码有效
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
这也是正确的做法
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 }
在swift 4 或 5
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
在 Objective-C 上
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
Xcode 9 (iOS 11) 在注册推送(远程)通知时显示 error/warning。
这是错误信息
这里是代码,我已经试过了:
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
if error == nil{
UIApplication.shared.registerForRemoteNotifications()
}
}
Error/Warning 行:
UIApplication.shared.registerForRemoteNotifications()
如何解决?
TL;DR:
所有 UI 操作都应该在主线程中完成以避免出现问题。如果未能这样做,Main Thread Checker(Xcode 9 中新引入的调试功能)将在运行时产生问题。因此,将您的代码包装在如下所示的主线程块中,以避免出现故障和运行时警告。
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
在 Xcode 版本之前发布。 9、与主线程相关的警告将以文本方式打印在控制台区域。无论如何,您可以选择禁用(不是推荐的方法)诊断设置中的主线程检查器编辑方案.
解释:
Apple 在 Xcode 9 中引入了一个新的调试选项,用于在运行时检查 UIKit 和其他 API 操作 UI 元素的问题。如果在运行时 UIKit API 中的 UI 元素有任何变化,没有主线程块,很可能导致 UI 故障和崩溃。 Main Thread Checker 默认启用以在运行时捕获这些问题。您可以在 Edit Scheme window 中禁用 Main Thread Checker,如下所示,尽管不建议这样做:
如果您有任何较旧的 SDK 或框架,当更新到 Xcode 9 时,您可能会遇到此警告,因为某些 UIKit 方法调用不会包含在主线程中.将它们更新到最新版本将解决问题(如果开发人员知道并修复它)。
引自Xcode 9 beta 发行说明:
- New in Xcode 9 – Main Thread Checker.
- ** 启用检测 UI API
misuse from background thread**
- 检测不是在主线程上进行的 AppKit、UIKit 和 WebKit 方法调用。
- 在调试期间自动启用,可以在方案编辑器的“诊断”选项卡中禁用。
- Main Thread Checker 适用于 Swift 和 C 语言。
在 swift4
您可以通过
解决这个问题DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
希望这会有所帮助...
错误信息很清楚:分派registerForRemoteNotifications
到主线程。
我会使用 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
}
}
对于Objective C,下面的代码有效
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
这也是正确的做法 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 }
在swift 4 或 5
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
在 Objective-C 上
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});