Browse Source

added authorization methods and status enum

Yonah Forst 9 years ago
parent
commit
4d436e8865

+ 20 - 0
RCTConvert+RNPermissionsStatus.h

@@ -0,0 +1,20 @@
+//
+//  RCTConvert+RNPermissionsStatus.h
+//  ReactNativePermissions
+//
+//  Created by Yonah Forst on 23/03/16.
+//  Copyright © 2016 Yonah Forst. All rights reserved.
+//
+
+#import "RCTConvert.h"
+
+typedef NS_ENUM(NSInteger, RNPermissionsStatus) {
+    RNPermissionsStatusUndetermined,
+    RNPermissionsStatusDenied,
+    RNPermissionsStatusAuthorized,
+    RNPermissionsStatusRestricted
+};
+
+@interface RCTConvert (RNPermissionsStatus)
+
+@end

+ 21 - 0
RCTConvert+RNPermissionsStatus.m

@@ -0,0 +1,21 @@
+//
+//  RCTConvert+RNPermissionsStatus.m
+//  ReactNativePermissions
+//
+//  Created by Yonah Forst on 23/03/16.
+//  Copyright © 2016 Yonah Forst. All rights reserved.
+//
+
+#import "RCTConvert+RNPermissionsStatus.h"
+
+@implementation RCTConvert (RNPermissionsStatus)
+
+
+RCT_ENUM_CONVERTER(RNPermissionsStatus, (@{ @"StatusUndetermined" : @(RNPermissionsStatusUndetermined),
+                                             @"StatusDenied" : @(RNPermissionsStatusDenied),
+                                             @"StatusAuthorized" : @(RNPermissionsStatusAuthorized),
+                                             @"StatusRestricted" : @(RNPermissionsStatusRestricted)}),
+                   RNPermissionsStatusUndetermined, integerValue)
+
+
+@end

+ 1 - 0
ReactNativePermissions.h

@@ -11,4 +11,5 @@
 
 @interface ReactNativePermissions : NSObject <RCTBridgeModule>
 
+
 @end

+ 175 - 21
ReactNativePermissions.m

@@ -12,6 +12,14 @@
 #import "RCTConvert.h"
 #import "RCTEventDispatcher.h"
 
+#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>
 
 @interface ReactNativePermissions()
 @end
@@ -31,35 +39,181 @@ RCT_EXPORT_MODULE();
     return self;
 }
 
-RCT_REMAP_METHOD(start, start:(int)headingFilter resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
-    // Start heading updates.
-    if ([CLLocationManager headingAvailable]) {
-        if (!headingFilter)
-            headingFilter = 5;
-        
-        self.locManager.headingFilter = headingFilter;
-        [self.locManager startUpdatingHeading];
-        resolve(@YES);
-    } else {
-        resolve(@NO);
+- (NSDictionary *)constantsToExport
+{
+    return @{ @"StatusUndetermined" : @(RNPermissionsStatusUndetermined),
+              @"StatusDenied" : @(RNPermissionsStatusDenied),
+              @"StatusAuthorized" : @(RNPermissionsStatusAuthorized),
+              @"StatusRestricted" : @(RNPermissionsStatusRestricted)};
+};
+
+
+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)
+
+{
+    int status = [ALAssetsLibrary authorizationStatus];
+    switch (status) {
+        case ALAuthorizationStatusAuthorized:
+            return resolve(@(RNPermissionsStatusAuthorized));
+            
+        case ALAuthorizationStatusDenied:
+            return resolve(@(RNPermissionsStatusDenied));
+            
+        case ALAuthorizationStatusRestricted:
+            return resolve(@(RNPermissionsStatusRestricted));
+            
+        default:
+            return resolve(@(RNPermissionsStatusUndetermined));
     }
 }
 
-RCT_EXPORT_METHOD(stop) {
-    [self.locManager stopUpdatingHeading];
+RCT_REMAP_METHOD(contactsPermissionStatus, contactsPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
+{
+    int status = ABAddressBookGetAuthorizationStatus();
+    switch (status) {
+        case kABAuthorizationStatusAuthorized:
+            return resolve(@(RNPermissionsStatusAuthorized));
+            
+        case kABAuthorizationStatusDenied:
+            return resolve(@(RNPermissionsStatusDenied));
+            
+        case kABAuthorizationStatusRestricted:
+            return resolve(@(RNPermissionsStatusRestricted));
+            
+        default:
+            return resolve(@(RNPermissionsStatusUndetermined));
+    }
 }
 
-- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
-    if (newHeading.headingAccuracy < 0)
-        return;
+
+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);
+    }
     
-    // Use the true heading if it is valid.
-    CLLocationDirection heading = ((newHeading.trueHeading > 0) ?
-                                   newHeading.trueHeading : newHeading.magneticHeading);
+    switch (status) {
+        case EKAuthorizationStatusAuthorized:
+            return resolve(@(RNPermissionsStatusAuthorized));
+            
+        case EKAuthorizationStatusDenied:
+            return resolve(@(RNPermissionsStatusDenied));
+            
+        case EKAuthorizationStatusRestricted:
+            return resolve(@(RNPermissionsStatusRestricted));
+            
+        default:
+            return resolve(@(RNPermissionsStatusUndetermined));
+    }
+}
+
+
+
+RCT_REMAP_METHOD(bluetoothPermissionStatus, bluetoothPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
+{
+    int status = [CBPeripheralManager authorizationStatus];
     
-    NSDictionary *headingEvent = @{@"heading": @(heading)};
+    switch (status) {
+        case CBPeripheralManagerAuthorizationStatusAuthorized:
+            return resolve(@(RNPermissionsStatusAuthorized));
+            
+        case CBPeripheralManagerAuthorizationStatusDenied:
+            return resolve(@(RNPermissionsStatusDenied));
+            
+        case CBPeripheralManagerAuthorizationStatusRestricted:
+            return resolve(@(RNPermissionsStatusRestricted));
+            
+        default:
+            return resolve(@(RNPermissionsStatusUndetermined));
+    }
     
-    [self.bridge.eventDispatcher sendDeviceEventWithName:@"headingUpdated" body:headingEvent];
 }
 
+//problem here is that we can only return Authorized or Undetermined
+RCT_REMAP_METHOD(notificationPermissionStatus, notificationPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
+{
+    if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
+        // iOS8+
+        if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
+            return resolve(@(RNPermissionsStatusAuthorized));
+        }
+        else {
+            return resolve(@(RNPermissionsStatusUndetermined));
+        }
+    } else {
+        if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
+            return resolve(@(RNPermissionsStatusUndetermined));
+        }
+        else {
+            return resolve(@(RNPermissionsStatusAuthorized));
+        }
+    }
+
+}
+
+
 @end

