PermissionsAsker.m 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // PermissionsAsker.m
  3. // ReactNativePermissions
  4. //
  5. // Created by Yonah Forst on 07/07/16.
  6. // Copyright © 2016 Yonah Forst. All rights reserved.
  7. //
  8. #import "PermissionsAsker.h"
  9. #import <AddressBook/AddressBook.h>
  10. #import <AssetsLibrary/AssetsLibrary.h>
  11. #import <EventKit/EventKit.h>
  12. #import <CoreLocation/CoreLocation.h>
  13. #import <AVFoundation/AVFoundation.h>
  14. #import <CoreBluetooth/CoreBluetooth.h>
  15. #import "PermissionsChecker.h"
  16. static PermissionsAsker *__sharedInstance;
  17. @interface PermissionsAsker() <CLLocationManagerDelegate, CBPeripheralManagerDelegate>
  18. @property (strong, nonatomic) CLLocationManager *locationManager;
  19. @property (strong, nonatomic) CBPeripheralManager *peripheralManager;
  20. @property (copy) void (^notificationCompletionBlock)(RNPermissionsStatus);
  21. @end
  22. @implementation PermissionsAsker
  23. + (instancetype) sharedInstance
  24. {
  25. static dispatch_once_t onceToken;
  26. dispatch_once(&onceToken, ^{
  27. __sharedInstance = [[PermissionsAsker alloc] init];
  28. });
  29. return __sharedInstance;
  30. }
  31. - (void)location:(NSString *)type
  32. {
  33. self.locationManager = [[CLLocationManager alloc] init];
  34. self.locationManager.delegate = self;
  35. if ([type isEqualToString:@"always"]) {
  36. [self.locationManager requestAlwaysAuthorization];
  37. } else {
  38. [self.locationManager requestWhenInUseAuthorization];
  39. }
  40. }
  41. - (void)notification:(UIUserNotificationType)types completionHandler:(void (^)(RNPermissionsStatus))completionHandler
  42. {
  43. BOOL didAskForPermission = [[NSUserDefaults standardUserDefaults] boolForKey:@"DidAskForNotifications"];
  44. if (!didAskForPermission) {
  45. self.notificationCompletionBlock = completionHandler;
  46. [[NSNotificationCenter defaultCenter] addObserver:self
  47. selector:@selector(applicationDidBecomeActive)
  48. name:UIApplicationDidBecomeActiveNotification
  49. object:nil];
  50. if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
  51. // iOS8+
  52. UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
  53. [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
  54. [[UIApplication sharedApplication] registerForRemoteNotifications];
  55. } else {
  56. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationType)types];
  57. }
  58. [[NSUserDefaults standardUserDefaults] setBool:YES
  59. forKey:@"DidAskForNotifications"];
  60. [[NSUserDefaults standardUserDefaults] synchronize];
  61. } else {
  62. RNPermissionsStatus status = [PermissionsChecker notification];
  63. completionHandler(status);
  64. }
  65. }
  66. - (void)applicationDidBecomeActive
  67. {
  68. [[NSNotificationCenter defaultCenter] removeObserver:self
  69. name:UIApplicationDidBecomeActiveNotification
  70. object:nil];
  71. //for some reason, checking permission right away returns denied. need to wait a tiny bit
  72. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  73. RNPermissionsStatus status = [PermissionsChecker notification];
  74. self.notificationCompletionBlock(status);
  75. self.notificationCompletionBlock = nil;
  76. });
  77. }
  78. - (void)bluetooth
  79. {
  80. self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
  81. [self.peripheralManager startAdvertising:@{}];
  82. }
  83. - (void) peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheralManager
  84. {
  85. if (self.peripheralManager) {
  86. [self.peripheralManager stopAdvertising];
  87. self.peripheralManager = nil;
  88. }
  89. }
  90. @end