react-native-ble-manager 8.8.0 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +131 -44
  2. package/android/.gradle/7.4/checksums/checksums.lock +0 -0
  3. package/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock +0 -0
  4. package/android/.gradle/7.4/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/7.4/executionHistory/executionHistory.bin +0 -0
  6. package/android/.gradle/7.4/executionHistory/executionHistory.lock +0 -0
  7. package/android/.gradle/7.4/fileChanges/last-build.bin +0 -0
  8. package/android/.gradle/7.4/fileHashes/fileHashes.bin +0 -0
  9. package/android/.gradle/7.4/fileHashes/fileHashes.lock +0 -0
  10. package/android/.gradle/7.4/fileHashes/resourceHashesCache.bin +0 -0
  11. package/android/.gradle/7.4/gc.properties +0 -0
  12. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  13. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  14. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  15. package/android/.gradle/file-system.probe +0 -0
  16. package/android/.gradle/vcs-1/gc.properties +0 -0
  17. package/android/.idea/.name +1 -0
  18. package/android/.idea/compiler.xml +6 -0
  19. package/android/.idea/gradle.xml +18 -0
  20. package/android/.idea/jarRepositories.xml +40 -0
  21. package/android/.idea/misc.xml +10 -0
  22. package/android/.idea/vcs.xml +6 -0
  23. package/android/build.gradle +17 -17
  24. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  25. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  26. package/android/gradle.properties +3 -1
  27. package/android/gradlew +234 -0
  28. package/android/gradlew.bat +89 -0
  29. package/android/local.properties +8 -0
  30. package/android/src/main/java/it/innove/BleManager.java +38 -17
  31. package/android/src/main/java/it/innove/LegacyScanManager.java +33 -28
  32. package/android/src/main/java/it/innove/LollipopPeripheral.java +66 -65
  33. package/android/src/main/java/it/innove/LollipopScanManager.java +52 -25
  34. package/android/src/main/java/it/innove/Peripheral.java +973 -838
  35. package/android/src/main/java/it/innove/ScanManager.java +24 -23
  36. package/dist/cjs/index.d.ts +156 -0
  37. package/dist/cjs/index.js +507 -0
  38. package/dist/cjs/index.js.map +1 -0
  39. package/dist/cjs/types.d.ts +311 -0
  40. package/dist/cjs/types.js +110 -0
  41. package/dist/cjs/types.js.map +1 -0
  42. package/dist/esm/index.d.ts +156 -0
  43. package/dist/esm/index.js +491 -0
  44. package/dist/esm/index.js.map +1 -0
  45. package/dist/esm/types.d.ts +311 -0
  46. package/dist/esm/types.js +107 -0
  47. package/dist/esm/types.js.map +1 -0
  48. package/ios/BleManager.h +1 -0
  49. package/ios/BleManager.m +213 -115
  50. package/ios/BleManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  51. package/ios/BleManager.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  52. package/ios/BleManager.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  53. package/ios/CBPeripheral+Extensions.m +1 -1
  54. package/package.json +31 -4
  55. package/src/index.ts +595 -0
  56. package/src/types.ts +336 -0
  57. package/.github/FUNDING.yml +0 -3
  58. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  59. package/BleManager.js +0 -427
  60. package/index.d.ts +0 -294
package/ios/BleManager.m CHANGED
@@ -28,6 +28,7 @@ bool hasListeners;
28
28
  retrieveServicesLatches = [NSMutableDictionary new];
29
29
  readCallbacks = [NSMutableDictionary new];
30
30
  readRSSICallbacks = [NSMutableDictionary new];
31
+ readDescriptorCallbacks = [NSMutableDictionary new];
31
32
  retrieveServicesCallbacks = [NSMutableDictionary new];
32
33
  writeCallbacks = [NSMutableDictionary new];
33
34
  writeQueue = [NSMutableArray array];
@@ -82,21 +83,17 @@ bool hasListeners;
82
83
 
83
84
  - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
84
85
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
85
- RCTResponseSenderBlock readCallback = [readCallbacks objectForKey:key];
86
86
 
87
87
  if (error) {
88
88
  NSLog(@"Error %@ :%@", characteristic.UUID, error);
89
- if (readCallback != NULL) {
90
- readCallback(@[error, [NSNull null]]);
91
- [readCallbacks removeObjectForKey:key];
92
- }
89
+ [self invokeAndClearDictionary:readCallbacks withKey:key usingParameters:@[error, [NSNull null]]];
93
90
  return;
94
91
  }
95
92
  NSLog(@"Read value [%@]: (%lu) %@", characteristic.UUID, [characteristic.value length], characteristic.value);
