Commit 174dfb21 by Tonghdj

[iOS] add NotificationPermissionStrategy

parent f24a2aa1
...@@ -22,6 +22,7 @@ typedef NS_ENUM(int, PermissionGroup) { ...@@ -22,6 +22,7 @@ typedef NS_ENUM(int, PermissionGroup) {
PermissionGroupSpeech, PermissionGroupSpeech,
PermissionGroupStorage, PermissionGroupStorage,
PermissionGroupIgnoreBatteryOptimizations, PermissionGroupIgnoreBatteryOptimizations,
PermissionGroupNotification,
PermissionGroupUnknown, PermissionGroupUnknown,
}; };
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#import "SensorPermissionStrategy.h" #import "SensorPermissionStrategy.h"
#import "SpeechPermissionStrategy.h" #import "SpeechPermissionStrategy.h"
#import "UnknownPermissionStrategy.h" #import "UnknownPermissionStrategy.h"
#import "NotificationPermissionStrategy.h"
#import "PermissionHandlerEnums.h" #import "PermissionHandlerEnums.h"
#import "Codec.h" #import "Codec.h"
......
...@@ -99,6 +99,8 @@ ...@@ -99,6 +99,8 @@
return [SensorPermissionStrategy new]; return [SensorPermissionStrategy new];
case PermissionGroupSpeech: case PermissionGroupSpeech:
return [SpeechPermissionStrategy new]; return [SpeechPermissionStrategy new];
case PermissionGroupNotification:
return [NotificationPermissionStrategy new];
default: default:
return [UnknownPermissionStrategy new]; return [UnknownPermissionStrategy new];
} }
......
//
// NotificationPermissionStrategy.h
// permission_handler
//
// Created by Tong on 2019/10/21.
//
#import <Foundation/Foundation.h>
#import <UserNotifications/UserNotifications.h>
#import "PermissionStrategy.h"
@interface NotificationPermissionStrategy : NSObject <PermissionStrategy>
@end
//
// NotificationPermissionStrategy.m
// permission_handler
//
// Created by Tong on 2019/10/21.
//
#import "NotificationPermissionStrategy.h"
@implementation NotificationPermissionStrategy
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
return [NotificationPermissionStrategy permissionStatus];
}
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
return ServiceStatusNotApplicable;
}
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusUnknown) {
completionHandler(status);
return;
}
if(@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions authorizationOptions = 0;
authorizationOptions += UNAuthorizationOptionSound;
authorizationOptions += UNAuthorizationOptionAlert;
authorizationOptions += UNAuthorizationOptionBadge;
[center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted || error != nil) {
completionHandler(PermissionStatusDenied);
return;
}
completionHandler(PermissionStatusGranted);
}];
} else {
UIUserNotificationType notificationTypes = 0;
notificationTypes |= UIUserNotificationTypeSound;
notificationTypes |= UIUserNotificationTypeAlert;
notificationTypes |= UIUserNotificationTypeBadge;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
completionHandler(PermissionStatusGranted);
}
}
+ (PermissionStatus)permissionStatus {
__block PermissionStatus permissionStatus = PermissionStatusGranted;
if (@available(iOS 10 , *)) {
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
permissionStatus = PermissionStatusDenied;
} else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
permissionStatus = PermissionStatusUnknown;
}
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
} else if (@available(iOS 8 , *)) {
UIUserNotificationSettings * setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
if (setting.types == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied;
} else {
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (type == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied;
}
return permissionStatus;
}
@end
...@@ -149,8 +149,12 @@ class PermissionGroup { ...@@ -149,8 +149,12 @@ class PermissionGroup {
static const PermissionGroup ignoreBatteryOptimizations = static const PermissionGroup ignoreBatteryOptimizations =
PermissionGroup._(15); PermissionGroup._(15);
/// Android: Notification
/// iOS: Notification
static const PermissionGroup notification = PermissionGroup._(16);
/// The unknown permission only used for return type, never requested /// The unknown permission only used for return type, never requested
static const PermissionGroup unknown = PermissionGroup._(16); static const PermissionGroup unknown = PermissionGroup._(17);
static const List<PermissionGroup> values = <PermissionGroup>[ static const List<PermissionGroup> values = <PermissionGroup>[
calendar, calendar,
...@@ -169,6 +173,7 @@ class PermissionGroup { ...@@ -169,6 +173,7 @@ class PermissionGroup {
speech, speech,
storage, storage,
ignoreBatteryOptimizations, ignoreBatteryOptimizations,
notification,
unknown, unknown,
]; ];
...@@ -189,6 +194,7 @@ class PermissionGroup { ...@@ -189,6 +194,7 @@ class PermissionGroup {
'speech', 'speech',
'storage', 'storage',
'ignoreBatteryOptimizations', 'ignoreBatteryOptimizations',
'notification',
'unknown', 'unknown',
]; ];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment