Эх сурвалжийг харах

refactor. removed individual methods for checking statusus

Yonah Forst 9 жил өмнө
parent
commit
24b8ada320

+ 25 - 0
PermissionsChecker.h

@@ -0,0 +1,25 @@
+//
+//  PermissionsChecker
+//  PermissionsChecker
+//
+//  Created by Yonah Forst on 18/02/16.
+//  Copyright © 2016 Yonah Forst. All rights reserved.
+//
+#import "RCTConvert+RNPermissionsStatus.h"
+
+@interface PermissionsChecker : NSObject
+
++ (BOOL)canOpenSettings;
++ (void)openSettings;
++ (RNPermissionsStatus)locationPermissionStatus;
++ (RNPermissionsStatus)cameraPermissionStatus;
++ (RNPermissionsStatus)microphonePermissionStatus;
++ (RNPermissionsStatus)photoPermissionStatus;
++ (RNPermissionsStatus)contactsPermissionStatus;
++ (RNPermissionsStatus)eventPermissionStatus;
++ (RNPermissionsStatus)reminderPermissionStatus;
++ (RNPermissionsStatus)bluetoothPermissionStatus;
++ (RNPermissionsStatus)notificationPermissionStatus;
++ (RNPermissionsStatus)backgroundRefreshPermissionStatus;
+
+@end

+ 243 - 0
PermissionsChecker.m

