Quellcode durchsuchen

added authorization methods and status enum

Yonah Forst vor 8 Jahren
Ursprung
Commit
4d436e8865

+ 20
- 0
RCTConvert+RNPermissionsStatus.h Datei anzeigen

@@ -0,0 +1,20 @@
1
+//
2
+//  RCTConvert+RNPermissionsStatus.h
3
+//  ReactNativePermissions
4
+//
5
+//  Created by Yonah Forst on 23/03/16.
6
+//  Copyright © 2016 Yonah Forst. All rights reserved.
7
+//
8
+
9
+#import "RCTConvert.h"
10
+
11
+typedef NS_ENUM(NSInteger, RNPermissionsStatus) {
12
+    RNPermissionsStatusUndetermined,
13
+    RNPermissionsStatusDenied,
14
+    RNPermissionsStatusAuthorized,
15
+    RNPermissionsStatusRestricted
16
+};
17
+
18
+@interface RCTConvert (RNPermissionsStatus)
19
+
20
+@end

+ 21
- 0
RCTConvert+RNPermissionsStatus.m Datei anzeigen

@@ -0,0 +1,21 @@
1
+//
2
+//  RCTConvert+RNPermissionsStatus.m
3
+//  ReactNativePermissions
4
+//
5
+//  Created by Yonah Forst on 23/03/16.
6
+//  Copyright © 2016 Yonah Forst. All rights reserved.
7
+//
8
+
9
+#import "RCTConvert+RNPermissionsStatus.h"
10
+
11
+@implementation RCTConvert (RNPermissionsStatus)
12
+
13
+
14
+RCT_ENUM_CONVERTER(RNPermissionsStatus, (@{ @"StatusUndetermined" : @(RNPermissionsStatusUndetermined),
15
+                                             @"StatusDenied" : @(RNPermissionsStatusDenied),
16
+                                             @"StatusAuthorized" : @(RNPermissionsStatusAuthorized),
17
+                                             @"StatusRestricted" : @(RNPermissionsStatusRestricted)}),
18
+                   RNPermissionsStatusUndetermined, integerValue)
19
+
20
+
21
+@end

+ 1
- 0
ReactNativePermissions.h Datei anzeigen

@@ -11,4 +11,5 @@
11 11
 
12 12
 @interface ReactNativePermissions : NSObject <RCTBridgeModule>
13 13
 
14
+
14 15
 @end

+ 175
- 21
ReactNativePermissions.m Datei anzeigen

@@ -12,6 +12,14 @@
12 12
 #import "RCTConvert.h"
13 13
 #import "RCTEventDispatcher.h"
14 14
 
15
+#import "RCTConvert+RNPermissionsStatus.h"
16
+
17
+#import <AddressBook/AddressBook.h>
18
+#import <AssetsLibrary/AssetsLibrary.h>
19
+#import <EventKit/EventKit.h>
20
+#import <CoreLocation/CoreLocation.h>
21
+#import <AVFoundation/AVFoundation.h>
22
+#import <CoreBluetooth/CoreBluetooth.h>
15 23
 
16 24
 @interface ReactNativePermissions()
17 25
 @end
@@ -31,35 +39,181 @@ RCT_EXPORT_MODULE();
31 39
     return self;
32 40
 }
33 41
 
