Проверьте, включены ли локальные уведомления в IOS 8
Я искал во всем Интернете, как создавать локальные уведомления с помощью IOS 8. Я нашел много статей, но ни одна из них не объясняла, как определить, был ли пользователь включен или отключен "оповещения". Может кто-нибудь, пожалуйста, помогите мне! Я бы предпочел использовать Objective C вместо Swift.
8 ответов
Вы можете проверить это с помощью UIApplication
currentUserNotificationSettings
if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){ // Check it's iOS 8 and above
UIUserNotificationSettings *grantedSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
if (grantedSettings.types == UIUserNotificationTypeNone) {
NSLog(@"No permiossion granted");
}
else if (grantedSettings.types & UIUserNotificationTypeSound & UIUserNotificationTypeAlert ){
NSLog(@"Sound and alert permissions ");
}
else if (grantedSettings.types & UIUserNotificationTypeAlert){
NSLog(@"Alert Permission Granted");
}
}
Надеюсь, это поможет, дайте мне знать, если вам нужно больше информации
Чтобы расширить ответ Альберта, вы не обязаны использовать rawValue
в Свифте. Так как UIUserNotificationType
соответствует OptionSetType
можно сделать следующее:
if let settings = UIApplication.shared.currentUserNotificationSettings {
if settings.types.contains([.alert, .sound]) {
//Have alert and sound permissions
} else if settings.types.contains(.alert) {
//Have alert permission
}
}
Вы используете кронштейн []
синтаксис для объединения типов опций (аналогично побитовой или |
оператор объединения флагов опций на других языках).
Вот простая функция в Swift 3, которая проверяет, включен ли хотя бы один тип уведомлений.
Наслаждайтесь!
static func areNotificationsEnabled() -> Bool {
guard let settings = UIApplication.shared.currentUserNotificationSettings else {
return false
}
return settings.types.intersection([.alert, .badge, .sound]).isEmpty != true
}
Спасибо Михал Колунны за вдохновение.
Свифт с guard
:
guard let settings = UIApplication.sharedApplication().currentUserNotificationSettings() where settings.types != .None else {
return
}
Изменить: Посмотрите на ответ@ Симеон.
В Swift вам нужно использовать rawValue
:
let grantedSettings = UIApplication.sharedApplication().currentUserNotificationSettings()
if grantedSettings.types.rawValue & UIUserNotificationType.Alert.rawValue != 0 {
// Alert permission granted
}
Используя ответ @simeon, Xcode говорит мне, что
'currentUserNotificationSettings' устарел в iOS 10.0: используйте UserNotification Framework's -[UNUserNotificationCenter getNotificationSettingsWithCompletionHandler:] и -[UNUserNotificationCenter getNotificationCategoriesWithCompletionHandler:]
Итак, вот решение, использующее UNUserNotificationCenter для Swift 4:
UNUserNotificationCenter.current().getNotificationSettings(){ (settings) in
switch settings.alertSetting{
case .enabled:
//Permissions are granted
case .disabled:
//Permissions are not granted
case .notSupported:
//The application does not support this notification type
}
}
Я думаю, что этот код является более точным:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
if (types & UIUserNotificationTypeBadge) {
NSLog(@"Badge permission");
}
if (types & UIUserNotificationTypeSound){
NSLog(@"Sound permission");
}
if (types & UIUserNotificationTypeAlert){
NSLog(@"Alert permission");
}
}
Цель C + iOS 10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
switch (settings.authorizationStatus) {
case UNAuthorizationStatusNotDetermined:
break;
case UNAuthorizationStatusDenied:
break;
case UNAuthorizationStatusAuthorized:
break;
default:
break;
}
}];