12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #import "RNPermissionHandlerBluetoothPeripheral.h"
-
- @import CoreBluetooth;
-
- @interface RNPermissionHandlerBluetoothPeripheral() <CBPeripheralManagerDelegate>
-
- @property (nonatomic, strong) CBPeripheralManager* peripheralManager;
- @property (nonatomic, strong) void (^resolve)(RNPermissionStatus status);
- @property (nonatomic, strong) void (^reject)(NSError *error);
-
- @end
-
- @implementation RNPermissionHandlerBluetoothPeripheral
-
- + (NSArray<NSString *> * _Nonnull)usageDescriptionKeys {
- return @[
- @"NSBluetoothPeripheralUsageDescription",
- @"NSBluetoothAlwaysUsageDescription",
- ];
- }
-
- + (NSString * _Nonnull)handlerUniqueId {
- return @"ios.permission.BLUETOOTH_PERIPHERAL";
- }
-
- - (void)checkWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
- rejecter:(void (__unused ^ _Nonnull)(NSError * _Nonnull))reject {
- #if TARGET_OS_SIMULATOR
- return resolve(RNPermissionStatusNotAvailable);
- #else
- if (![RNPermissions isBackgroundModeEnabled:@"bluetooth-peripheral"]) {
- return resolve(RNPermissionStatusNotAvailable);
- }
-
- switch ([CBPeripheralManager authorizationStatus]) {
- case CBPeripheralManagerAuthorizationStatusNotDetermined:
- return resolve(RNPermissionStatusNotDetermined);
- case CBPeripheralManagerAuthorizationStatusRestricted:
- return resolve(RNPermissionStatusRestricted);
- case CBPeripheralManagerAuthorizationStatusDenied:
- return resolve(RNPermissionStatusDenied);
- case CBPeripheralManagerAuthorizationStatusAuthorized:
- return resolve(RNPermissionStatusAuthorized);
- }
- #endif
- }
-
- - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
- rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
- if (![RNPermissions isBackgroundModeEnabled:@"bluetooth-peripheral"]) {
- return resolve(RNPermissionStatusNotAvailable);
- }
-
- _resolve = resolve;
- _reject = reject;
-
- _peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:@{
- CBPeripheralManagerOptionShowPowerAlertKey: @false,
- }];
-
- [_peripheralManager startAdvertising:@{}];
- }
-
- - (void)peripheralManagerDidUpdateState:(nonnull CBPeripheralManager *)peripheral {
- int state = peripheral.state;
-
- [_peripheralManager stopAdvertising];
- _peripheralManager = nil;
-
- switch (state) {
- case CBManagerStatePoweredOff:
- case CBManagerStateResetting:
- case CBManagerStateUnsupported:
- return _resolve(RNPermissionStatusNotAvailable);
- case CBManagerStateUnknown:
- return _resolve(RNPermissionStatusNotDetermined);
- case CBManagerStateUnauthorized:
- return _resolve(RNPermissionStatusDenied);
- case CBManagerStatePoweredOn:
- return [self checkWithResolver:_resolve rejecter:_reject];
- }
- }
-
- @end
|