Skip to content

Commit 1ad011d

Browse files
authored
Merge pull request #210 from peterlau/motion-permission-request-fixed
Motion permission request - fixed conflicts
2 parents f80a885 + 390a8bd commit 1ad011d

File tree

8 files changed

+96
-2
lines changed

8 files changed

+96
-2
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ The current supported permissions are:
160160
| Push Notifications | `notification` | ✔️ ||
161161
| Background Refresh | `backgroundRefresh` | ✔️ ||
162162
| Speech Recognition | `speechRecognition` | ✔️ ||
163+
| Motion Activity | `motion` | ✔️ ||
163164
| Storage | `storage` | ❌️ ||
164165
| Phone Call | `callPhone` | ❌️ ||
165166
| Read SMS | `readSms` | ❌️ ||
@@ -238,6 +239,8 @@ So before submitting your app to the App Store, make sure that in your
238239
<string>Some description</string>
239240
<key>NSSpeechRecognitionUsageDescription</key>
240241
<string>Some description</string>
242+
<key>NSMotionUsageDescription</key>
243+
<string>Some description</string>
241244
```
242245

243246
This is required because during the phase of processing in the App Store

ios/Permissions/RNPMotion.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// RNPMotion.h
3+
// ReactNativePermissions
4+
//
5+
6+
#import <Foundation/Foundation.h>
7+
#import "RCTConvert+RNPStatus.h"
8+
9+
@interface RNPMotion : NSObject
10+
11+
+ (NSString *)getStatus;
12+
+ (void)request:(void (^)(NSString *))completionHandler;
13+
14+
@end

ios/Permissions/RNPMotion.m

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// RNPMotion.m
3+
// ReactNativePermissions
4+
//
5+
6+
#import "RNPMotion.h"
7+
#import <CoreMotion/CoreMotion.h>
8+
9+
@implementation RNPMotion
10+
11+
+ (NSString *)getStatus
12+
{
13+
if (![CMMotionActivityManager isActivityAvailable]) {
14+
return RNPStatusRestricted;
15+
}
16+
17+
if (@available(iOS 11.0, *)) {
18+
CMAuthorizationStatus status = [CMMotionActivityManager authorizationStatus];
19+
20+
switch (status) {
21+
case CMAuthorizationStatusAuthorized:
22+
return RNPStatusAuthorized;
23+
case CMAuthorizationStatusDenied:
24+
return RNPStatusDenied;
25+
case CMAuthorizationStatusNotDetermined:
26+
return RNPStatusUndetermined;
27+
case CMAuthorizationStatusRestricted:
28+
return RNPStatusRestricted;
29+
default:
30+
return RNPStatusUndetermined;
31+
}
32+
} else {
33+
return RNPStatusRestricted;
34+
}
35+
}
36+
37+
+ (void)request:(void (^)(NSString *))completionHandler
38+
{
39+
__block NSString *status = [RNPMotion getStatus];
40+
41+
if ([status isEqual: RNPStatusUndetermined]) {
42+
__block CMMotionActivityManager *activityManager = [[CMMotionActivityManager alloc] init];
43+
__block NSOperationQueue *motionActivityQueue = [[NSOperationQueue alloc] init];
44+
[activityManager queryActivityStartingFromDate:[NSDate distantPast] toDate:[NSDate date] toQueue:motionActivityQueue withHandler:^(NSArray *activities, NSError *error) {
45+
if (error) {
46+
status = RNPStatusDenied;
47+
} else if (activities || !error) {
48+
status = RNPStatusAuthorized;
49+
}
50+
51+
dispatch_async(dispatch_get_main_queue(), ^{
52+
completionHandler(status);
53+
});
54+
55+
activityManager = nil;
56+
motionActivityQueue = nil;
57+
}];
58+
} else {
59+
completionHandler(status);
60+
}
61+
}
62+
@end

ios/RCTConvert+RNPStatus.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ typedef NS_ENUM(NSInteger, RNPType) {
3232
RNPTypeBluetooth,
3333
RNPTypeNotification,
3434
RNPTypeBackgroundRefresh,
35-
RNPTypeSpeechRecognition
35+
RNPTypeSpeechRecognition,
36+
RNPTypeMotion
3637
};
3738

3839
@interface RCTConvert (RNPStatus)

ios/RCTConvert+RNPStatus.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ @implementation RCTConvert (RNPStatus)
2020
@"bluetooth" : @(RNPTypeBluetooth),
2121
@"notification" : @(RNPTypeNotification),
2222
@"backgroundRefresh": @(RNPTypeBackgroundRefresh),
23-
@"speechRecognition": @(RNPTypeSpeechRecognition)
23+
@"speechRecognition": @(RNPTypeSpeechRecognition),
24+
@"motion": @(RNPTypeMotion)
2425
}),
2526
RNPTypeUnknown, integerValue)
2627

ios/ReactNativePermissions.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#import "RNPContacts.h"
4444
#import "RNPBackgroundRefresh.h"
4545
#import "RNPSpeechRecognition.h"
46+
#import "RNPMotion.h"
4647

4748
@interface ReactNativePermissions()
4849
@property (strong, nonatomic) RNPLocation *locationMgr;
@@ -145,6 +146,9 @@ - (dispatch_queue_t)methodQueue {
145146
case RNPTypeSpeechRecognition:
146147
status = [RNPSpeechRecognition getStatus];
147148
break;
149+
case RNPTypeMotion:
150+
status = [RNPMotion getStatus];
151+
break;
148152
default:
149153
break;
150154
}
@@ -177,6 +181,8 @@ - (dispatch_queue_t)methodQueue {
177181
return [self requestNotification:json resolve:resolve];
178182
case RNPTypeSpeechRecognition:
179183
return [RNPSpeechRecognition request:resolve];
184+
case RNPTypeMotion:
185+
return [RNPMotion request:resolve];
180186
default:
181187
break;
182188
}

ios/ReactNativePermissions.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
669582131FE441A8008596CD /* RNPAudioVideo.m in Sources */ = {isa = PBXBuildFile; fileRef = 669582071FE441A7008596CD /* RNPAudioVideo.m */; };
1919
669582141FE441A8008596CD /* RNPContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 669582081FE441A8008596CD /* RNPContacts.m */; };
2020
669582151FE441A8008596CD /* RNPEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 6695820A1FE441A8008596CD /* RNPEvent.m */; };
21+
D0AD62322000657000D89898 /* RNPMotion.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AD62312000657000D89898 /* RNPMotion.m */; };
2122
/* End PBXBuildFile section */
2223

2324
/* Begin PBXCopyFilesBuildPhase section */
@@ -56,6 +57,8 @@
5657
6695820B1FE441A8008596CD /* RNPSpeechRecognition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNPSpeechRecognition.h; sourceTree = "<group>"; };
5758
6695820C1FE441A8008596CD /* RNPNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNPNotification.h; sourceTree = "<group>"; };
5859
9D23B34F1C767B80008B4819 /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativePermissions.a; sourceTree = BUILT_PRODUCTS_DIR; };
60+
D0AD62302000656F00D89898 /* RNPMotion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNPMotion.h; sourceTree = "<group>"; };
61+
D0AD62312000657000D89898 /* RNPMotion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNPMotion.m; sourceTree = "<group>"; };
5962
/* End PBXFileReference section */
6063

6164
/* Begin PBXFrameworksBuildPhase section */
@@ -82,6 +85,8 @@
8285
669582081FE441A8008596CD /* RNPContacts.m */,
8386
669582061FE441A7008596CD /* RNPEvent.h */,
8487
6695820A1FE441A8008596CD /* RNPEvent.m */,
88+
D0AD62302000656F00D89898 /* RNPMotion.h */,
89+
D0AD62312000657000D89898 /* RNPMotion.m */,
8590
669582021FE441A7008596CD /* RNPLocation.h */,
8691
669581FE1FE441A7008596CD /* RNPLocation.m */,
8792
6695820C1FE441A8008596CD /* RNPNotification.h */,
@@ -179,6 +184,7 @@
179184
669582141FE441A8008596CD /* RNPContacts.m in Sources */,
180185
6695820D1FE441A8008596CD /* RNPSpeechRecognition.m in Sources */,
181186
669582131FE441A8008596CD /* RNPAudioVideo.m in Sources */,
187+
D0AD62322000657000D89898 /* RNPMotion.m in Sources */,
182188
669581F81FE4416B008596CD /* ReactNativePermissions.m in Sources */,
183189
669582121FE441A8008596CD /* RNPPhoto.m in Sources */,
184190
);

lib/permissions.ios.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const permissionTypes = [
2020
'notification',
2121
'backgroundRefresh',
2222
'speechRecognition',
23+
'motion'
2324
]
2425

2526
const DEFAULTS = {

0 commit comments

Comments
 (0)