J'ai cherché partout sur Internet comment créer des notifications locales avec IOS 8. J'ai trouvé de nombreux articles, mais aucun n'a expliqué comment déterminer si l'utilisateur avait activé ou désactivé des "alertes". Quelqu'un pourrait-il m'aider !!! Je préférerais utiliser l'Objectif C plutôt que Swift.
Vous pouvez le vérifier en utilisant les 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");
}
}
J'espère que cela vous aidera, faites le moi savoir si vous avez besoin de plus d'informations
Pour développer la réponse d'Albert, vous n'êtes pas obligé d'utiliser rawValue
dans Swift. Comme UIUserNotificationType
est conforme à OptionSetType
, il est possible de procéder comme suit:
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
}
}
Vous utilisez le support []
syntaxe pour combiner les types d'options (similaire au bit ou au |
opérateur pour combiner les drapeaux d'options dans d'autres langues).
Swift avec guard
:
guard let settings = UIApplication.sharedApplication().currentUserNotificationSettings() where settings.types != .None else {
return
}
Voici une fonction simple dans Swift qui vérifie si au moins un type de notification est activé.
Prendre plaisir!
static func areNotificationsEnabled() -> Bool {
guard let settings = UIApplication.shared.currentUserNotificationSettings else {
return false
}
return settings.types.intersection([.alert, .badge, .sound]).isEmpty != true
}
Merci Michał Kałużny pour l'inspiration.
Edit: Jetez un oeil à --- simeon's answer .
Dans Swift, vous devez utiliser rawValue
:
let grantedSettings = UIApplication.sharedApplication().currentUserNotificationSettings()
if grantedSettings.types.rawValue & UIUserNotificationType.Alert.rawValue != 0 {
// Alert permission granted
}
Je pense que ce code est plus précis:
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");
}
}
En utilisant la réponse @simeon, Xcode me dit que
'currentUserNotificationSettings' a été déprécié dans iOS 10.0: Utiliser UserNotifications Framework's - [UNUserNotificationCenter getNotificationSettingsWithCompletionHandler:] et - [UNUserNotificationCenter getNotificationCategoriesWithCompletionHandler:]
voici donc la solution en utilisant l'UNUserNotificationCenter pour 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
}
}
Objectif 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;
}
}];