RNPermissionHandlerMotion.m 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #import "RNPermissionHandlerMotion.h"
  2. @import CoreMotion;
  3. static NSString* handlerKey = @"motion";
  4. @interface RNPermissionHandlerMotion()
  5. @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager;
  6. @property (nonatomic, strong) NSOperationQueue *motionActivityQueue;
  7. @end
  8. @implementation RNPermissionHandlerMotion
  9. + (NSArray<NSString *> *)usageDescriptionKeys {
  10. return @[@"NSMotionUsageDescription"];
  11. }
  12. - (void)checkWithResolver:(void (^)(RNPermissionStatus status))resolve
  13. withRejecter:(void (^)(NSError *error))reject {
  14. if (![CMMotionActivityManager isActivityAvailable]) {
  15. return resolve(RNPermissionStatusNotAvailable);
  16. }
  17. if (@available(iOS 11.0, *)) {
  18. switch ([CMMotionActivityManager authorizationStatus]) {
  19. case CMAuthorizationStatusNotDetermined:
  20. return resolve(RNPermissionStatusNotDetermined);
  21. case CMAuthorizationStatusRestricted:
  22. return resolve(RNPermissionStatusRestricted);
  23. case CMAuthorizationStatusDenied:
  24. return resolve(RNPermissionStatusDenied);
  25. case CMAuthorizationStatusAuthorized:
  26. return resolve(RNPermissionStatusAuthorized);
  27. }
  28. }
  29. if (![RNPermissionsManager hasBeenRequestedOnce:self]) {
  30. return resolve(RNPermissionStatusNotDetermined);
  31. }
  32. [self requestWithOptions:nil withResolver:resolve withRejecter:reject];
  33. }
  34. - (void)requestWithOptions:(__unused NSDictionary * _Nullable)options
  35. withResolver:(void (^)(RNPermissionStatus status))resolve
  36. withRejecter:(void (^)(NSError *error))reject {
  37. if (![CMMotionActivityManager isActivityAvailable]) {
  38. return resolve(RNPermissionStatusNotAvailable);
  39. }
  40. _motionActivityManager = [CMMotionActivityManager new];
  41. _motionActivityQueue = [NSOperationQueue new];
  42. [_motionActivityManager queryActivityStartingFromDate:[NSDate distantPast] toDate:[NSDate date] toQueue:_motionActivityQueue withHandler:^(NSArray<CMMotionActivity *> * _Nullable activities, NSError * _Nullable error) {
  43. if (error != nil) {
  44. if (error.code == CMErrorNotAuthorized || error.code == CMErrorMotionActivityNotAuthorized) {
  45. resolve(RNPermissionStatusDenied);
  46. } else {
  47. reject(error);
  48. }
  49. } else if (activities) {
  50. resolve(RNPermissionStatusAuthorized);
  51. } else {
  52. resolve(RNPermissionStatusNotDetermined);
  53. }
  54. self->_motionActivityManager = nil;
  55. self->_motionActivityQueue = nil;
  56. }];
  57. }
  58. @end