+ 6 - 0
ReactNativePermissions.xcodeproj/project.pbxproj

@@ -8,6 +8,7 @@
 
 /* Begin PBXBuildFile section */
 		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 */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -26,6 +27,8 @@
 		9D23B34F1C767B80008B4819 /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativePermissions.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		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; };
+		9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+RNPermissionsStatus.m"; sourceTree = SOURCE_ROOT; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -58,6 +61,8 @@
 		9D23B3511C767B80008B4819 /* ReactNativePermissions */ = {
 			isa = PBXGroup;
 			children = (
+				9DE8D2891CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.h */,
+				9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */,
 				9DE8D2801CA31888009CE8CC /* ReactNativePermissions.h */,
 				9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */,
 			);
@@ -120,6 +125,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				9DE8D28B1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m in Sources */,
 				9DE8D2821CA3188D009CE8CC /* ReactNativePermissions.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 1 - 1
ReactNativePermissions.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "self:ReactNativeHeading.xcodeproj">
+      location = "self:ReactNativePermissions.xcodeproj">
    </FileRef>
 </Workspace>

+ 9 - 9
ReactNativePermissions.xcodeproj/xcuserdata/Yonah.xcuserdatad/xcschemes/ReactNativeHeading.xcscheme

@@ -15,9 +15,9 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "9D23B34E1C767B80008B4819"
-               BuildableName = "libReactNativeHeading.a"
-               BlueprintName = "ReactNativeHeading"
-               ReferencedContainer = "container:ReactNativeHeading.xcodeproj">
+               BuildableName = "libReactNativePermissions.a"
+               BlueprintName = "ReactNativePermissions"
+               ReferencedContainer = "container:ReactNativePermissions.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
       </BuildActionEntries>
@@ -46,9 +46,9 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "9D23B34E1C767B80008B4819"
-            BuildableName = "libReactNativeHeading.a"
-            BlueprintName = "ReactNativeHeading"
-            ReferencedContainer = "container:ReactNativeHeading.xcodeproj">
+            BuildableName = "libReactNativePermissions.a"
+            BlueprintName = "ReactNativePermissions"
+            ReferencedContainer = "container:ReactNativePermissions.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
       <AdditionalOptions>
@@ -64,9 +64,9 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "9D23B34E1C767B80008B4819"
-            BuildableName = "libReactNativeHeading.a"
-            BlueprintName = "ReactNativeHeading"
-            ReferencedContainer = "container:ReactNativeHeading.xcodeproj">
+            BuildableName = "libReactNativePermissions.a"
+            BlueprintName = "ReactNativePermissions"
+            ReferencedContainer = "container:ReactNativePermissions.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
    </ProfileAction>

+ 1 - 1
ReactNativePermissions.xcodeproj/xcuserdata/Yonah.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -4,7 +4,7 @@
 <dict>
 	<key>SchemeUserState</key>
 	<dict>
-		<key>ReactNativeHeading.xcscheme</key>
+		<key>ReactNativePermissions.xcscheme</key>
 		<dict>
 			<key>orderHint</key>
 			<integer>0</integer>