Skip to content

Commit

Permalink
[expo-permissions][ios] Do not run all ExpoPermissions methods on the…
Browse files Browse the repository at this point in the history
… main queue

- includes fix from universe#b58f0ba2
- fix Permissions.LOCATION issue
  • Loading branch information
sjchmiela committed Nov 14, 2018
1 parent 73dc4e0 commit 304fe56
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 26 deletions.
5 changes: 2 additions & 3 deletions apps/native-component-list/screens/PermissionsScreen.js
Expand Up @@ -111,7 +111,7 @@ export default class PermissionsScreen extends React.Component {
...[
Permissions.CAMERA,
Permissions.AUDIO_RECORDING,
(Platform.OS !== 'ios' || this.state.permissionsFunction !== 'askAsync') && Permissions.LOCATION, // TODO: Permissions.LOCATION issue (search by this phrase)
Permissions.LOCATION,
Permissions.USER_FACING_NOTIFICATIONS,
Permissions.NOTIFICATIONS,
Permissions.CONTACTS,
Expand All @@ -123,8 +123,7 @@ export default class PermissionsScreen extends React.Component {
].filter(n => n && typeof n !== 'boolean')
)}
title={'Ask for Permissions: '
+ 'CAMERA, AUDIO_RECORDING, '
+ `${Platform.OS !== 'ios' || this.state.permissionsFunction !== 'askAsync' ? 'LOCATION, ' : ''}`
+ 'CAMERA, AUDIO_RECORDING, LOCATION,'
+ 'USER_FACING_NOTIFICATIONS, NOTIFICATIONS, CONTACTS, SYSTEM_BRIGHTNESS, CAMERA_ROLL, CALENDAR, REMINDERS, SMS'
}
/>
Expand Down
@@ -1,7 +1,7 @@
// Copyright © 2018 650 Industries. All rights reserved.

#import <EXPermissions/EXLocalNotificationRequester.h>
//#import "EXUnversioned.h"
#import <EXCore/EXUtilities.h>

#import <UIKit/UIKit.h>

Expand All @@ -17,9 +17,14 @@ @implementation EXLocalNotificationRequester

+ (NSDictionary *)permissions
{
BOOL allowsSound = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeSound];
BOOL allowsAlert = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeAlert];
BOOL allowsBadge = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeBadge];
__block BOOL allowsSound;
__block BOOL allowsAlert;
__block BOOL allowsBadge;
[EXUtilities performSynchronouslyOnMainThread:^{
allowsSound = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeSound];
allowsAlert = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeAlert];
allowsBadge = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeBadge];
}];

EXPermissionStatus status = EXPermissionStatusUndetermined;

Expand Down Expand Up @@ -55,8 +60,14 @@ - (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(

_resolve = resolve;
_reject = reject;

if ([EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeAlert]) {

__block BOOL alertIsAllowed;

[EXUtilities performSynchronouslyOnMainThread:^{
alertIsAllowed = [EXLocalNotificationRequester notificationTypeIsAllowed:UIUserNotificationTypeAlert];
}];

if (alertIsAllowed) {
// resolve immediately if already allowed
[self _consumeResolverWithCurrentPermissions];
} else {
Expand All @@ -65,7 +76,9 @@ - (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(
name:@"kEXAppDidRegisterUserNotificationSettingsNotification"
object:nil];
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
[EXSharedApplication() registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:types categories:nil]];
dispatch_async(dispatch_get_main_queue(), ^{
[EXSharedApplication() registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:types categories:nil]];
});
}
}

Expand Down
@@ -1,6 +1,7 @@
// Copyright 2016-present 650 Industries. All rights reserved.

#import <EXPermissions/EXLocationRequester.h>
#import <EXCore/EXUtilities.h>

#import <objc/message.h>
#import <CoreLocation/CLLocationManager.h>
Expand Down Expand Up @@ -83,8 +84,11 @@ - (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(
_resolve = resolve;
_reject = reject;

_locMgr = [[CLLocationManager alloc] init];
_locMgr.delegate = self;
__weak typeof(self) weakSelf = self;
[EXUtilities performSynchronouslyOnMainThread:^{
weakSelf.locMgr = [[CLLocationManager alloc] init];
weakSelf.locMgr.delegate = weakSelf;
}];

// 1. Why do we call CLLocationManager methods by those dynamically created selectors?
//
Expand Down
11 changes: 1 addition & 10 deletions packages/expo-permissions/ios/EXPermissions/EXPermissions.m
Expand Up @@ -38,11 +38,6 @@ - (NSDictionary *)constantsToExport
return nil;
}

- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}

- (instancetype)init
{
if (self = [super init]) {
Expand Down Expand Up @@ -325,11 +320,7 @@ - (void)askForPermissionsWithTypes:(NSArray<NSString *> *)permissionsTypes
NSMutableArray<NSString *> *scopedPermissionsToBeAsked = [NSMutableArray new];
NSMutableArray<NSString *> *globalPermissionsToBeAsked = [NSMutableArray new];
NSMutableDictionary *permissions = [NSMutableDictionary new];

if ([permissionsTypes count] != 1 && [permissionsTypes containsObject:@"location"]) {
return reject (@"E_PERMISSIONS_INVALID", @"iOS platform requires you to ask for Permissions.LOCATION separately.", nil);
}


for (NSString *permissionType in permissionsTypes) {
NSMutableDictionary *permission = [[self getPermissionsForResource:permissionType] mutableCopy];

Expand Down
Expand Up @@ -2,6 +2,7 @@

#import <EXPermissions/EXRemoteNotificationRequester.h>
#import <EXPermissions/EXLocalNotificationRequester.h>
#import <EXCore/EXUtilities.h>

NSString * const EXAppDidRegisterForRemoteNotificationsNotificationName = @"kEXAppDidRegisterForRemoteNotificationsNotification";

Expand All @@ -26,9 +27,12 @@ - (instancetype)init {

+ (NSDictionary *)permissions
{
EXPermissionStatus status = (EXSharedApplication().isRegisteredForRemoteNotifications) ?
__block EXPermissionStatus status;
[EXUtilities performSynchronouslyOnMainThread:^{
status = (EXSharedApplication().isRegisteredForRemoteNotifications) ?
EXPermissionStatusGranted :
EXPermissionStatusUndetermined;
}];
NSMutableDictionary *permissions = [[EXLocalNotificationRequester permissions] mutableCopy];
[permissions setValuesForKeysWithDictionary:@{
@"status": [EXPermissions permissionStringForStatus:status],
Expand All @@ -46,8 +50,13 @@ - (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(

_resolve = resolve;
_reject = reject;

if (EXSharedApplication().isRegisteredForRemoteNotifications) {

BOOL __block isRegisteredForRemoteNotifications = NO;
[EXUtilities performSynchronouslyOnMainThread:^{
isRegisteredForRemoteNotifications = EXSharedApplication().isRegisteredForRemoteNotifications;
}];

if (isRegisteredForRemoteNotifications) {
// resolve immediately if already registered
[self _maybeConsumeResolverWithCurrentPermissions];
} else {
Expand All @@ -59,7 +68,9 @@ - (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(
[_localNotificationRequester setDelegate:self];
[_localNotificationRequester requestPermissionsWithResolver:nil rejecter:nil];
_remoteNotificationsRegistrationIsPending = YES;
[EXSharedApplication() registerForRemoteNotifications];
dispatch_async(dispatch_get_main_queue(), ^{
[EXSharedApplication() registerForRemoteNotifications];
});
}
}

Expand Down

0 comments on commit 304fe56

Please sign in to comment.