Skip to content

Commit

Permalink
[expo-permissions] Make it extendable by expo-notifications (#6917)
Browse files Browse the repository at this point in the history
# Why

We want to be able to:
- redirect notification permission requests to `expo-notifications` if it's present
- handle notification permission requests ourselves otherwise.

# How

- optional, lazy registration of notification requesters
- making `EXRemoteNotificationPermissionRequester` extendable by loosening the type requirement on `userNotificationPermissionRequester` 

# Test Plan

Getting notifications permissions in both Expo client and in `bare-expo` (with `expo-notifications` plugged in) work as expected.
  • Loading branch information
sjchmiela committed Feb 3, 2020
1 parent 1abd758 commit f9f841f
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
26 changes: 18 additions & 8 deletions packages/expo-permissions/ios/EXPermissions/EXPermissions.m
Expand Up @@ -51,11 +51,6 @@ - (void)registerRequesters:(NSArray<id<UMPermissionsRequester>> *)newRequesters
- (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry
{
_moduleRegistry = moduleRegistry;

id<UMPermissionsRequester> userNotificationRequester = [[EXUserNotificationPermissionRequester alloc] initWithNotificationProxy:[moduleRegistry getModuleImplementingProtocol:@protocol(UMUserNotificationCenterProxyInterface)] withMethodQueue:self.methodQueue];
id<UMPermissionsRequester> remoteNotificationRequester = [[EXRemoteNotificationPermissionRequester alloc] initWithUserNotificationPermissionRequester:userNotificationRequester withMethodQueue:self.methodQueue];

[self registerRequesters:@[userNotificationRequester, remoteNotificationRequester]];
}

# pragma mark - Exported methods
Expand Down Expand Up @@ -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<UMPermissionsRequester>)requester
Expand Down Expand Up @@ -213,6 +208,10 @@ + (UMPermissionStatus)statusForPermission:(NSDictionary *)permission

- (id<UMPermissionsRequester>)getPermissionRequesterForType:(NSString *)type
{
static dispatch_once_t once;
dispatch_once(&once, ^{
[self ensureRequestersFallbacksAreRegistered];
});
return _requesters[type];
}

Expand All @@ -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<UMPermissionsRequester> 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<UMPermissionsRequester> remoteNotificationsRequester = [[EXRemoteNotificationPermissionRequester alloc] initWithUserNotificationPermissionRequester:_requesters[@"userFacingNotifications"] withMethodQueue:self.methodQueue];
[self registerRequesters:@[remoteNotificationsRequester]];
}
}

@end
Expand Down
Expand Up @@ -2,12 +2,11 @@

#import <UMPermissionsInterface/UMPermissionsInterface.h>
#import <EXPermissions/EXPermissions.h>
#import <EXPermissions/EXUserNotificationPermissionRequester.h>

FOUNDATION_EXPORT NSString * const EXAppDidRegisterForRemoteNotificationsNotificationName;

@interface EXRemoteNotificationPermissionRequester : NSObject<UMPermissionsRequester>

- (instancetype)initWithUserNotificationPermissionRequester:(EXUserNotificationPermissionRequester *)userNotificationPermissionRequester
- (instancetype)initWithUserNotificationPermissionRequester:(id<UMPermissionsRequester>)userNotificationPermissionRequester
withMethodQueue:(dispatch_queue_t)methodQueue;
@end
Expand Up @@ -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<UMPermissionsRequester> userNotificationPermissionRequester;
@property (nonatomic, weak) dispatch_queue_t methodQueue;

@end
Expand All @@ -22,7 +22,7 @@ + (NSString *)permissionType
return @"notifications";
}

- (instancetype)initWithUserNotificationPermissionRequester:(EXUserNotificationPermissionRequester *)userNotificationPermissionRequester
- (instancetype)initWithUserNotificationPermissionRequester:(id<UMPermissionsRequester>)userNotificationPermissionRequester
withMethodQueue:(dispatch_queue_t)methodQueue
{
if (self = [super init]) {
Expand Down

0 comments on commit f9f841f

Please sign in to comment.