PermissionsChecker.m 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //
  2. // PermissionsChecker
  3. // PermissionsChecker
  4. //
  5. // Created by Yonah Forst on 18/02/16.
  6. // Copyright © 2016 Yonah Forst. All rights reserved.
  7. //
  8. @import Contacts;
  9. #import "PermissionsChecker.h"
  10. #import <AddressBook/AddressBook.h>
  11. #import <AssetsLibrary/AssetsLibrary.h>
  12. #import <EventKit/EventKit.h>
  13. #import <CoreLocation/CoreLocation.h>
  14. #import <AVFoundation/AVFoundation.h>
  15. #import <CoreBluetooth/CoreBluetooth.h>
  16. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
  17. @import Contacts;
  18. @import Photos;
  19. #endif
  20. @interface PermissionsChecker()
  21. @end
  22. @implementation PermissionsChecker
  23. + (BOOL)canOpenSettings
  24. {
  25. return UIApplicationOpenSettingsURLString != nil;
  26. }
  27. + (void)openSettings
  28. {
  29. if ([self canOpenSettings]) {
  30. NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
  31. [[UIApplication sharedApplication] openURL:url];
  32. }
  33. }
  34. + (RNPermissionsStatus)location
  35. {
  36. int status = [CLLocationManager authorizationStatus];
  37. switch (status) {
  38. case kCLAuthorizationStatusAuthorizedAlways:
  39. case kCLAuthorizationStatusAuthorizedWhenInUse:
  40. return RNPermissionsStatusAuthorized;
  41. case kCLAuthorizationStatusDenied:
  42. return RNPermissionsStatusDenied;
  43. case kCLAuthorizationStatusRestricted:
  44. return RNPermissionsStatusRestricted;
  45. default:
  46. return RNPermissionsStatusUndetermined;
  47. }
  48. }
  49. + (RNPermissionsStatus)camera
  50. {
  51. int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
  52. switch (status) {
  53. case AVAuthorizationStatusAuthorized:
  54. return RNPermissionsStatusAuthorized;
  55. case AVAuthorizationStatusDenied:
  56. return RNPermissionsStatusDenied;
  57. case AVAuthorizationStatusRestricted:
  58. return RNPermissionsStatusRestricted;
  59. default:
  60. return RNPermissionsStatusUndetermined;
  61. }
  62. }
  63. + (RNPermissionsStatus)microphone
  64. {
  65. int status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
  66. switch (status) {
  67. case AVAuthorizationStatusAuthorized:
  68. return RNPermissionsStatusAuthorized;
  69. case AVAuthorizationStatusDenied:
  70. return RNPermissionsStatusDenied;
  71. case AVAuthorizationStatusRestricted:
  72. return RNPermissionsStatusRestricted;
  73. default:
  74. return RNPermissionsStatusUndetermined;
  75. }
  76. }
  77. + (RNPermissionsStatus)photo
  78. {
  79. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
  80. int status = [PHPhotoLibrary authorizationStatus];
  81. switch (status) {
  82. case PHAuthorizationStatusAuthorized:
  83. return RNPermissionsStatusAuthorized;
  84. case PHAuthorizationStatusDenied:
  85. return RNPermissionsStatusDenied;
  86. case PHAuthorizationStatusRestricted:
  87. return RNPermissionsStatusRestricted;
  88. default:
  89. return RNPermissionsStatusUndetermined;
  90. }
  91. #else
  92. int status = ABAddressBookGetAuthorizationStatus();
  93. switch (status) {
  94. case kABAuthorizationStatusAuthorized:
  95. return RNPermissionsStatusAuthorized;
  96. case kABAuthorizationStatusDenied:
  97. return RNPermissionsStatusDenied;
  98. case kABAuthorizationStatusRestricted:
  99. return RNPermissionsStatusRestricted;
  100. default:
  101. return RNPermissionsStatusUndetermined;
  102. }
  103. #endif
  104. }
  105. + (RNPermissionsStatus)contacts
  106. {
  107. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0
  108. int status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
  109. switch (status) {
  110. case CNAuthorizationStatusAuthorized:
  111. return RNPermissionsStatusAuthorized;
  112. case CNAuthorizationStatusDenied:
  113. return RNPermissionsStatusDenied;
  114. case CNAuthorizationStatusRestricted:
  115. return RNPermissionsStatusRestricted;
  116. default:
  117. return RNPermissionsStatusUndetermined;
  118. }
  119. #else
  120. int status = ABAddressBookGetAuthorizationStatus();
  121. switch (status) {
  122. case kABAuthorizationStatusAuthorized:
  123. return RNPermissionsStatusAuthorized;
  124. case kABAuthorizationStatusDenied:
  125. return RNPermissionsStatusDenied;
  126. case kABAuthorizationStatusRestricted:
  127. return RNPermissionsStatusRestricted;
  128. default:
  129. return RNPermissionsStatusUndetermined;
  130. }
  131. #endif
  132. }
  133. + (RNPermissionsStatus)event
  134. {
  135. int status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
  136. switch (status) {
  137. case EKAuthorizationStatusAuthorized:
  138. return RNPermissionsStatusAuthorized;
  139. case EKAuthorizationStatusDenied:
  140. return RNPermissionsStatusDenied;
  141. case EKAuthorizationStatusRestricted:
  142. return RNPermissionsStatusRestricted;
  143. default:
  144. return RNPermissionsStatusUndetermined;
  145. }
  146. }
  147. + (RNPermissionsStatus)reminder
  148. {
  149. int status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
  150. switch (status) {
  151. case EKAuthorizationStatusAuthorized:
  152. return RNPermissionsStatusAuthorized;
  153. case EKAuthorizationStatusDenied:
  154. return RNPermissionsStatusDenied;
  155. case EKAuthorizationStatusRestricted:
  156. return RNPermissionsStatusRestricted;
  157. default:
  158. return RNPermissionsStatusUndetermined;
  159. }
  160. }
  161. + (RNPermissionsStatus)bluetooth
  162. {
  163. int status = [CBPeripheralManager authorizationStatus];
  164. switch (status) {
  165. case CBPeripheralManagerAuthorizationStatusAuthorized:
  166. return RNPermissionsStatusAuthorized;
  167. case CBPeripheralManagerAuthorizationStatusDenied:
  168. return RNPermissionsStatusDenied;
  169. case CBPeripheralManagerAuthorizationStatusRestricted:
  170. return RNPermissionsStatusRestricted;
  171. default:
  172. return RNPermissionsStatusUndetermined;
  173. }
  174. }
  175. //problem here is that we can only return Authorized or Undetermined
  176. + (RNPermissionsStatus)notification
  177. {
  178. BOOL didAskForPermission = [[NSUserDefaults standardUserDefaults] boolForKey:@"DidAskForNotifications"];
  179. if (didAskForPermission) {
  180. if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
  181. // iOS8+
  182. BOOL isRegistered = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
  183. BOOL isEnabled = [[[UIApplication sharedApplication] currentUserNotificationSettings] types] != UIUserNotificationTypeNone;
  184. if (isRegistered || isEnabled) {
  185. return isEnabled ? RNPermissionsStatusAuthorized : RNPermissionsStatusDenied;
  186. }
  187. else {
  188. return RNPermissionsStatusDenied;
  189. }
  190. } else {
  191. if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
  192. return RNPermissionsStatusDenied;
  193. }
  194. else {
  195. return RNPermissionsStatusAuthorized;
  196. }
  197. }
  198. } else {
  199. return RNPermissionsStatusUndetermined;
  200. }
  201. }
  202. + (RNPermissionsStatus)backgroundRefresh
  203. {
  204. int status = [[UIApplication sharedApplication] backgroundRefreshStatus];
  205. switch (status) {
  206. case UIBackgroundRefreshStatusAvailable:
  207. return RNPermissionsStatusAuthorized;
  208. case UIBackgroundRefreshStatusDenied:
  209. return RNPermissionsStatusDenied;
  210. case UIBackgroundRefreshStatusRestricted:
  211. return RNPermissionsStatusRestricted;
  212. default:
  213. return RNPermissionsStatusUndetermined;
  214. }
  215. }
  216. @end