96
-
97
- if (readCallback != NULL) {
98
- readCallback(@[[NSNull null], ([characteristic.value length] > 0) ? [characteristic.value toArray] : [NSNull null]]);
99
- [readCallbacks removeObjectForKey:key];
93
+
94
+ NSMutableArray* peripheralReadCallbacks = [readCallbacks objectForKey:key];
95
+ if (peripheralReadCallbacks != NULL) {
96
+ [self invokeAndClearDictionary:readCallbacks withKey:key usingParameters:@[[NSNull null], ([characteristic.value length] > 0) ? [characteristic.value toArray] : [NSNull null]]];
100
97
  } else {
101
98
  if (hasListeners) {
102
99
  [self sendEventWithName:@"BleManagerDidUpdateValueForCharacteristic" body:@{@"peripheral": peripheral.uuidAsString, @"characteristic":characteristic.UUID.UUIDString, @"service":characteristic.service.UUID.UUIDString, @"value": ([characteristic.value length] > 0) ? [characteristic.value toArray] : [NSNull null]}];
@@ -104,6 +101,47 @@ bool hasListeners;
104
101
  }
105
102
  }
106
103
 
104
+ - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(nonnull CBDescriptor *)descriptor error:(nullable NSError *)error {
105
+ NSString *key = [self keyForPeripheral: peripheral andCharacteristic:descriptor.characteristic andDescriptor:descriptor];
106
+
107
+ if (error) {
108
+ NSLog(@"Error reading descriptor value for %@ on characteristic %@ :%@",
109
+ descriptor.UUID,
110
+ descriptor.characteristic.UUID,
111
+ error);
112
+ [self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[error, [NSNull null]]];
113
+ return;
114
+ }
115
+ NSLog(@"Read value [descriptor: %@, characteristic: %@]: (%lu) %@",
116
+ descriptor.UUID,
117
+ descriptor.characteristic.UUID,
118
+ [descriptor.value length],
119
+ descriptor.value);
120
+
121
+ NSMutableArray* peripheralReadDescriptorCallbacks = [readDescriptorCallbacks objectForKey:key];
122
+ if (peripheralReadDescriptorCallbacks != NULL) {
123
+ // The most future proof way of doing this that I could find, other option would be running strcmp on CBUUID strings
124
+ // https://developer.apple.com/documentation/corebluetooth/cbuuid/characteristic_descriptors
125
+ if ([descriptor.value isKindOfClass:[NSData class]]) {
126
+ [self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([descriptor.value length] > 0) ? [descriptor.value toArray] : [NSNull null]]];
127
+ } else if ([descriptor.value isKindOfClass:[NSNumber class]]) {
128
+ NSMutableData *byteData = [NSMutableData new];
129
+ if (descriptor.value != nil) {
130
+ NSNumber *number = descriptor.value;
131
+ unsigned long long value = number.unsignedLongLongValue;
132
+ [byteData appendBytes:&value length:sizeof(value)];
133
+ }
134
+ [self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([byteData length] > 0) ? [byteData toArray] : [NSNull null]]];
135
+ } else if ([descriptor.value isKindOfClass:[NSString class]]) {
136
+ NSData *byteData = [descriptor.value dataUsingEncoding:NSUTF8StringEncoding];
137
+ [self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([byteData length] > 0) ? [byteData toArray] : [NSNull null]]];
138
+ } else {
139
+ NSLog(@"Unrecognized type of descriptor: (UUID: %@, value type: %@, value: %@)", descriptor.UUID, [descriptor.value class], descriptor.value);
140
+ [self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([descriptor.value length] > 0) ? [descriptor.value toArray] : [NSNull null]]];
141
+ }
142
+ }
143
+ }
144
+
107
145
  - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
