diff --git a/packages/expo-permissions/ios/EXPermissions/EXPermissions.m b/packages/expo-permissions/ios/EXPermissions/EXPermissions.m index 118fdac908102..479f6225dd804 100644 --- a/packages/expo-permissions/ios/EXPermissions/EXPermissions.m +++ b/packages/expo-permissions/ios/EXPermissions/EXPermissions.m @@ -51,11 +51,6 @@ - (void)registerRequesters:(NSArray> *)newRequesters - (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry { _moduleRegistry = moduleRegistry; - - id userNotificationRequester = [[EXUserNotificationPermissionRequester alloc] initWithNotificationProxy:[moduleRegistry getModuleImplementingProtocol:@protocol(UMUserNotificationCenterProxyInterface)] withMethodQueue:self.methodQueue]; - id remoteNotificationRequester = [[EXRemoteNotificationPermissionRequester alloc] initWithUserNotificationPermissionRequester:userNotificationRequester withMethodQueue:self.methodQueue]; - - [self registerRequesters:@[userNotificationRequester, remoteNotificationRequester]]; } # pragma mark - Exported methods @@ -110,7 +105,7 @@ - (NSDictionary *)getPermissionUsingRequesterClass:(Class)requesterClass - (NSDictionary *)getPermissionsForResource:(NSString *)type { - return [self getPermissionUsingRequester:_requesters[type]]; + return [self getPermissionUsingRequester:[self getPermissionRequesterForType:type]]; } - (NSDictionary *)getPermissionUsingRequester:(id)requester @@ -213,6 +208,10 @@ + (UMPermissionStatus)statusForPermission:(NSDictionary *)permission - (id)getPermissionRequesterForType:(NSString *)type { + static dispatch_once_t once; + dispatch_once(&once, ^{ + [self ensureRequestersFallbacksAreRegistered]; + }); return _requesters[type]; } @@ -221,8 +220,19 @@ + (UMPermissionStatus)statusForPermission:(NSDictionary *)permission return [_requestersByClass objectForKey:requesterClass]; } -- (UMModuleRegistry *)getModuleRegistry { - return _moduleRegistry; +- (void)ensureRequestersFallbacksAreRegistered +{ + // TODO: Remove once we promote `expo-notifications` to a stable unimodule (and integrate into Expo client) + if (!_requesters[@"userFacingNotifications"]) { + id userNotificationRequester = [[EXUserNotificationPermissionRequester alloc] initWithNotificationProxy:[_moduleRegistry getModuleImplementingProtocol:@protocol(UMUserNotificationCenterProxyInterface)] withMethodQueue:self.methodQueue]; + [self registerRequesters:@[userNotificationRequester]]; + } + + // TODO: Remove once we deprecate and remove "notifications" permission type + if (!_requesters[@"notifications"] && _requesters[@"userFacingNotifications"]) { + id remoteNotificationsRequester = [[EXRemoteNotificationPermissionRequester alloc] initWithUserNotificationPermissionRequester:_requesters[@"userFacingNotifications"] withMethodQueue:self.methodQueue]; + [self registerRequesters:@[remoteNotificationsRequester]]; + } } @end diff --git a/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.h b/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.h index 29f5cae79f3d8..3ff8a987ebe86 100644 --- a/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.h +++ b/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.h @@ -2,12 +2,11 @@ #import #import -#import FOUNDATION_EXPORT NSString * const EXAppDidRegisterForRemoteNotificationsNotificationName; @interface EXRemoteNotificationPermissionRequester : NSObject -- (instancetype)initWithUserNotificationPermissionRequester:(EXUserNotificationPermissionRequester *)userNotificationPermissionRequester +- (instancetype)initWithUserNotificationPermissionRequester:(id)userNotificationPermissionRequester withMethodQueue:(dispatch_queue_t)methodQueue; @end diff --git a/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.m b/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.m index 27091b43769f3..ca80a242d48e1 100644 --- a/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.m +++ b/packages/expo-permissions/ios/EXPermissions/Requesters/RemoteNotification/EXRemoteNotificationPermissionRequester.m @@ -10,7 +10,7 @@ @interface EXRemoteNotificationPermissionRequester () @property (nonatomic, strong) UMPromiseResolveBlock resolve; @property (nonatomic, strong) UMPromiseRejectBlock reject; @property (nonatomic, assign) BOOL remoteNotificationsRegistrationIsPending; -@property (nonatomic, weak) EXUserNotificationPermissionRequester* userNotificationPermissionRequester; +@property (nonatomic, weak) id userNotificationPermissionRequester; @property (nonatomic, weak) dispatch_queue_t methodQueue; @end @@ -22,7 +22,7 @@ + (NSString *)permissionType return @"notifications"; } -- (instancetype)initWithUserNotificationPermissionRequester:(EXUserNotificationPermissionRequester *)userNotificationPermissionRequester +- (instancetype)initWithUserNotificationPermissionRequester:(id)userNotificationPermissionRequester withMethodQueue:(dispatch_queue_t)methodQueue { if (self = [super init]) {