Xcode 升级到 Xcode 9后,集成时若提示下述错误:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您遇到的问题是由于在非主线程(后台线程)调用了UI相关的API,这在Xcode 9及之后的版本中会触发警告或错误。根据您的描述和代码示例,问题在于registerForRemoteNotifications
方法被直接在回调中执行,而这个回调可能不在主线程上运行。
您已经正确地展示了如何修正这个问题:通过使用dispatch_async
函数将注册远程通知的操作切换到主线程执行。这样做可以确保所有与UI相关的操作都在主线程上进行,避免了Xcode的警告或错误提示。下面是修正后的代码段:
_notificationCenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"User authorized notification.");
// 确保在主线程上执行注册操作
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
} else {
NSLog(@"User denied notification.");
}
}];
这段代码中,dispatch_get_main_queue()
获取到了主线程的队列,然后通过dispatch_async
异步地在这个队列上执行了注册远程通知的操作,从而符合了iOS开发的最佳实践,即只在主线程上处理UI更新和UI相关的API调用。