这几天用到了iOS10消息通知的一个获取消息通知权限是否打开的功能,网上相关教程很多,在此不赘述,只是我碰到了一个问题,就是当我通过[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied)
{
[self noNotificationPermission];
});
}
}];判断没有开启的时候需要弹窗通知弹窗通知用户,但是经常会出现弹窗出现了,但是字符么有显示,但是过会又会出现,开始是怀疑是延迟加载的问题,后来想到了这个地方是用的一个block,也许设计到异步线程的问题,然后我就在block里面用gcd,把弹窗显示的代码加到主线程里面显示,结果就完美的解决了这个问题。代码如下:
@weakify(self);
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied)
{
dispatch_async(dispatch_get_main_queue(), ^{
@strongify(self);
[self noNotificationPermission];
});
}
}];
这个问题提醒了我们如果以后涉及在系统的block回调里面显示UI,最好是把UI显示的代码加到主线程里面去,因为这个block很有可能就是一个异步线程,UI显示会出现各种加载问题,一般都是加载出现的时间问题,需要给碰到同样困惑的朋友有所帮助,另外贴出iOS10和iOS10以下判断系统是否打开消息通知的开关,代码如下:
//判断是否开启了推送
if (__IPHONE_10_0)
{
@weakify(self);
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied)
{
dispatch_async(dispatch_get_main_queue(), ^{
@strongify(self);
[self noNotificationPermission];
});
}
}];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 10.0)
{
UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
if (UIUserNotificationTypeNone == settings.types)
{
[self noNotificationPermission];
}
}
noNotificationPermission是自己写的一个显示弹窗的函数