App的設(shè)置界面通常會有“開啟通知”這項功能,這個需要在跳轉(zhuǎn)設(shè)置頁面的時候就進行判斷,如果當(dāng)前是已開啟的狀態(tài),多數(shù)app就直接隱藏系統(tǒng)通知這一行功能了,如果是未開啟,則顯示這項功能,并點擊可跳轉(zhuǎn)到手機系統(tǒng)設(shè)置的app通知開啟界面。
判斷通知功能是否開啟:
///判斷通知權(quán)限是否已開啟
if (@available(iOS 10.0, *)) {
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied || settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
// 用戶未授權(quán)開啟通知
dispatch_async(dispatch_get_main_queue(), ^{
///用戶未開啟通知功能
isOpenNoti = NO;
//更新列表數(shù)組的數(shù)量和內(nèi)容(比如通知這一行數(shù)據(jù)還要不要)
//刷新列表
});
}else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
//用戶已授權(quán)開啟通知
dispatch_async(dispatch_get_main_queue(), ^{
///用戶已開啟通知功能
isOpenNoti = YES;
//更新列表數(shù)組的數(shù)量和內(nèi)容(比如通知這一行數(shù)據(jù)還要不要)
//刷新列表
});
}
}];
} else {
//iOS 10 以下系統(tǒng)版本詢權(quán)方式
if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIRemoteNotificationTypeNone) {
dispatch_async(dispatch_get_main_queue(), ^{
///未開啟通知
isOpenNoti = NO;
//更新列表數(shù)組的數(shù)量和內(nèi)容(比如通知這一行數(shù)據(jù)還要不要)
//刷新列表
});
}else {
dispatch_async(dispatch_get_main_queue(), ^{
///用戶已開啟通知功能
isOpenNoti = YES;
//更新列表數(shù)組的數(shù)量和內(nèi)容(比如通知這一行數(shù)據(jù)還要不要)
//刷新列表
});
}
}
由于通知狀態(tài)是異步獲取的,所以需要在獲取了用戶通知狀態(tài)后切回主線程的block內(nèi)根據(jù)通知狀態(tài)更新列表數(shù)組的內(nèi)容(分組數(shù)或某個分組的個數(shù)),然后刷新列表。
如果當(dāng)前用戶未開啟通知功能,點擊“開啟通知”這一行,跳轉(zhuǎn)到系統(tǒng)設(shè)置中app對應(yīng)的權(quán)限列表進行開啟
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];
}