RNPermissionHandlerNotifications.m 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #import "RNPermissionHandlerNotifications.h"
  2. @import UserNotifications;
  3. @import UIKit;
  4. @implementation RNPermissionHandlerNotifications
  5. - (void)checkWithResolver:(void (^)(RNPermissionStatus status))resolve
  6. withRejecter:(void (__unused ^)(NSError *error))reject {
  7. if (@available(iOS 10.0, *)) {
  8. [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
  9. switch (settings.authorizationStatus) {
  10. case UNAuthorizationStatusNotDetermined:
  11. return resolve(RNPermissionStatusNotDetermined);
  12. case UNAuthorizationStatusDenied:
  13. return resolve(RNPermissionStatusDenied);
  14. #ifdef __IPHONE_12_0
  15. case UNAuthorizationStatusProvisional:
  16. #endif
  17. case UNAuthorizationStatusAuthorized:
  18. return resolve(RNPermissionStatusAuthorized);
  19. }
  20. }];
  21. } else {
  22. UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
  23. if (settings == nil || settings.types == UIUserNotificationTypeNone) {
  24. resolve(RNPermissionStatusNotDetermined);
  25. } else {
  26. resolve(RNPermissionStatusAuthorized);
  27. }
  28. }
  29. }
  30. - (void)requestWithOptions:(NSDictionary * _Nullable)options
  31. withResolver:(void (^)(RNPermissionStatus status))resolve
  32. withRejecter:(void (^)(NSError *error))reject {
  33. if (@available(iOS 10.0, *)) {
  34. UNAuthorizationOptions toRequest = UNAuthorizationOptionNone;
  35. if (options != nil) {
  36. NSArray<NSString *> *notificationOptions = [options objectForKey:@"notificationOptions"];
  37. if (notificationOptions != nil && [notificationOptions isKindOfClass:[NSArray class]]) {
  38. #if RCT_DEV
  39. // @TODO check if it's possible to use RCTConvert + RCT_ENUM_CONVERTER
  40. // https://developer.apple.com/documentation/usernotifications/unnotificationsettings?language=objc
  41. NSArray<NSString *> *possible = [[NSArray alloc] initWithObjects:@"badge", @"sound", @"alert", @"carPlay", @"provisional", @"criticalAlert", nil];
  42. for (NSString *option in notificationOptions) {
  43. if (![possible containsObject:option]) {
  44. return [RNPermissionsManager logErrorMessage:[NSString stringWithFormat:@"Invalid notificationOptions value : %@. Must be one of : %@.", option, [possible componentsJoinedByString:@", "]]];
  45. }
  46. }
  47. #endif
  48. if ([notificationOptions containsObject:@"badge"]) {
  49. toRequest += UNAuthorizationOptionBadge;
  50. }
  51. if ([notificationOptions containsObject:@"sound"]) {
  52. toRequest += UNAuthorizationOptionSound;
  53. }
  54. if ([notificationOptions containsObject:@"alert"]) {
  55. toRequest += UNAuthorizationOptionAlert;
  56. }
  57. if ([notificationOptions containsObject:@"carPlay"]) {
  58. toRequest += UNAuthorizationOptionCarPlay;
  59. }
  60. if (@available(iOS 12.0, *)) {
  61. if ([notificationOptions containsObject:@"provisional"]) {
  62. toRequest += UNAuthorizationOptionProvisional;
  63. }
  64. if ([notificationOptions containsObject:@"criticalAlert"]) {
  65. toRequest += UNAuthorizationOptionCriticalAlert;
  66. }
  67. }
  68. } else {
  69. toRequest += UNAuthorizationOptionBadge;
  70. toRequest += UNAuthorizationOptionSound;
  71. toRequest += UNAuthorizationOptionAlert;
  72. }
  73. }
  74. [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:toRequest completionHandler:^(BOOL granted, NSError * _Nullable error) {
  75. if (error != nil) {
  76. reject(error);
  77. } else {
  78. [self checkWithResolver:resolve withRejecter:reject];
  79. }
  80. }];
  81. } else {
  82. [self checkWithResolver:resolve withRejecter:reject];
  83. }
  84. }
  85. @end