App的设置界面通常会有“开启通知”这项功能,这个需要在跳转设置页面的时候就进行判断,如果当前是已开启的状态,多数app就直接隐藏系统通知这一行功能了,如果是未开启,则显示这项功能,并点击可跳转到手机系统设置的app通知开启界面。
判断通知功能是否开启:
///判断通知权限是否已开启
if (@available(iOS 10.0, *)) {
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied || settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
// 用户未授权开启通知
dispatch_async(dispatch_get_main_queue(), ^{
///用户未开启通知功能
isOpenNoti = NO;
//更新列表数组的数量和内容(比如通知这一行数据还要不要)
//刷新列表
});
}else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
//用户已授权开启通知
dispatch_async(dispatch_get_main_queue(), ^{
///用户已开启通知功能
isOpenNoti = YES;
//更新列表数组的数量和内容(比如通知这一行数据还要不要)
//刷新列表
});
}
}];
} else {
//iOS 10 以下系统版本询权方式
if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIRemoteNotificationTypeNone) {
dispatch_async(dispatch_get_main_queue(), ^{
///未开启通知
isOpenNoti = NO;
//更新列表数组的数量和内容(比如通知这一行数据还要不要)
//刷新列表
});
}else {
dispatch_async(dispatch_get_main_queue(), ^{
///用户已开启通知功能
isOpenNoti = YES;
//更新列表数组的数量和内容(比如通知这一行数据还要不要)
//刷新列表
});
}
}
由于通知状态是异步获取的,所以需要在获取了用户通知状态后切回主线程的block内根据通知状态更新列表数组的内容(分组数或某个分组的个数),然后刷新列表。
如果当前用户未开启通知功能,点击“开启通知”这一行,跳转到系统设置中app对应的权限列表进行开启
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=NOTIFICATIONS_ID&path=App的BundleID"] options:@{} completionHandler:nil];
}