34
-RCT_REMAP_METHOD(start, start:(int)headingFilter resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
35
-    // Start heading updates.
36
-    if ([CLLocationManager headingAvailable]) {
37
-        if (!headingFilter)
38
-            headingFilter = 5;
39
-        
40
-        self.locManager.headingFilter = headingFilter;
41
-        [self.locManager startUpdatingHeading];
42
-        resolve(@YES);
43
-    } else {
44
-        resolve(@NO);
42
+- (NSDictionary *)constantsToExport
43
+{
44
+    return @{ @"StatusUndetermined" : @(RNPermissionsStatusUndetermined),
45
+              @"StatusDenied" : @(RNPermissionsStatusDenied),
46
+              @"StatusAuthorized" : @(RNPermissionsStatusAuthorized),
47
+              @"StatusRestricted" : @(RNPermissionsStatusRestricted)};
48
+};
49
+
50
+
51
+RCT_REMAP_METHOD(locationPermissionStatus, locationPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
52
+{
53
+    int status = [CLLocationManager authorizationStatus];
54
+    switch (status) {
55
+        case kCLAuthorizationStatusAuthorizedAlways:
56
+        case kCLAuthorizationStatusAuthorizedWhenInUse:
57
+            return resolve(@(RNPermissionsStatusAuthorized));
58
+            
59
+        case kCLAuthorizationStatusDenied:
60
+            return resolve(@(RNPermissionsStatusDenied));
61
+            
62
+        case kCLAuthorizationStatusRestricted:
63
+            return resolve(@(RNPermissionsStatusRestricted));
64
+            
65
+        default:
66
+            return resolve(@(RNPermissionsStatusUndetermined));
67
+    }
68
+}
69
+
70
+
71
+RCT_REMAP_METHOD(cameraPermissionStatus, cameraPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
72
+{
73
+    int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
74
+    switch (status) {
75
+        case AVAuthorizationStatusAuthorized:
76
+            return resolve(@(RNPermissionsStatusAuthorized));
77
+            
78
+        case AVAuthorizationStatusDenied:
79
+            return resolve(@(RNPermissionsStatusDenied));
80
+            
81
+        case AVAuthorizationStatusRestricted:
82
+            return resolve(@(RNPermissionsStatusRestricted));
83
+            
84
+        default:
85
+            return resolve(@(RNPermissionsStatusUndetermined));
86
+    }
87
+
88
+}
89
+
90
+RCT_REMAP_METHOD(microphonePermissionStatus, microphonePermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
91
+{
92
+    int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
93
+    switch (status) {
94
+        case AVAuthorizationStatusAuthorized:
95
+            return resolve(@(RNPermissionsStatusAuthorized));
96
+            
97
+        case AVAuthorizationStatusDenied:
98
+            return resolve(@(RNPermissionsStatusDenied));
99
+            
100
+        case AVAuthorizationStatusRestricted:
101
+            return resolve(@(RNPermissionsStatusRestricted));
102
+            
103
+        default:
104
+            return resolve(@(RNPermissionsStatusUndetermined));
105
+    }
106
+
107
+}
108
+
109
+RCT_REMAP_METHOD(photoPermissionStatus, photoPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
110
+
111
+{
112
+    int status = [ALAssetsLibrary authorizationStatus];
113
+    switch (status) {
114
+        case ALAuthorizationStatusAuthorized:
115
+            return resolve(@(RNPermissionsStatusAuthorized));
116
+            
117
+        case ALAuthorizationStatusDenied:
118
+            return resolve(@(RNPermissionsStatusDenied));
119
+            
120
+        case ALAuthorizationStatusRestricted:
121
+            return resolve(@(RNPermissionsStatusRestricted));
122
+            
123
+        default:
124
+            return resolve(@(RNPermissionsStatusUndetermined));
45 125
     }
46 126
 }
47 127
 
48
-RCT_EXPORT_METHOD(stop) {
49
-    [self.locManager stopUpdatingHeading];
128
+RCT_REMAP_METHOD(contactsPermissionStatus, contactsPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
129
+{
130
+    int status = ABAddressBookGetAuthorizationStatus();
131
+    switch (status) {
132
+        case kABAuthorizationStatusAuthorized:
133
+            return resolve(@(RNPermissionsStatusAuthorized));
134
+            
135
+        case kABAuthorizationStatusDenied:
136
+            return resolve(@(RNPermissionsStatusDenied));
137
+            
138
+        case kABAuthorizationStatusRestricted:
139
+            return resolve(@(RNPermissionsStatusRestricted));
140
+            
141
+        default:
142
+            return resolve(@(RNPermissionsStatusUndetermined));
143
+    }
50 144
 }
51 145
 
52
-- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
53
-    if (newHeading.headingAccuracy < 0)
54
-        return;
146
+
147
+RCT_REMAP_METHOD(eventPermissionStatus, eventPermission:(NSString *)eventString resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
148
+{
149
+    int status;
150
+    if ([eventString isEqualToString:@"reminder"]) {
151
+        status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
152
+    } else if ([eventString isEqualToString:@"event"]) {
153
+        status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
154
+    } else {
155
+        NSError *error = [NSError errorWithDomain:@"invalidOption" code:-1 userInfo:NULL];
156
+        return reject(@"-1", @"Type must be 'reminder' or 'event'", error);
157
+    }
55 158
     
56
-    // Use the true heading if it is valid.
57
-    CLLocationDirection heading = ((newHeading.trueHeading > 0) ?
58
-                                   newHeading.trueHeading : newHeading.magneticHeading);
159
+    switch (status) {
160
+        case EKAuthorizationStatusAuthorized:
161
+            return resolve(@(RNPermissionsStatusAuthorized));
162
+            
163
+        case EKAuthorizationStatusDenied:
164
+            return resolve(@(RNPermissionsStatusDenied));
165
+            
166
+        case EKAuthorizationStatusRestricted:
167
+            return resolve(@(RNPermissionsStatusRestricted));
168
+            
169
+        default:
170
+            return resolve(@(RNPermissionsStatusUndetermined));
171
+    }
172
+}
173
+
174
+
175
+
176
+RCT_REMAP_METHOD(bluetoothPermissionStatus, bluetoothPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
177
+{
178
+    int status = [CBPeripheralManager authorizationStatus];
59 179
     
60
-    NSDictionary *headingEvent = @{@"heading": @(heading)};
180
+    switch (status) {
181
+        case CBPeripheralManagerAuthorizationStatusAuthorized:
182
+            return resolve(@(RNPermissionsStatusAuthorized));
183
+            
184
+        case CBPeripheralManagerAuthorizationStatusDenied:
185
+            return resolve(@(RNPermissionsStatusDenied));
186
+            
187
+        case CBPeripheralManagerAuthorizationStatusRestricted:
188
+            return resolve(@(RNPermissionsStatusRestricted));
189
+            
190
+        default:
191
+            return resolve(@(RNPermissionsStatusUndetermined));
192
+    }
61 193
     
62
-    [self.bridge.eventDispatcher sendDeviceEventWithName:@"headingUpdated" body:headingEvent];
63 194
 }
64 195
 
196
+//problem here is that we can only return Authorized or Undetermined
197
+RCT_REMAP_METHOD(notificationPermissionStatus, notificationPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
198
+{
199
+    if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
200
+        // iOS8+
201
+        if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
202
+            return resolve(@(RNPermissionsStatusAuthorized));
203
+        }
204
+        else {
205
+            return resolve(@(RNPermissionsStatusUndetermined));
206
+        }
207
+    } else {
208
+        if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
209
+            return resolve(@(RNPermissionsStatusUndetermined));
210
+        }
211
+        else {
212
+            return resolve(@(RNPermissionsStatusAuthorized));
213
+        }
214
+    }
215
+
216
+}
217
+
218
+
65 219
 @end

+ 6
- 0
ReactNativePermissions.xcodeproj/project.pbxproj Datei anzeigen

@@ -8,6 +8,7 @@
8 8
 
9 9
 /* Begin PBXBuildFile section */
10 10
 		9DE8D2821CA3188D009CE8CC /* ReactNativePermissions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */; };
11
+		9DE8D28B1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */; };
11 12
 /* End PBXBuildFile section */
12 13
 
13 14
 /* Begin PBXCopyFilesBuildPhase section */
@@ -26,6 +27,8 @@
26 27
 		9D23B34F1C767B80008B4819 /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativePermissions.a; sourceTree = BUILT_PRODUCTS_DIR; };
27 28
 		9DE8D2801CA31888009CE8CC /* ReactNativePermissions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactNativePermissions.h; sourceTree = SOURCE_ROOT; };
28 29
 		9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNativePermissions.m; sourceTree = SOURCE_ROOT; };
30
+		9DE8D2891CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+RNPermissionsStatus.h"; sourceTree = SOURCE_ROOT; };
31
+		9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+RNPermissionsStatus.m"; sourceTree = SOURCE_ROOT; };
29 32
 /* End PBXFileReference section */
30 33
 
31 34
 /* Begin PBXFrameworksBuildPhase section */
@@ -58,6 +61,8 @@
58 61
 		9D23B3511C767B80008B4819 /* ReactNativePermissions */ = {
59 62
 			isa = PBXGroup;
60 63
 			children = (
64
+				9DE8D2891CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.h */,
65
+				9DE8D28A1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m */,
61 66
 				9DE8D2801CA31888009CE8CC /* ReactNativePermissions.h */,
62 67
 				9DE8D2811CA3188D009CE8CC /* ReactNativePermissions.m */,
63 68
 			);
@@ -120,6 +125,7 @@
120 125
 			isa = PBXSourcesBuildPhase;
121 126
 			buildActionMask = 2147483647;
122 127
 			files = (
128
+				9DE8D28B1CA31E95009CE8CC /* RCTConvert+RNPermissionsStatus.m in Sources */,
123 129
 				9DE8D2821CA3188D009CE8CC /* ReactNativePermissions.m in Sources */,
124 130
 			);
125 131
 			runOnlyForDeploymentPostprocessing = 0;

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

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

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

@@ -15,9 +15,9 @@
15 15
             <BuildableReference
16 16
                BuildableIdentifier = "primary"
17 17
                BlueprintIdentifier = "9D23B34E1C767B80008B4819"
18
-               BuildableName = "libReactNativeHeading.a"
19
-               BlueprintName = "ReactNativeHeading"
20
-               ReferencedContainer = "container:ReactNativeHeading.xcodeproj">
18
+               BuildableName = "libReactNativePermissions.a"
19
+               BlueprintName = "ReactNativePermissions"
20
+               ReferencedContainer = "container:ReactNativePermissions.xcodeproj">
21 21
             </BuildableReference>
22 22
          </BuildActionEntry>
23 23
       </BuildActionEntries>
@@ -46,9 +46,9 @@
46 46
          <BuildableReference
47 47
             BuildableIdentifier = "primary"
48 48
             BlueprintIdentifier = "9D23B34E1C767B80008B4819"
49
-            BuildableName = "libReactNativeHeading.a"
50
-            BlueprintName = "ReactNativeHeading"
51
-            ReferencedContainer = "container:ReactNativeHeading.xcodeproj">
49
+            BuildableName = "libReactNativePermissions.a"
50
+            BlueprintName = "ReactNativePermissions"
51
+            ReferencedContainer = "container:ReactNativePermissions.xcodeproj">
52 52
          </BuildableReference>
53 53
       </MacroExpansion>
54 54
       <AdditionalOptions>
@@ -64,9 +64,9 @@
64 64
          <BuildableReference
65 65
             BuildableIdentifier = "primary"
66 66
             BlueprintIdentifier = "9D23B34E1C767B80008B4819"
67
-            BuildableName = "libReactNativeHeading.a"
68
-            BlueprintName = "ReactNativeHeading"
69
-            ReferencedContainer = "container:ReactNativeHeading.xcodeproj">
67
+            BuildableName = "libReactNativePermissions.a"
68
+            BlueprintName = "ReactNativePermissions"
69
+            ReferencedContainer = "container:ReactNativePermissions.xcodeproj">
70 70
          </BuildableReference>
71 71
       </MacroExpansion>
72 72
    </ProfileAction>

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

@@ -4,7 +4,7 @@
4 4
 <dict>
5 5
 	<key>SchemeUserState</key>
6 6
 	<dict>
7
-		<key>ReactNativeHeading.xcscheme</key>
7
+		<key>ReactNativePermissions.xcscheme</key>
8 8
 		<dict>
9 9
 			<key>orderHint</key>
10 10
 			<integer>0</integer>