108
146
  if (error) {
109
147
  NSLog(@"Error in didUpdateNotificationStateForCharacteristic: %@", error);
@@ -118,27 +156,25 @@ bool hasListeners;
118
156
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
119
157
 
120
158
  if (characteristic.isNotifying) {
121
- RCTResponseSenderBlock notificationCallback = [notificationCallbacks objectForKey:key];
122
- if (notificationCallback != nil) {
159
+ NSMutableArray* peripheralNotificationCallbacks = [notificationCallbacks objectForKey:key];
160
+ if (peripheralNotificationCallbacks != nil) {
123
161
  if (error) {
124
- notificationCallback(@[error]);
162
+ [self invokeAndClearDictionary:notificationCallbacks withKey:key usingParameters:@[error]];
125
163
  } else {
126
164
  NSLog(@"Notification began on %@", characteristic.UUID);
127
- notificationCallback(@[]);
165
+ [self invokeAndClearDictionary:notificationCallbacks withKey:key usingParameters:@[]];
128
166
  }
129
- [notificationCallbacks removeObjectForKey:key];
130
167
  }
131
168
  } else {
132
169
  // Notification has stopped
133
- RCTResponseSenderBlock stopNotificationCallback = [stopNotificationCallbacks objectForKey:key];
134
- if (stopNotificationCallback != nil) {
170
+ NSMutableArray* peripheralStopNotificationCallbacks = [stopNotificationCallbacks objectForKey:key];
171
+ if (peripheralStopNotificationCallbacks != nil) {
135
172
  if (error) {
136
- stopNotificationCallback(@[error]);
173
+ [self invokeAndClearDictionary:stopNotificationCallbacks withKey:key usingParameters:@[error]];
137
174
  } else {
138
175
  NSLog(@"Notification ended on %@", characteristic.UUID);
139
- stopNotificationCallback(@[]);
176
+ [self invokeAndClearDictionary:stopNotificationCallbacks withKey:key usingParameters:@[]];
140
177
  }
141
- [stopNotificationCallbacks removeObjectForKey:key];
142
178
  }
143
179
  }
144
180
  if (hasListeners) {
@@ -152,17 +188,17 @@ bool hasListeners;
152
188
  - (NSString *) centralManagerStateToString: (int)state
153
189
  {
154
190
  switch (state) {
155
- case CBCentralManagerStateUnknown:
191
+ case CBManagerStateUnknown:
156
192
  return @"unknown";
157
- case CBCentralManagerStateResetting:
193
+ case CBManagerStateResetting:
158
194
  return @"resetting";
159
- case CBCentralManagerStateUnsupported:
195
+ case CBManagerStateUnsupported:
160
196
  return @"unsupported";
161
- case CBCentralManagerStateUnauthorized:
197
+ case CBManagerStateUnauthorized:
162
198
  return @"unauthorized";
163
- case CBCentralManagerStatePoweredOff:
199
+ case CBManagerStatePoweredOff:
164
200
  return @"off";
165
- case CBCentralManagerStatePoweredOn:
201
+ case CBManagerStatePoweredOn:
166
202
  return @"on";
167
203
  default:
168
204
  return @"unknown";
@@ -192,12 +228,18 @@ bool hasListeners;
192
228
  - (NSString *) periphalManagerStateToString: (int)state
193
229
  {
194
230
  switch (state) {
195
- case CBPeripheralManagerStateUnknown:
196
- return @"Unknown";
197
- case CBPeripheralManagerStatePoweredOn:
198
- return @"PoweredOn";
199
- case CBPeripheralManagerStatePoweredOff:
200
- return @"PoweredOff";
231
+ case CBManagerStateUnknown:
232
+ return @"unknown";
233
+ case CBManagerStateResetting:
234
+ return @"resetting";
235
+ case CBManagerStateUnsupported:
236
+ return @"unsupported";
237
+ case CBManagerStateUnauthorized:
238
+ return @"unauthorized";
239
+ case CBManagerStatePoweredOff:
240
+ return @"off";
241
+ case CBManagerStatePoweredOn:
242
+ return @"on";
201
243
  default:
202
244
  return @"unknown";
203
245
  }
@@ -435,8 +477,8 @@ RCT_EXPORT_METHOD(connect:(NSString *)peripheralUUID callback:(nonnull RCTRespon
435
477
  }
436
478
  if (peripheral) {
437
479
  NSLog(@"Connecting to peripheral with UUID : %@", peripheralUUID);
438
-
439
- [connectCallbacks setObject:callback forKey:[peripheral uuidAsString]];
480
+
481
+ [self insertCallback:callback intoDictionary:connectCallbacks withKey:[peripheral uuidAsString]];
440
482
  [manager connectPeripheral:peripheral options:nil];
441
483
 
442
484
  } else {
@@ -475,10 +517,13 @@ RCT_EXPORT_METHOD(disconnect:(NSString *)peripheralUUID force:(BOOL)force callba
475
517
  }
476
518
  }
477
519
 
478
- RCT_EXPORT_METHOD(checkState)
520
+ RCT_EXPORT_METHOD(checkState:(nonnull RCTResponseSenderBlock)callback)
479
521
  {
480
522
  if (manager != nil){
481
523
  [self centralManagerDidUpdateState:self.manager];
524
+
525
+ NSString *stateName = [self centralManagerStateToString:self.manager.state];
526
+ callback(@[stateName]);
482
527
  }
483
528
  }
484
529
 
@@ -486,12 +531,8 @@ RCT_EXPORT_METHOD(checkState)
486
531
  {
487
532
  NSString *errorStr = [NSString stringWithFormat:@"Peripheral connection failure: %@. (%@)", peripheral, [error localizedDescription]];
488
533
  NSLog(@"%@", errorStr);
489
- RCTResponseSenderBlock connectCallback = [connectCallbacks valueForKey:[peripheral uuidAsString]];
490
-
491
- if (connectCallback) {
492
- connectCallback(@[errorStr]);
493
- [connectCallbacks removeObjectForKey:[peripheral uuidAsString]];
494
- }
534
+
535
+ [self invokeAndClearDictionary:connectCallbacks withKey:[peripheral uuidAsString] usingParameters:@[errorStr]];
495
536
  }
496
537
 
497
538
  RCT_EXPORT_METHOD(write:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUID characteristicUUID:(NSString*)characteristicUUID message:(NSArray*)message maxByteSize:(NSInteger)maxByteSize callback:(nonnull RCTResponseSenderBlock)callback)
@@ -518,8 +559,8 @@ RCT_EXPORT_METHOD(write:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUI
518
559
  CBCharacteristic *characteristic = [context characteristic];
519
560
 
520
561
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
521
- [writeCallbacks setObject:callback forKey:key];
522
-
562
+ [self insertCallback:callback intoDictionary:writeCallbacks withKey:key];
563
+
523
564
  RCTLogInfo(@"Message to write(%lu): %@ ", (unsigned long)[dataMessage length], [dataMessage hexadecimalString]);
524
565
  if ([dataMessage length] > maxByteSize){
525
566
  int dataLength = (int)dataMessage.length;
@@ -606,7 +647,7 @@ RCT_EXPORT_METHOD(read:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUID
606
647
  CBCharacteristic *characteristic = [context characteristic];
607
648
 
608
649
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
609
- [readCallbacks setObject:callback forKey:key];
650
+ [self insertCallback:callback intoDictionary:readCallbacks withKey:key];
610
651
 
611
652
  [peripheral readValueForCharacteristic:characteristic]; // callback sends value
612
653
  }
@@ -620,7 +661,7 @@ RCT_EXPORT_METHOD(readRSSI:(NSString *)deviceUUID callback:(nonnull RCTResponseS
620
661
  CBPeripheral *peripheral = [self findPeripheralByUUID:deviceUUID];
621
662
 
622
663
  if (peripheral && peripheral.state == CBPeripheralStateConnected) {
623
- [readRSSICallbacks setObject:callback forKey:[peripheral uuidAsString]];
664
+ [self insertCallback:callback intoDictionary:readRSSICallbacks withKey:[peripheral uuidAsString]];
624
665
  [peripheral readRSSI];
625
666
  } else {
626
667
  callback(@[@"Peripheral not found or not connected"]);
@@ -628,6 +669,36 @@ RCT_EXPORT_METHOD(readRSSI:(NSString *)deviceUUID callback:(nonnull RCTResponseS
628
669
 
629
670
  }
630
671
 
672
+ RCT_EXPORT_METHOD(readDescriptor:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUID characteristicUUID:(NSString*)characteristicUUID descriptorUUID:(NSString*)descriptorUUID callback:(nonnull RCTResponseSenderBlock)callback)
673
+ {
674
+ NSLog(@"readDescriptor");
675
+
676
+ BLECommandContext *context = [self getData:deviceUUID serviceUUIDString:serviceUUID characteristicUUIDString:characteristicUUID prop:CBCharacteristicPropertyRead callback:callback];
677
+ if (context) {
678
+
679
+ CBPeripheral *peripheral = [context peripheral];
680
+ CBCharacteristic *characteristic = [context characteristic];
681
+ CBDescriptor *descriptor = [self findDescriptorFromUUID:[CBUUID UUIDWithString:descriptorUUID] characteristic:characteristic];
682
+ if (!descriptor) {
683
+ NSString* err = [NSString stringWithFormat:@"Could not find descriptor with UUID %@ on characteristic with UUID %@ on peripheral with UUID %@",
684
+ descriptorUUID,
685
+ characteristic.UUID,
686
+ peripheral.identifier.UUIDString];
687
+ NSLog(@"Could not find descriptor with UUID %@ on characteristic with UUID %@ on peripheral with UUID %@",
688
+ descriptorUUID,
689
+ characteristic.UUID,
690
+ peripheral.identifier.UUIDString);
691
+ callback(@[err]);
692
+ } else {
693
+ NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic andDescriptor:descriptor];
694
+ [self insertCallback:callback intoDictionary:readDescriptorCallbacks withKey:key];
695
+
696
+ [peripheral readValueForDescriptor:descriptor]; // callback sends value
697
+ }
698
+ }
699
+
700
+ }
701
+
631
702
  RCT_EXPORT_METHOD(retrieveServices:(NSString *)deviceUUID services:(NSArray<NSString *> *)services callback:(nonnull RCTResponseSenderBlock)callback)
632
703
  {
633
704
  NSLog(@"retrieveServices %@", services);
@@ -635,7 +706,7 @@ RCT_EXPORT_METHOD(retrieveServices:(NSString *)deviceUUID services:(NSArray<NSSt
635
706
  CBPeripheral *peripheral = [self findPeripheralByUUID:deviceUUID];
636
707
 
637
708
  if (peripheral && peripheral.state == CBPeripheralStateConnected) {
638
- [retrieveServicesCallbacks setObject:callback forKey:[peripheral uuidAsString]];
709
+ [self insertCallback:callback intoDictionary:retrieveServicesCallbacks withKey:[peripheral uuidAsString]];
639
710
 
640
711
  NSMutableArray<CBUUID *> *uuids = [NSMutableArray new];
641
712
  for ( NSString *string in services ) {
@@ -665,7 +736,7 @@ RCT_EXPORT_METHOD(startNotification:(NSString *)deviceUUID serviceUUID:(NSString
665
736
  CBCharacteristic *characteristic = [context characteristic];
666
737
 
667
738
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
668
- [notificationCallbacks setObject: callback forKey: key];
739
+ [self insertCallback:callback intoDictionary:notificationCallbacks withKey:key];
669
740
 
670
741
  [peripheral setNotifyValue:YES forCharacteristic:characteristic];
671
742
  }
@@ -684,7 +755,7 @@ RCT_EXPORT_METHOD(stopNotification:(NSString *)deviceUUID serviceUUID:(NSString*
684
755
 
685
756
  if ([characteristic isNotifying]){
686
757
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
687
- [stopNotificationCallbacks setObject: callback forKey: key];
758
+ [self insertCallback:callback intoDictionary:stopNotificationCallbacks withKey:key];
688
759
  [peripheral setNotifyValue:NO forCharacteristic:characteristic];
689
760
  NSLog(@"Characteristic stopped notifying");
690
761
  } else {
@@ -730,17 +801,15 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
730
801
  NSLog(@"didWrite");
731
802
 
732
803
  NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
733
- RCTResponseSenderBlock writeCallback = [writeCallbacks objectForKey:key];
804
+ NSMutableArray* peripheralWriteCallbacks = [writeCallbacks objectForKey:key];
734
805
 
735
- if (writeCallback) {
806
+ if (peripheralWriteCallbacks) {
736
807
  if (error) {
737
808
  NSLog(@"%@", error);
738
- [writeCallbacks removeObjectForKey:key];
739
- writeCallback(@[error.localizedDescription]);
809
+ [self invokeAndClearDictionary:writeCallbacks withKey:key usingParameters:@[error.localizedDescription]];
740
810
  } else {
741
811
  if ([writeQueue count] == 0) {
742
- [writeCallbacks removeObjectForKey:key];
743
- writeCallback(@[]);
812
+ [self invokeAndClearDictionary:writeCallbacks withKey:key usingParameters:@[]];
744
813
  }else{
745
814
  // Remove and write the queud message
746
815
  NSData *message = [writeQueue objectAtIndex:0];
@@ -750,18 +819,14 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
750
819
 
751
820
  }
752
821
  }
753
-
822
+
754
823
  }
755
824
 
756
825
 
757
826
  - (void)peripheral:(CBPeripheral*)peripheral didReadRSSI:(NSNumber*)rssi error:(NSError*)error {
758
827
  NSLog(@"didReadRSSI %@", rssi);
759
828
  NSString *key = [peripheral uuidAsString];
760
- RCTResponseSenderBlock readRSSICallback = [readRSSICallbacks objectForKey: key];
761
- if (readRSSICallback) {
762
- readRSSICallback(@[[NSNull null], [NSNumber numberWithInteger:[rssi integerValue]]]);
763
- [readRSSICallbacks removeObjectForKey:key];
764
- }
829
+ [self invokeAndClearDictionary:readRSSICallbacks withKey:key usingParameters:@[[NSNull null], [NSNumber numberWithInteger:[rssi integerValue]]]];
765
830
  }
766
831
 
767
832
 
@@ -776,14 +841,9 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
776
841
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.002 * NSEC_PER_SEC),
777
842
  dispatch_get_main_queue(), ^(void){
778
843
  // didFailToConnectPeripheral should have been called already if not connected by now
779
-
780
- RCTResponseSenderBlock connectCallback = [connectCallbacks valueForKey:[peripheral uuidAsString]];
781
-
782
- if (connectCallback) {
783
- connectCallback(@[[NSNull null], [peripheral asDictionary]]);
784
- [connectCallbacks removeObjectForKey:[peripheral uuidAsString]];
785
- }
786
-
844
+
845
+ [self invokeAndClearDictionary:self->connectCallbacks withKey:[peripheral uuidAsString] usingParameters:@[[NSNull null], [peripheral asDictionary]]];
846
+
787
847
  if (hasListeners) {
788
848
  [self sendEventWithName:@"BleManagerConnectPeripheral" body:@{@"peripheral": [peripheral uuidAsString]}];
789
849
  }
@@ -802,66 +862,43 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
802
862
  NSString *peripheralUUIDString = [peripheral uuidAsString];
803
863
 
804
864
  NSString *errorStr = [NSString stringWithFormat:@"Peripheral did disconnect: %@", peripheralUUIDString];
805
-
806
- RCTResponseSenderBlock connectCallback = [connectCallbacks valueForKey:peripheralUUIDString];
807
- if (connectCallback) {
808
- connectCallback(@[errorStr]);
809
- [connectCallbacks removeObjectForKey:peripheralUUIDString];
810
- }
811
-
812
- RCTResponseSenderBlock readRSSICallback = [readRSSICallbacks valueForKey:peripheralUUIDString];
813
- if (readRSSICallback) {
814
- readRSSICallback(@[errorStr]);
815
- [readRSSICallbacks removeObjectForKey:peripheralUUIDString];
816
- }
817
-
818
- RCTResponseSenderBlock retrieveServicesCallback = [retrieveServicesCallbacks valueForKey:peripheralUUIDString];
819
- if (retrieveServicesCallback) {
820
- retrieveServicesCallback(@[errorStr]);
821
- [retrieveServicesCallbacks removeObjectForKey:peripheralUUIDString];
822
- }
865
+
866
+ [self invokeAndClearDictionary:connectCallbacks withKey:peripheralUUIDString usingParameters:@[errorStr]];
867
+ [self invokeAndClearDictionary:readRSSICallbacks withKey:peripheralUUIDString usingParameters:@[errorStr]];
868
+ [self invokeAndClearDictionary:retrieveServicesCallbacks withKey:peripheralUUIDString usingParameters:@[errorStr]];
823
869
 
824
870
  NSArray* ourReadCallbacks = readCallbacks.allKeys;
825
871
  for (id key in ourReadCallbacks) {
826
872
  if ([key hasPrefix:peripheralUUIDString]) {
827
- RCTResponseSenderBlock callback = [readCallbacks objectForKey:key];
828
- if (callback) {
829
- callback(@[errorStr]);
830
- [readCallbacks removeObjectForKey:key];
831
- }
873
+ [self invokeAndClearDictionary:readCallbacks withKey:key usingParameters:@[errorStr]];
832
874
  }
833
875
  }
834
876
 
835
877
  NSArray* ourWriteCallbacks = writeCallbacks.allKeys;
836
878
  for (id key in ourWriteCallbacks) {
837
879
  if ([key hasPrefix:peripheralUUIDString]) {
838
- RCTResponseSenderBlock callback = [writeCallbacks objectForKey:key];
839
- if (callback) {
840
- callback(@[errorStr]);
841
- [writeCallbacks removeObjectForKey:key];
842
- }
880
+ [self invokeAndClearDictionary:writeCallbacks withKey:key usingParameters:@[errorStr]];
843
881
  }
844
882
  }
845
883
 
846
884
  NSArray* ourNotificationCallbacks = notificationCallbacks.allKeys;
847
885
  for (id key in ourNotificationCallbacks) {
848
886
  if ([key hasPrefix:peripheralUUIDString]) {
849
- RCTResponseSenderBlock callback = [notificationCallbacks objectForKey:key];
850
- if (callback) {
851
- callback(@[errorStr]);
852
- [notificationCallbacks removeObjectForKey:key];
853
- }
887
+ [self invokeAndClearDictionary:notificationCallbacks withKey:key usingParameters:@[errorStr]];
888
+ }
889
+ }
890
+
891
+ NSArray* ourReadDescriptorCallbacks = readDescriptorCallbacks.allKeys;
892
+ for (id key in ourReadDescriptorCallbacks) {
893
+ if ([key hasPrefix:peripheralUUIDString]) {
894
+ [self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[errorStr]];
854
895
  }
855
896
  }
856
897
 
857
898
  NSArray* ourStopNotificationsCallbacks = stopNotificationCallbacks.allKeys;
858
899
  for (id key in ourStopNotificationsCallbacks) {
859
900
  if ([key hasPrefix:peripheralUUIDString]) {
860
- RCTResponseSenderBlock callback = [stopNotificationCallbacks objectForKey:key];
861
- if (callback) {
862
- callback(@[errorStr]);
863
- [stopNotificationCallbacks removeObjectForKey:key];
864
- }
901
+ [self invokeAndClearDictionary:stopNotificationCallbacks withKey:key usingParameters:@[errorStr]];
865
902
  }
866
903
  }
867
904
 
@@ -903,17 +940,37 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
903
940
  NSLog(@"Characteristics For Service Discover");
904
941
 
905
942
  NSString *peripheralUUIDString = [peripheral uuidAsString];
906
- NSMutableSet *latch = [retrieveServicesLatches valueForKey:peripheralUUIDString];
907
- [latch removeObject:service];
908
-
909
- if ([latch count] == 0) {
910
- // Call success callback for connect
911
- RCTResponseSenderBlock retrieveServiceCallback = [retrieveServicesCallbacks valueForKey:peripheralUUIDString];
912
- if (retrieveServiceCallback) {
913
- retrieveServiceCallback(@[[NSNull null], [peripheral asDictionary]]);
914
- [retrieveServicesCallbacks removeObjectForKey:peripheralUUIDString];
943
+ NSMutableSet *characteristicsForService = [NSMutableSet new];
944
+ [characteristicsForService addObjectsFromArray:service.characteristics];
945
+ [retrieveServicesLatches setObject:characteristicsForService forKey:service.UUID.UUIDString];
946
+
947
+ for (CBCharacteristic *characteristic in service.characteristics) {
948
+ [peripheral discoverDescriptorsForCharacteristic:characteristic];
949
+ }
950
+ }
951
+
952
+ - (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error {
953
+ if (error) {
954
+ NSLog(@"Error: %@", error);
955
+ return;
956
+ }
957
+ NSLog(@"Descriptor For Characteristic Discover");
958
+
959
+ NSString *peripheralUUIDString = [peripheral uuidAsString];
960
+ NSString *serviceUUIDString = characteristic.service.UUID.UUIDString;
961
+ NSMutableSet *peripheralLatch = [retrieveServicesLatches valueForKey:peripheralUUIDString];
962
+ NSMutableSet *serviceLatch = [retrieveServicesLatches valueForKey:serviceUUIDString];
963
+ [serviceLatch removeObject:characteristic];
964
+
965
+ if ([serviceLatch count] == 0) {
966
+ // All characteristics for this service have been checked
967
+ [peripheralLatch removeObject:characteristic.service];
968
+
969
+ if ([peripheralLatch count] == 0) {
970
+ // Call success callback for connect
971
+ [self invokeAndClearDictionary:retrieveServicesCallbacks withKey:peripheralUUIDString usingParameters:@[[NSNull null], [peripheral asDictionary]]];
972
+ [retrieveServicesLatches removeObjectForKey:peripheralUUIDString];
915
973
  }
916
- [retrieveServicesLatches removeObjectForKey:peripheralUUIDString];
917
974
  }
918
975
  }
919
976
 
@@ -947,6 +1004,20 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
947
1004
  return nil; //Characteristic not found on this service
948
1005
  }
949
1006
 
1007
+ -(CBDescriptor *) findDescriptorFromUUID:(CBUUID *)UUID characteristic:(CBCharacteristic*)characteristic
1008
+ {
1009
+ NSLog(@"Looking for descriptor %@ on characteristic %@", UUID, characteristic.UUID);
1010
+ for (int i=0; i < characteristic.descriptors.count; i++)
1011
+ {
1012
+ CBDescriptor *d = [characteristic.descriptors objectAtIndex:i];
1013
+ if ([d.UUID.UUIDString isEqualToString: UUID.UUIDString]) {
1014
+ NSLog(@"Found descriptor %@", UUID);
1015
+ return d;
1016
+ }
1017
+ }
1018
+ return nil; // Descriptor not found on this characteristic
1019
+ }
1020
+
950
1021
  - (void)centralManagerDidUpdateState:(CBCentralManager *)central
951
1022
  {
952
1023
  NSString *stateName = [self centralManagerStateToString:central.state];
@@ -1020,6 +1091,10 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
1020
1091
  return [NSString stringWithFormat:@"%@|%@", [peripheral uuidAsString], [characteristic UUID]];
1021
1092
  }
1022
1093
 
1094
+ -(NSString *) keyForPeripheral: (CBPeripheral *)peripheral andCharacteristic:(CBCharacteristic *)characteristic andDescriptor:(CBDescriptor *)descriptor {
1095
+ return [NSString stringWithFormat:@"%@|%@|%@", [peripheral uuidAsString], [characteristic UUID], [descriptor UUID]];
1096
+ }
1097
+
1023
1098
  -(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary<NSString *,id> *)dict
1024
1099
  {
1025
1100
  NSArray<CBPeripheral *> *restoredPeripherals = dict[CBCentralManagerRestoredStatePeripheralsKey];
@@ -1048,4 +1123,27 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
1048
1123
  return _instance;
1049
1124
  }
1050
1125
 
1126
+ -(void) insertCallback:(nonnull RCTResponseSenderBlock)callback intoDictionary:(NSMutableDictionary *)dictionary withKey:(NSString *)key
1127
+ {
1128
+ NSMutableArray* peripheralCallbacks = [dictionary objectForKey:key];
1129
+ if (!peripheralCallbacks) {
1130
+ peripheralCallbacks = [NSMutableArray array];
1131
+ [dictionary setObject:peripheralCallbacks forKey:key];
1132
+ }
1133
+
1134
+ [peripheralCallbacks addObject:callback];
1135
+ }
1136
+
1137
+ -(void) invokeAndClearDictionary:(NSMutableDictionary *)dictionary withKey:(NSString *)key usingParameters:(NSArray *)parameters
1138
+ {
1139
+ NSMutableArray* peripheralCallbacks = [dictionary objectForKey:key];
1140
+ if (peripheralCallbacks) {
1141
+ for (RCTResponseSenderBlock callback in peripheralCallbacks) {
1142
+ callback(parameters);
1143
+ }
1144
+
1145
+ [dictionary removeObjectForKey:key];
1146
+ }
1147
+ }
1148
+
1051
1149
  @end
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IDEDidComputeMac32BitWarning</key>
6
+ <true/>
7
+ </dict>
8
+ </plist>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>BleManager.xcscheme_^#shared#^_</key>
8
+ <dict>
9
+ <key>orderHint</key>
10
+ <integer>0</integer>
11
+ </dict>
12
+ </dict>
13
+ </dict>
14
+ </plist>
@@ -209,7 +209,7 @@ static char ADVERTISEMENT_RSSI_IDENTIFER;
209
209
  NSMutableArray *descriptorList = [NSMutableArray new];
210
210
  for (CBDescriptor *descriptor in characteristic.descriptors) {
211
211
  NSMutableDictionary *descriptorDictionary = [NSMutableDictionary new];
212
- [descriptorDictionary setObject:[[descriptor UUID] UUIDString] forKey:@"descriptor"];
212
+ [descriptorDictionary setObject:[[descriptor UUID] UUIDString] forKey:@"uuid"];
213
213
  if ([descriptor value]) { // should always have a value?
214
214
  [descriptorDictionary setObject:[descriptor value] forKey:@"value"];
215
215
  }
package/package.json CHANGED
@@ -1,9 +1,7 @@
1
1
  {
2
2
  "name": "react-native-ble-manager",
3
- "version": "8.8.0",
3
+ "version": "9.1.0",
4
4
  "description": "A BLE module for react native.",
5
- "main": "BleManager",
6
- "types": "./index.d.ts",
7
5
  "repository": {
8
6
  "type": "git",
9
7
  "url": "https://github.com/innoveit/react-native-ble-manager.git"
@@ -24,8 +22,37 @@
24
22
  "name": "Innove",
25
23
  "url": "https://github.com/innoveit"
26
24
  },
25
+ "main": "dist/cjs/index.js",
26
+ "types": "dist/esm/index.d.ts",
27
+ "module": "dist/esm/index.js",
28
+ "react-native": "src/index.ts",
29
+ "files": [
30
+ "/dist",
31
+ "/src",
32
+ "/android",
33
+ "!/android/build",
34
+ "/ios",
35
+ "/*.podspec"
36
+ ],
27
37
  "scripts": {
28
38
  "version": "git add -A",
29
- "postversion": "git push && git push --tags"
39
+ "clean": "rimraf dist",
40
+ "type:check": "tsc -p tsconfig.json --noEmit",
41
+ "prebuild": "npm run clean",
42
+ "build:cjs": "tsc --module commonjs --outDir dist/cjs",
43
+ "build:esm": "tsc --outDir dist/esm",
44
+ "build": "npm run build:esm && npm run build:cjs",
45
+ "watch": "npm run build --watch",
46
+ "prepare": "npm run build",
47
+ "preversion": "npm run build",
48
+ "postversion": "git push --follow-tags"
49
+ },
50
+ "peerDependencies": {
51
+ "react-native": ">=0.60.0"
52
+ },
53
+ "devDependencies": {
54
+ "react-native": "0.71.0",
55
+ "rimraf": "4.1.2",
56
+ "typescript": "4.9.5"
30
57
  }
31
58
  }