@@ -0,0 +1,243 @@
+//
+//  PermissionsChecker
+//  PermissionsChecker
+//
+//  Created by Yonah Forst on 18/02/16.
+//  Copyright © 2016 Yonah Forst. All rights reserved.
+//
+
+@import Contacts;
+
+#import "PermissionsChecker.h"
+
+#import <AddressBook/AddressBook.h>
+#import <AssetsLibrary/AssetsLibrary.h>
+#import <EventKit/EventKit.h>
+#import <CoreLocation/CoreLocation.h>
+#import <AVFoundation/AVFoundation.h>
+#import <CoreBluetooth/CoreBluetooth.h>
+
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
+@import Contacts;
+@import Photos;
+#endif
+
+
+@interface PermissionsChecker()
+@end
+
+@implementation PermissionsChecker
+
++ (BOOL)canOpenSettings
+{
+    return UIApplicationOpenSettingsURLString != nil;
+}
+
++ (void)openSettings
+{
+    if ([self canOpenSettings]) {
+        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
+        [[UIApplication sharedApplication] openURL:url];
+    }
+}
+
+
++ (RNPermissionsStatus)locationPermissionStatus
+{
+    int status = [CLLocationManager authorizationStatus];
+    switch (status) {
+        case kCLAuthorizationStatusAuthorizedAlways:
+        case kCLAuthorizationStatusAuthorizedWhenInUse:
+            return RNPermissionsStatusAuthorized;
+        case kCLAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case kCLAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
+
+
+
++ (RNPermissionsStatus)cameraPermissionStatus
+{
+    int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
+    switch (status) {
+        case AVAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case AVAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case AVAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
++ (RNPermissionsStatus)microphonePermissionStatus
+{
+    int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
+    switch (status) {
+        case AVAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case AVAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case AVAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
++ (RNPermissionsStatus)photoPermissionStatus
+{
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
+    int status = [PHPhotoLibrary authorizationStatus];
+    switch (status) {
+        case PHAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case PHAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case PHAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+#else
+    int status = ABAddressBookGetAuthorizationStatus();
+    switch (status) {
+        case kABAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case kABAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case kABAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+#endif
+}
+
+
++ (RNPermissionsStatus)contactsPermissionStatus
+{
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
+    int status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
+    switch (status) {
+        case CNAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case CNAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case CNAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+#else
+    int status = ABAddressBookGetAuthorizationStatus();
+    switch (status) {
+        case kABAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case kABAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case kABAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+#endif
+}
+
+
++ (RNPermissionsStatus)eventPermissionStatus
+{
+    int status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
+    switch (status) {
+        case EKAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case EKAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case EKAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
++ (RNPermissionsStatus)reminderPermissionStatus
+{
+    int status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
+    switch (status) {
+        case EKAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case EKAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case EKAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
+
++ (RNPermissionsStatus)bluetoothPermissionStatus
+{
+    int status = [CBPeripheralManager authorizationStatus];
+    switch (status) {
+        case CBPeripheralManagerAuthorizationStatusAuthorized:
+            return RNPermissionsStatusAuthorized;
+        case CBPeripheralManagerAuthorizationStatusDenied:
+            return RNPermissionsStatusDenied;
+        case CBPeripheralManagerAuthorizationStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
+//problem here is that we can only return Authorized or Undetermined
++ (RNPermissionsStatus)notificationPermissionStatus
+{
+    if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
+        // iOS8+
+        BOOL isRegistered = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
+        BOOL isEnabled = [[[UIApplication sharedApplication] currentUserNotificationSettings] types] != UIUserNotificationTypeNone;
+        if (isRegistered || isEnabled) {
+            return isEnabled ? RNPermissionsStatusAuthorized : RNPermissionsStatusDenied;
+        }
+        else {
+            return RNPermissionsStatusUndetermined;
+        }
+    } else {
+#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
+        if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
+            return RNPermissionsStatusUndetermined;
+        }
+        else {
+            return RNPermissionsStatusAuthorized;
+        }
+#else
+        return RNPermissionsStatusUndetermined;
+#endif
+        
+    }
+}
+
++ (RNPermissionsStatus)backgroundRefreshPermissionStatus
+{
+    int status = [[UIApplication sharedApplication] backgroundRefreshStatus];
+    switch (status) {
+        case UIBackgroundRefreshStatusAvailable:
+            return RNPermissionsStatusAuthorized;
+        case UIBackgroundRefreshStatusDenied:
+            return RNPermissionsStatusDenied;
+        case UIBackgroundRefreshStatusRestricted:
+            return RNPermissionsStatusRestricted;
+        default:
+            return RNPermissionsStatusUndetermined;
+    }
+}
+
+@end

+ 65 - 2
ReactNativePermissions.ios.js

@@ -1,6 +1,69 @@
 'use strict';
 
 var React = require('react-native');
-var Heading = React.NativeModules.ReactNativePermissions;
+var RNPermissions = React.NativeModules.ReactNativePermissions;
 
-module.exports = Heading;
+const permissionTypes = [
+	'location',
+	'camera',
+	'microphone',
+	'photo',
+	'contacts',
+	'event',
+	'reminder',
+	'bluetooth',
+	'notification',
+	'backgroundRefresh',
+]
+
+const permissionStatus = [
+	'undetermined',
+	'denied',
+	'authorized',
+	'restricted'
+]
+
+class ReactNativePermissions {
+	canOpenSettings() {
+		return RNPermissions.canOpenSettings()
+	}
+
+	openSettings() {
+		return RNPermissions.openSettings()
+	}
+
+	getPermissionStatus(permission) {
+		if (permissionTypes.includes(permission)) {
+			return RNPermissions.getPermissionStatus(permission)
+		} else {
+			return Promise.reject(`ReactNativePermissions: ${permission} is not a valid permission type`)
+		}
+	}
+
+	//recursive funciton to chain a promises for a list of permissions
+	checkMultiplePermissions(permissions) {
+		let i = permissions.length
+		let that = this
+		const obj = {}
+		function processNext() {
+			i--
+			let p = permissions[i]
+			
+			if (!p) {
+				return obj
+			}
+
+			return that.getPermissionStatus(p)
+				.then(res => {
+					obj[p] = res
+					return processNext()
+				}).catch(e => {
+					console.warn(e)
+					return processNext()
+				})
+		}
+		return processNext()
+	}
+}
+
+export default new ReactNativePermissions();

+ 18 - 248
ReactNativePermissions.m

@@ -16,18 +16,7 @@
 
 #import "RCTConvert+RNPermissionsStatus.h"
 
-#import <AddressBook/AddressBook.h>
-#import <AssetsLibrary/AssetsLibrary.h>
-#import <EventKit/EventKit.h>
-#import <CoreLocation/CoreLocation.h>
-#import <AVFoundation/AVFoundation.h>
-#import <CoreBluetooth/CoreBluetooth.h>
-
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
-@import Contacts;
-@import Photos;
-#endif
-
+#import "PermissionsChecker.h"
 
 @interface ReactNativePermissions()
 @end
@@ -57,249 +46,30 @@ RCT_EXPORT_MODULE();
 };
 
 
-- (BOOL)canOpenSettings {
-    return UIApplicationOpenSettingsURLString != nil;
-}
-
-RCT_REMAP_METHOD(canOpenSettings, canOpenSettings:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    resolve(@([self canOpenSettings]));
-}
-
-RCT_EXPORT_METHOD(openSettings)
-{
-    if ([self canOpenSettings]) {
-        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
-        [[UIApplication sharedApplication] openURL:url];
-    }
-}
-
-
-RCT_REMAP_METHOD(locationPermissionStatus, locationPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    int status = [CLLocationManager authorizationStatus];
-    switch (status) {
-        case kCLAuthorizationStatusAuthorizedAlways:
-        case kCLAuthorizationStatusAuthorizedWhenInUse:
-            return resolve(@(RNPermissionsStatusAuthorized));
-            
-        case kCLAuthorizationStatusDenied:
-            return resolve(@(RNPermissionsStatusDenied));
-            
-        case kCLAuthorizationStatusRestricted:
-            return resolve(@(RNPermissionsStatusRestricted));
-            
-        default:
-            return resolve(@(RNPermissionsStatusUndetermined));
-    }
-}
-
-
-RCT_REMAP_METHOD(cameraPermissionStatus, cameraPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
-    switch (status) {
-        case AVAuthorizationStatusAuthorized:
-            return resolve(@(RNPermissionsStatusAuthorized));
-            
-        case AVAuthorizationStatusDenied:
-            return resolve(@(RNPermissionsStatusDenied));
-            
-        case AVAuthorizationStatusRestricted:
-            return resolve(@(RNPermissionsStatusRestricted));
-            
-        default:
-            return resolve(@(RNPermissionsStatusUndetermined));
-    }
-
-}
-
-RCT_REMAP_METHOD(microphonePermissionStatus, microphonePermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
-    switch (status) {
-        case AVAuthorizationStatusAuthorized:
-            return resolve(@(RNPermissionsStatusAuthorized));
-            
-        case AVAuthorizationStatusDenied:
-            return resolve(@(RNPermissionsStatusDenied));
-            
-        case AVAuthorizationStatusRestricted:
-            return resolve(@(RNPermissionsStatusRestricted));
-            
-        default:
-            return resolve(@(RNPermissionsStatusUndetermined));
-    }
-
-}
-
-RCT_REMAP_METHOD(photoPermissionStatus, photoPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-
-{
-    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
-        int status = [PHPhotoLibrary authorizationStatus];
-        switch (status) {
-            case PHAuthorizationStatusAuthorized:
-                return resolve(@(RNPermissionsStatusAuthorized));
-                
-            case PHAuthorizationStatusDenied:
-                return resolve(@(RNPermissionsStatusDenied));
-                
-            case PHAuthorizationStatusRestricted:
-                return resolve(@(RNPermissionsStatusRestricted));
-                
-            default:
-                return resolve(@(RNPermissionsStatusUndetermined));
-        }
-    #else
-        int status = ABAddressBookGetAuthorizationStatus();
-        switch (status) {
-            case kABAuthorizationStatusAuthorized:
-                return resolve(@(RNPermissionsStatusAuthorized));
-                
-            case kABAuthorizationStatusDenied:
-                return resolve(@(RNPermissionsStatusDenied));
-                
-            case kABAuthorizationStatusRestricted:
-                return resolve(@(RNPermissionsStatusRestricted));
-                
-            default:
-                return resolve(@(RNPermissionsStatusUndetermined));
-        }
-    #endif
-
-}
-
-RCT_REMAP_METHOD(contactsPermissionStatus, contactsPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
-        int status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
-        switch (status) {
-            case CNAuthorizationStatusAuthorized:
-                return resolve(@(RNPermissionsStatusAuthorized));
-                
-            case CNAuthorizationStatusDenied:
-                return resolve(@(RNPermissionsStatusDenied));
-                
-            case CNAuthorizationStatusRestricted:
-                return resolve(@(RNPermissionsStatusRestricted));
-                
-            default:
-                return resolve(@(RNPermissionsStatusUndetermined));
-        }
-    #else
-        int status = ABAddressBookGetAuthorizationStatus();
-        switch (status) {
-            case kABAuthorizationStatusAuthorized:
-                return resolve(@(RNPermissionsStatusAuthorized));
-                
-            case kABAuthorizationStatusDenied:
-                return resolve(@(RNPermissionsStatusDenied));
-                
-            case kABAuthorizationStatusRestricted:
-                return resolve(@(RNPermissionsStatusRestricted));
-                
-            default:
-                return resolve(@(RNPermissionsStatusUndetermined));
-        }
-    #endif
-}
-
-
-RCT_REMAP_METHOD(eventPermissionStatus, eventPermission:(NSString *)eventString resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    int status;
-    if ([eventString isEqualToString:@"reminder"]) {
-        status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
-    } else if ([eventString isEqualToString:@"event"]) {
-        status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
-    } else {
-        NSError *error = [NSError errorWithDomain:@"invalidOption" code:-1 userInfo:NULL];
-        return reject(@"-1", @"Type must be 'reminder' or 'event'", error);
-    }
-    
-    switch (status) {
-        case EKAuthorizationStatusAuthorized:
-            return resolve(@(RNPermissionsStatusAuthorized));
-            
-        case EKAuthorizationStatusDenied:
-            return resolve(@(RNPermissionsStatusDenied));
-            
-        case EKAuthorizationStatusRestricted:
-            return resolve(@(RNPermissionsStatusRestricted));
-            
-        default:
-            return resolve(@(RNPermissionsStatusUndetermined));
-    }
+RCT_REMAP_METHOD(canOpenSettings, canOpenSettings:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
+    resolve(@([PermissionsChecker canOpenSettings]));
 }
-
-
-
-RCT_REMAP_METHOD(bluetoothPermissionStatus, bluetoothPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    int status = [CBPeripheralManager authorizationStatus];
-    
-    switch (status) {
-        case CBPeripheralManagerAuthorizationStatusAuthorized:
-            return resolve(@(RNPermissionsStatusAuthorized));
-            
-        case CBPeripheralManagerAuthorizationStatusDenied:
-            return resolve(@(RNPermissionsStatusDenied));
-            
-        case CBPeripheralManagerAuthorizationStatusRestricted:
-            return resolve(@(RNPermissionsStatusRestricted));
-            
-        default:
-            return resolve(@(RNPermissionsStatusUndetermined));
-    }
-    
+RCT_EXPORT_METHOD(openSettings) {
+    [PermissionsChecker openSettings];
 }
-
-//problem here is that we can we can't know if the user was never prompted for permission, or if they were prompted and deneied
-RCT_REMAP_METHOD(notificationPermissionStatus, notificationPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
-        // iOS8+
-        BOOL isRegistered = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
-        BOOL isEnabled = [[[UIApplication sharedApplication] currentUserNotificationSettings] types] != UIUserNotificationTypeNone;
-        if (isRegistered || isEnabled) {
-            return resolve(@(isEnabled ? RNPermissionsStatusAuthorized : RNPermissionsStatusDenied));
-        }
-        else {
-            return resolve(@(RNPermissionsStatusUndetermined));
-        }
-    } else {
-        #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
-            if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
-                return resolve(@(RNPermissionsStatusUndetermined));
-            }
-            else {
-                return resolve(@(RNPermissionsStatusAuthorized));
-            }
-        #else
-            return resolve(@(RNPermissionsStatusUndetermined));
-        #endif
-    }
+RCT_REMAP_METHOD(getPermissionStatus, getPermissionStatus:(NSString *)permission resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
+    SEL s = NSSelectorFromString([NSString stringWithFormat:@"%@PermissionStatus", permission]);
+    RNPermissionsStatus status = (RNPermissionsStatus)[PermissionsChecker performSelector:s];
+    resolve([self stringForStatus:status]);
 }
 
-RCT_REMAP_METHOD(backgroundRefreshStatus, backgroundRefresh:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
-{
-    int status = [[UIApplication sharedApplication] backgroundRefreshStatus];
-    
+- (NSString *)stringForStatus:(RNPermissionsStatus) status{
     switch (status) {
-        case UIBackgroundRefreshStatusAvailable:
-            return resolve(@(RNPermissionsStatusAuthorized));
-            
-        case UIBackgroundRefreshStatusDenied:
-            return resolve(@(RNPermissionsStatusDenied));
-            
-        case UIBackgroundRefreshStatusRestricted:
-            return resolve(@(RNPermissionsStatusRestricted));
-            
+        case RNPermissionsStatusAuthorized:
+            return @"authorized";
+        case RNPermissionsStatusDenied:
+            return @"denied";
+        case RNPermissionsStatusRestricted:
+            return @"restricted";
+        case RNPermissionsStatusUndetermined:
         default:
-            return resolve(@(RNPermissionsStatusUndetermined));
+            return @"undetermined";
     }
-    
 }
 
 @end

+ 6 - 0
ReactNativePermissions.xcodeproj/project.pbxproj

@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		9D8FB2701D2D68C500AAFC55 /* PermissionsChecker.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D8FB26F1D2D68C500AAFC55 /* PermissionsChecker.m */; };
 		9DE8D2821CA3188D009CE8CC /* ReactNativePermissions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */; };
 		9DE8D28B1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */; };
 /* End PBXBuildFile section */
@@ -25,6 +26,8 @@
 
 /* Begin PBXFileReference section */
 		9D23B34F1C767B80008B4819 /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativePermissions.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		9D8FB26E1D2D68C500AAFC55 /* PermissionsChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PermissionsChecker.h; sourceTree = SOURCE_ROOT; };
+		9D8FB26F1D2D68C500AAFC55 /* PermissionsChecker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PermissionsChecker.m; sourceTree = SOURCE_ROOT; };
 		9DE8D2801CA31888009CE8CC /* ReactNativePermissions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactNativePermissions.h; sourceTree = SOURCE_ROOT; };
 		9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNativePermissions.m; sourceTree = SOURCE_ROOT; };
 		9DE8D2891CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+RNPermissionsStatus.h"; sourceTree = SOURCE_ROOT; };
@@ -63,6 +66,8 @@
 			children = (
 				9DE8D2891CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.h */,
 				9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */,
+				9D8FB26E1D2D68C500AAFC55 /* PermissionsChecker.h */,
+				9D8FB26F1D2D68C500AAFC55 /* PermissionsChecker.m */,
 				9DE8D2801CA31888009CE8CC /* ReactNativePermissions.h */,
 				9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */,
 			);
@@ -126,6 +131,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				9DE8D28B1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m in Sources */,
+				9D8FB2701D2D68C500AAFC55 /* PermissionsChecker.m in Sources */,
 				9DE8D2821CA3188D009CE8CC /* ReactNativePermissions.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;