RNPMotion.m 2.0KB

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