From 3c8908b56867ac0e92cd9885c4c7ed081e3d25b2 Mon Sep 17 00:00:00 2001 From: Jeremy Chiang Date: Thu, 21 Mar 2019 12:58:03 -0700 Subject: [PATCH] v0.8.2 - Add initial support for did modify services (#193) * Add initial support for did modify services delegation, #144 * Bump version to 0.8.2 * Update changelog for 0.8.2 * Update readme and jazzy doc for 0.8.2 --- Bluejay.podspec | 4 +- Bluejay/.jazzy.yaml | 2 +- Bluejay/Bluejay.xcodeproj/project.pbxproj | 4 + Bluejay/Bluejay/Bluejay.swift | 31 ++ Bluejay/Bluejay/Info.plist | 2 +- Bluejay/Bluejay/Peripheral.swift | 10 + Bluejay/Bluejay/PeripheralDelegate.swift | 3 + Bluejay/Bluejay/ServiceObserver.swift | 28 ++ .../SensorViewController.swift | 15 + .../DittojayViewController.swift | 106 +++++-- CHANGELOG.md | 4 + README.md | 27 ++ docs/Classes.html | 5 +- docs/Classes/Bluejay.html | 97 +++++- docs/Classes/SynchronizedPeripheral.html | 5 +- docs/Enums.html | 5 +- docs/Enums/AutoReconnectMode.html | 5 +- docs/Enums/BackgroundRestoreCompletion.html | 5 +- docs/Enums/BackgroundRestoreMode.html | 5 +- docs/Enums/BluejayError.html | 5 +- docs/Enums/ConnectionResult.html | 5 +- docs/Enums/DisconnectionResult.html | 5 +- docs/Enums/ListenAction.html | 5 +- docs/Enums/ListenRestoreAction.html | 5 +- docs/Enums/MultipleListenOption.html | 5 +- docs/Enums/ReadResult.html | 5 +- docs/Enums/RunResult.html | 5 +- docs/Enums/ScanAction.html | 5 +- docs/Enums/StartMode.html | 5 +- docs/Enums/Timeout.html | 5 +- docs/Enums/WriteResult.html | 5 +- docs/Extensions.html | 5 +- docs/Extensions/BinaryInteger.html | 5 +- docs/Extensions/CBManagerState.html | 5 +- docs/Extensions/CBPeripheral.html | 5 +- docs/Extensions/CBPeripheralState.html | 5 +- docs/Extensions/CBService.html | 5 +- docs/Extensions/Data.html | 5 +- docs/Extensions/Peripheral.html | 32 +- docs/Extensions/String.html | 5 +- docs/Protocols.html | 37 ++- docs/Protocols/BackgroundRestorer.html | 5 +- docs/Protocols/ConnectionObserver.html | 5 +- docs/Protocols/DisconnectHandler.html | 5 +- docs/Protocols/ListenRestorer.html | 5 +- docs/Protocols/LogObserver.html | 5 +- docs/Protocols/RSSIObserver.html | 5 +- docs/Protocols/Receivable.html | 5 +- docs/Protocols/Sendable.html | 5 +- docs/Protocols/ServiceObserver.html | 284 ++++++++++++++++++ docs/Structs.html | 5 +- docs/Structs/BackgroundRestoreConfig.html | 5 +- docs/Structs/CharacteristicIdentifier.html | 5 +- docs/Structs/DataPadding.html | 5 +- docs/Structs/PeripheralIdentifier.html | 5 +- docs/Structs/ScanDiscovery.html | 5 +- docs/Structs/ServiceIdentifier.html | 5 +- docs/Structs/StartOptions.html | 5 +- docs/Structs/WarningOptions.html | 5 +- docs/Typealiases.html | 5 +- docs/css/jazzy.css | 15 +- .../Contents/Resources/Documents/Classes.html | 5 +- .../Resources/Documents/Classes/Bluejay.html | 97 +++++- .../Classes/SynchronizedPeripheral.html | 5 +- .../Contents/Resources/Documents/Enums.html | 5 +- .../Documents/Enums/AutoReconnectMode.html | 5 +- .../Enums/BackgroundRestoreCompletion.html | 5 +- .../Enums/BackgroundRestoreMode.html | 5 +- .../Documents/Enums/BluejayError.html | 5 +- .../Documents/Enums/ConnectionResult.html | 5 +- .../Documents/Enums/DisconnectionResult.html | 5 +- .../Documents/Enums/ListenAction.html | 5 +- .../Documents/Enums/ListenRestoreAction.html | 5 +- .../Documents/Enums/MultipleListenOption.html | 5 +- .../Resources/Documents/Enums/ReadResult.html | 5 +- .../Resources/Documents/Enums/RunResult.html | 5 +- .../Resources/Documents/Enums/ScanAction.html | 5 +- .../Resources/Documents/Enums/StartMode.html | 5 +- .../Resources/Documents/Enums/Timeout.html | 5 +- .../Documents/Enums/WriteResult.html | 5 +- .../Resources/Documents/Extensions.html | 5 +- .../Documents/Extensions/BinaryInteger.html | 5 +- .../Documents/Extensions/CBManagerState.html | 5 +- .../Documents/Extensions/CBPeripheral.html | 5 +- .../Extensions/CBPeripheralState.html | 5 +- .../Documents/Extensions/CBService.html | 5 +- .../Resources/Documents/Extensions/Data.html | 5 +- .../Documents/Extensions/Peripheral.html | 32 +- .../Documents/Extensions/String.html | 5 +- .../Resources/Documents/Protocols.html | 37 ++- .../Protocols/BackgroundRestorer.html | 5 +- .../Protocols/ConnectionObserver.html | 5 +- .../Protocols/DisconnectHandler.html | 5 +- .../Documents/Protocols/ListenRestorer.html | 5 +- .../Documents/Protocols/LogObserver.html | 5 +- .../Documents/Protocols/RSSIObserver.html | 5 +- .../Documents/Protocols/Receivable.html | 5 +- .../Documents/Protocols/Sendable.html | 5 +- .../Documents/Protocols/ServiceObserver.html | 284 ++++++++++++++++++ .../Contents/Resources/Documents/Structs.html | 5 +- .../Structs/BackgroundRestoreConfig.html | 5 +- .../Structs/CharacteristicIdentifier.html | 5 +- .../Documents/Structs/DataPadding.html | 5 +- .../Structs/PeripheralIdentifier.html | 5 +- .../Documents/Structs/ScanDiscovery.html | 5 +- .../Documents/Structs/ServiceIdentifier.html | 5 +- .../Documents/Structs/StartOptions.html | 5 +- .../Documents/Structs/WarningOptions.html | 5 +- .../Resources/Documents/Typealiases.html | 5 +- .../Resources/Documents/css/jazzy.css | 15 +- .../Contents/Resources/Documents/index.html | 29 +- .../Contents/Resources/Documents/search.json | 2 +- .../Contents/Resources/docSet.dsidx | Bin 73728 -> 69632 bytes docs/docsets/Bluejay.tgz | Bin 130591 -> 132315 bytes docs/index.html | 29 +- docs/search.json | 2 +- 116 files changed, 1532 insertions(+), 136 deletions(-) create mode 100644 Bluejay/Bluejay/ServiceObserver.swift create mode 100644 docs/Protocols/ServiceObserver.html create mode 100644 docs/docsets/Bluejay.docset/Contents/Resources/Documents/Protocols/ServiceObserver.html diff --git a/Bluejay.podspec b/Bluejay.podspec index 19331ac..805dc2a 100644 --- a/Bluejay.podspec +++ b/Bluejay.podspec @@ -1,12 +1,12 @@ Pod::Spec.new do |spec| spec.name = 'Bluejay' - spec.version = '0.8.1' + spec.version = '0.8.2' spec.license = { type: 'MIT', file: 'LICENSE' } spec.homepage = 'https://github.com/steamclock/bluejay' spec.authors = { 'Jeremy Chiang' => 'jeremy@steamclock.com' } spec.summary = 'Bluejay is a simple Swift framework for building reliable Bluetooth apps.' spec.homepage = 'https://github.com/steamclock/bluejay' - spec.source = { git: 'https://github.com/steamclock/bluejay.git', tag: 'v0.8.1' } + spec.source = { git: 'https://github.com/steamclock/bluejay.git', tag: 'v0.8.2' } spec.source_files = 'Bluejay/Bluejay/*.{h,swift}' spec.framework = 'SystemConfiguration' spec.platform = :ios, '10.0' diff --git a/Bluejay/.jazzy.yaml b/Bluejay/.jazzy.yaml index e2c0f62..bbf0b4a 100644 --- a/Bluejay/.jazzy.yaml +++ b/Bluejay/.jazzy.yaml @@ -2,7 +2,7 @@ output: ../docs author: Steamclock Software author_url: http://steamclock.com module: Bluejay -module_version: 0.8.1 +module_version: 0.8.2 readme: ../README.md sdk: iphone copyright: Copyright © 2017 Steamclock Software. All rights reserved. diff --git a/Bluejay/Bluejay.xcodeproj/project.pbxproj b/Bluejay/Bluejay.xcodeproj/project.pbxproj index 338afe6..691bdb1 100644 --- a/Bluejay/Bluejay.xcodeproj/project.pbxproj +++ b/Bluejay/Bluejay.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ B8383B7221C3239B00F07306 /* PeripheralDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8383B7121C3239B00F07306 /* PeripheralDelegate.swift */; }; B83A67CE219F45C300076B9F /* BackgroundRestorer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B83A67CD219F45C300076B9F /* BackgroundRestorer.swift */; }; B842AAF81E4CF74300BB32EE /* String+Transferable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B842AAF71E4CF74300BB32EE /* String+Transferable.swift */; }; + B843657E221F73FC00990C83 /* ServiceObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B843657D221F73FC00990C83 /* ServiceObserver.swift */; }; B86586A9216D1105002E8E2D /* StartOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B86586A8216D1105002E8E2D /* StartOptions.swift */; }; B869A2971E721D50003C1278 /* Data+Sendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B869A2961E721D50003C1278 /* Data+Sendable.swift */; }; B87CBB4D21C05F8400B67B5B /* BackgroundRestoreConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = B87CBB4C21C05F8400B67B5B /* BackgroundRestoreConfig.swift */; }; @@ -152,6 +153,7 @@ B8383B7121C3239B00F07306 /* PeripheralDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeripheralDelegate.swift; sourceTree = ""; }; B83A67CD219F45C300076B9F /* BackgroundRestorer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundRestorer.swift; sourceTree = ""; }; B842AAF71E4CF74300BB32EE /* String+Transferable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Transferable.swift"; sourceTree = ""; }; + B843657D221F73FC00990C83 /* ServiceObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceObserver.swift; sourceTree = ""; }; B86586A8216D1105002E8E2D /* StartOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartOptions.swift; sourceTree = ""; }; B869A2961E721D50003C1278 /* Data+Sendable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+Sendable.swift"; sourceTree = ""; }; B87CBB4C21C05F8400B67B5B /* BackgroundRestoreConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundRestoreConfig.swift; sourceTree = ""; }; @@ -460,6 +462,7 @@ children = ( B8C70FB81E1C725C0006CF58 /* ConnectionObserver.swift */, B8FE9DF41E73597A00D361CE /* RSSIObserver.swift */, + B843657D221F73FC00990C83 /* ServiceObserver.swift */, B8DC6C6D21DD7917004A8EA6 /* LogObserver.swift */, B80D299A2170062D001C3C9B /* DisconnectHandler.swift */, ); @@ -819,6 +822,7 @@ B8383B7021C31B2D00F07306 /* ListenRestorer.swift in Sources */, B8022D9C1E1F052F00EA360B /* ListenAction.swift in Sources */, B8C70F9B1E1C5A910006CF58 /* CharacteristicIdentifier.swift in Sources */, + B843657E221F73FC00990C83 /* ServiceObserver.swift in Sources */, B869A2971E721D50003C1278 /* Data+Sendable.swift in Sources */, B8D2078C1E26D446007E670A /* CBPeripheralState+ReturnString.swift in Sources */, B88F79951EB7DB420094D8D1 /* Operation.swift in Sources */, diff --git a/Bluejay/Bluejay/Bluejay.swift b/Bluejay/Bluejay/Bluejay.swift index 29b8099..7607077 100644 --- a/Bluejay/Bluejay/Bluejay.swift +++ b/Bluejay/Bluejay/Bluejay.swift @@ -31,6 +31,9 @@ public class Bluejay: NSObject { //swiftlint:disable:this type_body_length /// List of weak references to objects interested in receiving notifications on RSSI reads. private var rssiObservers: [WeakRSSIObserver] = [] + /// List of weak references to objects interested in receiving notifications on services changes. + private var serviceObservers: [WeakServiceObserver] = [] + /// List of weak references to objects interested in receiving notifications on log file changes. private var logObservers: [WeakLogObserver] = [] @@ -496,6 +499,25 @@ public class Bluejay: NSObject { //swiftlint:disable:this type_body_length rssiObservers = rssiObservers.filter { $0.weakReference != nil && $0.weakReference !== rssiObserver } } + /** + Register for notifications when a connected peripheral's services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory. + + - Parameter serviceObserver: object interested in receiving the connected peripheral's did modify services event. + */ + public func register(serviceObserver: ServiceObserver) { + serviceObservers = serviceObservers.filter { $0.weakReference != nil && $0.weakReference !== serviceObserver } + serviceObservers.append(WeakServiceObserver(weakReference: serviceObserver)) + } + + /** + Unregister for notifications when a connected peripheral's services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory. + + - Parameter serviceObserver: object no longer interested in receiving the connected peripheral's did modify services event. + */ + public func unregister(serviceObserver: ServiceObserver) { + serviceObservers = serviceObservers.filter { $0.weakReference != nil && $0.weakReference !== serviceObserver } + } + /** Register for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory. @@ -1535,6 +1557,15 @@ extension Bluejay: PeripheralDelegate { observer.weakReference?.didReadRSSI(from: peripheral.identifier, RSSI: RSSI, error: error) } } + + func didModifyServices(from peripheral: Peripheral, invalidatedServices: [ServiceIdentifier]) { + for observer in serviceObservers { + observer.weakReference?.didModifyServices( + from: peripheral.identifier, + invalidatedServices: invalidatedServices + ) + } + } } let logger = XCGLogger(identifier: "Bluejay", includeDefaultDestinations: true) diff --git a/Bluejay/Bluejay/Info.plist b/Bluejay/Bluejay/Info.plist index ebf74fa..a204eec 100644 --- a/Bluejay/Bluejay/Info.plist +++ b/Bluejay/Bluejay/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.8.0 + 0.8.2 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/Bluejay/Bluejay/Peripheral.swift b/Bluejay/Bluejay/Peripheral.swift index 6cc9e6c..a617bae 100644 --- a/Bluejay/Bluejay/Peripheral.swift +++ b/Bluejay/Bluejay/Peripheral.swift @@ -333,4 +333,14 @@ extension Peripheral: CBPeripheralDelegate { delegate.didReadRSSI(from: self, RSSI: RSSI, error: error) } + /// Called when the peripheral removed or added services. + public func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService]) { + delegate.didModifyServices( + from: self, + invalidatedServices: invalidatedServices.map { + ServiceIdentifier(uuid: $0.uuid) + } + ) + } + } diff --git a/Bluejay/Bluejay/PeripheralDelegate.swift b/Bluejay/Bluejay/PeripheralDelegate.swift index 04fc569..86d988e 100644 --- a/Bluejay/Bluejay/PeripheralDelegate.swift +++ b/Bluejay/Bluejay/PeripheralDelegate.swift @@ -30,4 +30,7 @@ protocol PeripheralDelegate: class { /// The peripheral has received a RSSI value and notifies Bluejay. func didReadRSSI(from peripheral: Peripheral, RSSI: NSNumber, error: Error?) + + /// The peripheral's list of available services has changed. + func didModifyServices(from peripheral: Peripheral, invalidatedServices: [ServiceIdentifier]) } diff --git a/Bluejay/Bluejay/ServiceObserver.swift b/Bluejay/Bluejay/ServiceObserver.swift new file mode 100644 index 0000000..1541e76 --- /dev/null +++ b/Bluejay/Bluejay/ServiceObserver.swift @@ -0,0 +1,28 @@ +// +// ServiceObserver.swift +// Bluejay +// +// Created by Jeremy Chiang on 2019-02-21. +// Copyright © 2019 Steamclock Software. All rights reserved. +// + +import Foundation + +/** + A protocol allowing conforming objects to monitor the services changes of a connected peripheral. + */ +public protocol ServiceObserver: class { + /** + * Called whenever a peripheral's services change. + * + * - Parameters: + * - from: the peripheral that changed services. + * - invalidatedServices: the services invalidated. + */ + func didModifyServices(from peripheral: PeripheralIdentifier, invalidatedServices: [ServiceIdentifier]) +} + +/// Allows creating weak references to ServiceObserver objects, so that Bluejay does not keep strong references to observers and prevent them from being released in memory. +struct WeakServiceObserver { + weak var weakReference: ServiceObserver? +} diff --git a/Bluejay/BluejayHeartSensorDemo/SensorViewController.swift b/Bluejay/BluejayHeartSensorDemo/SensorViewController.swift index ffdf2f6..e0c16c8 100644 --- a/Bluejay/BluejayHeartSensorDemo/SensorViewController.swift +++ b/Bluejay/BluejayHeartSensorDemo/SensorViewController.swift @@ -27,6 +27,7 @@ class SensorViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() bluejay.register(connectionObserver: self) + bluejay.register(serviceObserver: self) } override func willMove(toParent parent: UIViewController?) { @@ -228,3 +229,17 @@ extension SensorViewController: ConnectionObserver { UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) } } + +extension SensorViewController: ServiceObserver { + func didModifyServices(from peripheral: PeripheralIdentifier, invalidatedServices: [ServiceIdentifier]) { + bluejay.log("SensorViewController - Invalidated services: \(invalidatedServices.debugDescription)") + + if invalidatedServices.contains(where: { invalidatedServiceIdentifier -> Bool in + invalidatedServiceIdentifier == chirpCharacteristic.service + }) { + endListen(to: chirpCharacteristic) + } else if invalidatedServices.isEmpty { + listen(to: chirpCharacteristic) + } + } +} diff --git a/Bluejay/DittojayHeartSensorDemo/DittojayViewController.swift b/Bluejay/DittojayHeartSensorDemo/DittojayViewController.swift index d08f118..9838715 100644 --- a/Bluejay/DittojayHeartSensorDemo/DittojayViewController.swift +++ b/Bluejay/DittojayHeartSensorDemo/DittojayViewController.swift @@ -22,6 +22,7 @@ class DittojayViewController: UITableViewController { var addedServices: [CBService] = [] var heartRate: UInt8 = 0 + var timer: Timer? override func viewDidLoad() { super.viewDidLoad() @@ -48,6 +49,12 @@ class DittojayViewController: UITableViewController { let wakeAppServiceUUID = CBUUID(string: "CED261B7-F120-41C8-9A92-A41DE69CF2A8") let wakeAppCharacteristicUUID = CBUUID(string: "83B4A431-A6F1-4540-B3EE-3C14AEF71A04") + if addedServices.contains(where: { addedService -> Bool in + addedService.uuid == wakeAppServiceUUID + }) { + return + } + wakeAppCharacteristic = CBMutableCharacteristic( type: wakeAppCharacteristicUUID, properties: .notify, @@ -57,15 +64,35 @@ class DittojayViewController: UITableViewController { wakeAppService = CBMutableService(type: wakeAppServiceUUID, primary: true) wakeAppService.characteristics = [wakeAppCharacteristic] + debugPrint("Will add wake app service...") + manager.add(wakeAppService) } + private func removeWakeAppService() { + addedServices.removeAll { addedService -> Bool in + addedService.uuid == wakeAppService.uuid + } + + debugPrint("Will remove wake app service...") + + manager.remove(wakeAppService) + + if manager.isAdvertising { + debugPrint("Will stop advertising...") + manager.stopAdvertising() + } + + debugPrint("Will start advertising...") + advertiseServices([heartRateService.uuid]) + } + private func advertiseServices(_ services: [CBUUID]) { manager.startAdvertising([CBAdvertisementDataServiceUUIDsKey: services]) } private func startHeartRateSensor() { - _ = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in + timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in guard let weakSelf = self else { return } @@ -93,7 +120,7 @@ class DittojayViewController: UITableViewController { } override func numberOfSections(in tableView: UITableView) -> Int { - return 1 + return 2 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { @@ -103,24 +130,35 @@ class DittojayViewController: UITableViewController { override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "actionCell", for: indexPath) - if indexPath.row == 0 { - cell.textLabel?.text = "Generated Heart Rate" - cell.detailTextLabel?.text = "\(heartRate)" - - DispatchQueue.main.async { - UIView.animate(withDuration: 0.25, animations: { - cell.detailTextLabel?.transform = cell.detailTextLabel!.transform.scaledBy(x: 1.5, y: 1.5) - }, completion: { completed in - if completed { - UIView.animate(withDuration: 0.25) { - cell.detailTextLabel?.transform = CGAffineTransform.identity + if indexPath.section == 0 { + if indexPath.row == 0 { + cell.textLabel?.text = "Generated Heart Rate" + cell.detailTextLabel?.text = "\(heartRate)" + cell.selectionStyle = .none + + DispatchQueue.main.async { + UIView.animate(withDuration: 0.25, animations: { + cell.detailTextLabel?.transform = cell.detailTextLabel!.transform.scaledBy(x: 1.5, y: 1.5) + }, completion: { completed in + if completed { + UIView.animate(withDuration: 0.25) { + cell.detailTextLabel?.transform = CGAffineTransform.identity + } } - } - }) + }) + } + } else { + cell.textLabel?.text = "Chirp" + cell.detailTextLabel?.text = "" } } else { - cell.textLabel?.text = "Chirp" - cell.detailTextLabel?.text = "" + if indexPath.row == 0 { + cell.textLabel?.text = "Add Chirp Service" + cell.detailTextLabel?.text = "" + } else { + cell.textLabel?.text = "Remove Chirp Service" + cell.detailTextLabel?.text = "" + } } return cell @@ -128,7 +166,18 @@ class DittojayViewController: UITableViewController { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) - chirp() + + if indexPath.section == 0 { + if indexPath.row == 1 { + chirp() + } + } else { + if indexPath.row == 0 { + addWakeAppService() + } else { + removeWakeAppService() + } + } } } @@ -146,13 +195,26 @@ extension DittojayViewController: CBPeripheralManagerDelegate { if let error = error { debugPrint("Failed to add service \(service.uuid.uuidString) with error: \(error.localizedDescription)") } else { - debugPrint("Added service \(service.uuid.uuidString)") - - addedServices.append(service) + if !addedServices.contains { addedService -> Bool in + addedService.uuid == service.uuid + } { + debugPrint("Added service \(service.uuid.uuidString)") + addedServices.append(service) + } if addedServices.contains(heartRateService) && addedServices.contains(wakeAppService) { + if manager.isAdvertising { + debugPrint("Will stop advertising...") + manager.stopAdvertising() + } + + debugPrint("Will start advertising...") advertiseServices([heartRateService.uuid, wakeAppService.uuid]) - startHeartRateSensor() + + if timer == nil { + debugPrint("Will start heart rate sensor...") + startHeartRateSensor() + } } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index f3291c9..f67fe33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Changed +## [0.8.2] - 2019-02-25 +### Added +- Added initial support for did modify services delegation + ## [0.8.1] - 2019-01-14 ### Fixed - Fixed and improved Carthage instruction diff --git a/README.md b/README.md index 2326aa1..a1c5908 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Bluejay's primary goals are: - [Write and Assemble](#write-and-assemble) - [Flush Listen](#flush-listen) - [CoreBluetooth Migration](#corebluetooth-migration) + - [Monitor Peripheral Services](#monitor-peripheral-services) ## Features @@ -867,6 +868,32 @@ public func stopAndExtractBluetoothState() -> Finally, you can check whether Bluejay has been started or stopped using the `hasStarted` property. +### Monitor Peripheral Services + +Some peripherals can add or remove services while it's being used, and Bluejay provides a basic way to react to this. See **BluejayHeartSensorDemo** and **DittojayHeartSensorDemo** in the project for more examples. + +```swift +bluejay.register(serviceObserver: self) +``` + +```swift +func didModifyServices( + from peripheral: PeripheralIdentifier, + invalidatedServices: [ServiceIdentifier]) { + if invalidatedServices.contains(where: { invalidatedServiceIdentifier -> Bool in + invalidatedServiceIdentifier == chirpCharacteristic.service + }) { + endListen(to: chirpCharacteristic) + } else if invalidatedServices.isEmpty { + listen(to: chirpCharacteristic) + } +} +``` + +**Notes from Apple:** + +> If you previously discovered any of the services that have changed, they are provided in the invalidatedServices parameter and can no longer be used. You can use the discoverServices: method to discover any new services that have been added to the peripheral’s database or to find out whether any of the invalidated services that you were using (and want to continue using) have been added back to a different location in the peripheral’s database. + ## API Documentation We have more [in-depth API documentation for Bluejay](https://steamclock.github.io/bluejay/index.html) using inline documentation and Jazzy. diff --git a/docs/Classes.html b/docs/Classes.html index 9a9ce7f..3a3e8a1 100644 --- a/docs/Classes.html +++ b/docs/Classes.html @@ -145,6 +145,9 @@ + + +
  • + +
    +
    +
    +
    +
    +

    Register for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func register(serviceObserver: ServiceObserver)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + serviceObserver + + +
    +

    object interested in receiving the connected peripheral’s did modify services event.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Unregister for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func unregister(serviceObserver: ServiceObserver)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + serviceObserver + + +
    +

    object no longer interested in receiving the connected peripheral’s did modify services event.

    +
    +
    +
    +
    +
    +
  • @@ -2314,7 +2409,7 @@

    Declaration

    diff --git a/docs/Classes/SynchronizedPeripheral.html b/docs/Classes/SynchronizedPeripheral.html index bf1bd9d..1a6ec9b 100644 --- a/docs/Classes/SynchronizedPeripheral.html +++ b/docs/Classes/SynchronizedPeripheral.html @@ -145,6 +145,9 @@
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + +
    +
    +
    +
    +
    +

    Called when the peripheral removed or added services.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService])
    + +
    +
    +
    +
    +
  • diff --git a/docs/Extensions/String.html b/docs/Extensions/String.html index c5ec75a..8d56e69 100644 --- a/docs/Extensions/String.html +++ b/docs/Extensions/String.html @@ -145,6 +145,9 @@ + + +
    +
      +
    • +
      + + + + ServiceObserver + +
      +
      +
      +
      +
      +
      +

      A protocol allowing conforming objects to monitor the services changes of a connected peripheral.

      + + See more +
      +
      +

      Declaration

      +
      +

      Swift

      +
      public protocol ServiceObserver : AnyObject
      + +
      +
      +
      +
      +
    • +
    +
    diff --git a/docs/Protocols/BackgroundRestorer.html b/docs/Protocols/BackgroundRestorer.html index f5d1184..fde25a9 100644 --- a/docs/Protocols/BackgroundRestorer.html +++ b/docs/Protocols/BackgroundRestorer.html @@ -145,6 +145,9 @@ + + + + + + + + + + + + + + + + + + + + +
  • + +
    +
    +
    +
    +
    +

    Register for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func register(serviceObserver: ServiceObserver)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + serviceObserver + + +
    +

    object interested in receiving the connected peripheral’s did modify services event.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Unregister for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func unregister(serviceObserver: ServiceObserver)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + serviceObserver + + +
    +

    object no longer interested in receiving the connected peripheral’s did modify services event.

    +
    +
    +
    +
    +
    +
  • @@ -2314,7 +2409,7 @@

    Declaration

    diff --git a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Classes/SynchronizedPeripheral.html b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Classes/SynchronizedPeripheral.html index bf1bd9d..1a6ec9b 100644 --- a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Classes/SynchronizedPeripheral.html +++ b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Classes/SynchronizedPeripheral.html @@ -145,6 +145,9 @@
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + +
    +
    +
    +
    +
    +

    Called when the peripheral removed or added services.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService])
    + +
    +
    +
    +
    +
  • diff --git a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Extensions/String.html b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Extensions/String.html index c5ec75a..8d56e69 100644 --- a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Extensions/String.html +++ b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Extensions/String.html @@ -145,6 +145,9 @@ + + +
    +
      +
    • +
      + + + + ServiceObserver + +
      +
      +
      +
      +
      +
      +

      A protocol allowing conforming objects to monitor the services changes of a connected peripheral.

      + + See more +
      +
      +

      Declaration

      +
      +

      Swift

      +
      public protocol ServiceObserver : AnyObject
      + +
      +
      +
      +
      +
    • +
    +
    diff --git a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Protocols/BackgroundRestorer.html b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Protocols/BackgroundRestorer.html index f5d1184..fde25a9 100644 --- a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Protocols/BackgroundRestorer.html +++ b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/Protocols/BackgroundRestorer.html @@ -145,6 +145,9 @@ + + + + + + + + + + + + + + + + + + +
  • Write and Assemble
  • Flush Listen
  • CoreBluetooth Migration
  • +
  • Monitor Peripheral Services
  • Features

    @@ -992,6 +996,29 @@

    CoreBluetooth Migration

    Finally, you can check whether Bluejay has been started or stopped using the hasStarted property.

    +

    Monitor Peripheral Services

    + +

    Some peripherals can add or remove services while it’s being used, and Bluejay provides a basic way to react to this. See BluejayHeartSensorDemo and DittojayHeartSensorDemo in the project for more examples.

    +
    bluejay.register(serviceObserver: self)
    +
    +
    func didModifyServices(
    +  from peripheral: PeripheralIdentifier,
    +  invalidatedServices: [ServiceIdentifier]) {
    +    if invalidatedServices.contains(where: { invalidatedServiceIdentifier -> Bool in
    +        invalidatedServiceIdentifier == chirpCharacteristic.service
    +    }) {
    +        endListen(to: chirpCharacteristic)
    +    } else if invalidatedServices.isEmpty {
    +        listen(to: chirpCharacteristic)
    +    }
    +}
    +
    + +

    Notes from Apple:

    + +
    +

    If you previously discovered any of the services that have changed, they are provided in the invalidatedServices parameter and can no longer be used. You can use the discoverServices: method to discover any new services that have been added to the peripheral’s database or to find out whether any of the invalidated services that you were using (and want to continue using) have been added back to a different location in the peripheral’s database.

    +

    API Documentation

    We have more in-depth API documentation for Bluejay using inline documentation and Jazzy.

    @@ -1000,7 +1027,7 @@

    API Documentation

    diff --git a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/search.json b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/search.json index 0eb592c..1f896b9 100644 --- a/docs/docsets/Bluejay.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/Bluejay.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Typealiases.html#/s:7Bluejay17RestoreIdentifiera":{"name":"RestoreIdentifier","abstract":"

    An alias to make it clearer that the string should be some kind of identifier for restoration, and not just any arbitrary string.

    "},"Typealiases.html#/s:7Bluejay13LaunchOptionsa":{"name":"LaunchOptions","abstract":"

    An alias to make it clearer that the dictionary should be the launch options from UIApplicationDelegate.

    "},"Typealiases.html#/s:7Bluejay14ListenCallbacka":{"name":"ListenCallback","abstract":"

    Gives name to a specific callback type used for listens.

    "},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Sensible default warning options: all off in favour of not aggressively notifying the user of changes when the app is backgrounded.

    ","parent_name":"WarningOptions"},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV18notifyOnConnection0dE13Disconnection0dE12NotificationACSb_S2btcfc":{"name":"init(notifyOnConnection:notifyOnDisconnection:notifyOnNotification:)","abstract":"

    Creates a connection options that can specify whether iOS can display a system alert when certain conditions are met while your app is suspended, usually an alert dialog outside of your app in the Home screen for example.

    ","parent_name":"WarningOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV20enableBluetoothAlert17backgroundRestoreACSb_AA010BackgroundH4ModeOtcfc":{"name":"init(enableBluetoothAlert:backgroundRestore:)","abstract":"

    Configurations for starting Bluejay.

    ","parent_name":"StartOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Convenience factory method to avoid having to use the public initializer.

    ","parent_name":"StartOptions"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this service.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSS_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a string. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSo6CBUUIDC_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two ServiceIdentifier.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV20peripheralIdentifierAA010PeripheralE0Vvp":{"name":"peripheralIdentifier","abstract":"

    The unique, persistent identifier associated with the peer.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV19advertisementPacketSDySSypGvp":{"name":"advertisementPacket","abstract":"

    The advertisement packet the discovered peripheral is sending.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV4rssiSivp":{"name":"rssi","abstract":"

    The signal strength of the peripheral discovered.

    ","parent_name":"ScanDiscovery"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    The UUID of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4nameSSvp":{"name":"name","abstract":"

    The name of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns both the name and uuid of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid4nameAC10Foundation4UUIDV_SSSgtcfc":{"name":"init(uuid:name:)","abstract":"

    Create a PeripheralIdentifier using a UUID.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SH9hashValueSivp":{"name":"hashValue","parent_name":"PeripheralIdentifier"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingVyACSicfc":{"name":"init(_:)","abstract":"

    Create empty data.

    ","parent_name":"DataPadding"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingV011toBluetoothB010Foundation0B0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to the Sendable protocol, which allows Bluejay to serialize DataPadding when performing write-related operations.

    ","parent_name":"DataPadding"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV7serviceAA07ServiceC0Vvp":{"name":"service","abstract":"

    The service this characteristic belongs to.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierVyACSo16CBCharacteristicCcfc":{"name":"init(_:)","abstract":"

    Create a CharacteristicIdentifier using a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns the essential description of a characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSS_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a string and a ServiceIdentifier. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSo6CBUUIDC_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a CBUUID and a ServiceIdentifier.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_So16CBCharacteristicCtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between a CharacteristicIdentifier and a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two CharacteristicIdentifiers.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifierSSvp":{"name":"restoreIdentifier","abstract":"

    A restore identifier helps uniquely identify which device is triggering background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV18backgroundRestorerAA0bF0_pvp":{"name":"backgroundRestorer","abstract":"

    A background restorer is required to handle the results of a background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV14listenRestorerAA06ListenF0_pvp":{"name":"listenRestorer","abstract":"

    A listen restorer is required for any potential unhandled listens when restoring to a connected peripheral.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV13launchOptionsSDySo019UIApplicationLaunchF3KeyaypGSgvp":{"name":"launchOptions","abstract":"

    The launch options from application(_:didFinishLaunchingWithOptions:) is required to parse the restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV11centralKeysSaySSGSgvp":{"name":"centralKeys","abstract":"

    Convenience return of bluetooth central keys from the launch options.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV015isRestoringFromB0Sbvp":{"name":"isRestoringFromBackground","abstract":"

    If CoreBluetooth is restoring from background, the bluetooth central keys from launch options will contain the designated restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifier18backgroundRestorer06listenH013launchOptionsACSS_AA0bH0_pAA06ListenH0_pSDySo019UIApplicationLaunchK3KeyaypGSgtcfc":{"name":"init(restoreIdentifier:backgroundRestorer:listenRestorer:launchOptions:)","abstract":"

    Initializes a container for all required configurations necessary to support background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html":{"name":"BackgroundRestoreConfig","abstract":"

    Contains all required configurations for background restoration.

    "},"Structs/CharacteristicIdentifier.html":{"name":"CharacteristicIdentifier","abstract":"

    A wrapper for CBUUID specific to a characteristic to help distinguish it from a CBUUID of a service.

    "},"Structs/DataPadding.html":{"name":"DataPadding","abstract":"

    Helper object that can create empty data to be used as padding in packet construction.

    "},"Structs/PeripheralIdentifier.html":{"name":"PeripheralIdentifier","abstract":"

    Uniquely identifies a peripheral to the current iOS device. The UUID changes and is different on different iOS devices.

    "},"Structs/ScanDiscovery.html":{"name":"ScanDiscovery","abstract":"

    A model capturing what is found from a scan callback.

    "},"Structs/ServiceIdentifier.html":{"name":"ServiceIdentifier","abstract":"

    A wrapper for CBUUID specific to a service to help distinguish it from a CBUUID of a characteristic.

    "},"Structs/StartOptions.html":{"name":"StartOptions","abstract":"

    Wrapper for CBCentralManager initialization configurations when starting a new Bluejay instance.

    "},"Structs/WarningOptions.html":{"name":"WarningOptions","abstract":"

    A connection’s configurations for system alerts.

    "},"Protocols/Sendable.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","abstract":"

    A place to implement your serialization logic.

    ","parent_name":"Sendable"},"Protocols/Receivable.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","abstract":"

    A place to implement your deserialization logic.

    ","parent_name":"Receivable"},"Protocols/RSSIObserver.html#/s:7Bluejay12RSSIObserverP11didReadRSSI4from0E05erroryAA20PeripheralIdentifierV_So8NSNumberCs5Error_pSgtF":{"name":"didReadRSSI(from:RSSI:error:)","abstract":"

    Called whenever a peripheral’s RSSI value changes.

    ","parent_name":"RSSIObserver"},"Protocols/LogObserver.html#/s:7Bluejay11LogObserverP14logFileUpdated4logsySS_tF":{"name":"logFileUpdated(logs:)","abstract":"

    Called whenever the log file is updated.

    ","parent_name":"LogObserver"},"Protocols/ListenRestorer.html#/s:7Bluejay14ListenRestorerP019didReceiveUnhandledB04from2on4withAA0B13RestoreActionOAA20PeripheralIdentifierV_AA014CharacteristicM0V10Foundation4DataVSgtF":{"name":"didReceiveUnhandledListen(from:on:with:)","abstract":"

    Called whenever there is an unhandled listen.

    ","parent_name":"ListenRestorer"},"Protocols/DisconnectHandler.html#/s:7Bluejay17DisconnectHandlerP03didB04from4with13willReconnectAA04AutoH4ModeOAA20PeripheralIdentifierV_s5Error_pSgSbtF":{"name":"didDisconnect(from:with:willReconnect:)","abstract":"

    Notifies the delegate that the peripheral is fully disconnected.

    ","parent_name":"DisconnectHandler"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","abstract":"

    Called whenever Bluetooth availability changes, as well as when an object first subscribes to become a ConnectionObserver.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP9connected2toyAA20PeripheralIdentifierV_tF":{"name":"connected(to:)","abstract":"

    Called whenever a peripheral is connected, as well as when an object first subscribes to become a ConnectionObserver and the peripheral is already connected.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","abstract":"

    Called whenever a peripheral is disconnected.

    ","parent_name":"ConnectionObserver"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP20didRestoreConnection2toAA0bE10CompletionOAA20PeripheralIdentifierV_tF":{"name":"didRestoreConnection(to:)","abstract":"

    Bluejay was able to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP26didFailToRestoreConnection2to5errorAA0bG10CompletionOAA20PeripheralIdentifierV_s5Error_ptF":{"name":"didFailToRestoreConnection(to:error:)","abstract":"

    Bluejay failed to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html":{"name":"BackgroundRestorer","abstract":"

    Protocols for handling the results of a background restoration.

    "},"Protocols/ConnectionObserver.html":{"name":"ConnectionObserver","abstract":"

    A protocol allowing conforming objects registered to Bluejay to optionally respond to Bluetooth connection events.

    "},"Protocols/DisconnectHandler.html":{"name":"DisconnectHandler","abstract":"

    A protocol allowing a single delegate registered to Bluejay to have a final say at the end of a disconnection, as well as evaluate and control the auto-reconnect behaviour.

    "},"Protocols/ListenRestorer.html":{"name":"ListenRestorer","abstract":"

    Protocol for handling a listen event that does not have a callback due to background restoration.

    "},"Protocols/LogObserver.html":{"name":"LogObserver","abstract":"

    A protocol allowing conforming objects to monitor log file changes.

    "},"Protocols/RSSIObserver.html":{"name":"RSSIObserver","abstract":"

    A protocol allowing conforming objects to monitor the RSSI changes of a connected peripheral.

    "},"Protocols/Receivable.html":{"name":"Receivable","abstract":"

    Protocol to indicate that a type can be received from the Bluetooth connection.

    "},"Protocols/Sendable.html":{"name":"Sendable","abstract":"

    Protocol to indicate that a type can be sent via the Bluetooth connection.

    "},"Extensions/String.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","parent_name":"String"},"Extensions/String.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","parent_name":"String"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverServices:":{"name":"peripheral(_:didDiscoverServices:)","abstract":"

    Captures CoreBluetooth’s did discover services event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverCharacteristicsForService:error:":{"name":"peripheral(_:didDiscoverCharacteristicsFor:error:)","abstract":"

    Captures CoreBluetooth’s did discover characteristics event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didWriteValueForCharacteristic:error:":{"name":"peripheral(_:didWriteValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did write to charactersitic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateValueForCharacteristic:error:":{"name":"peripheral(_:didUpdateValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did receive a notification/value from a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateNotificationStateForCharacteristic:error:":{"name":"peripheral(_:didUpdateNotificationStateFor:error:)","abstract":"

    Captures CoreBluetooth’s did turn on or off notification/listening on a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didReadRSSI:error:":{"name":"peripheral(_:didReadRSSI:error:)","abstract":"

    Captures CoreBluetooth’s did read RSSI event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE15toBluetoothData10Foundation0D0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to Sendable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE13bluetoothDatax10Foundation0C0V_tcfc":{"name":"init(bluetoothData:)","abstract":"

    This function is required to conform to Receivable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE7extract5start6lengthxSi_SitKlF":{"name":"extract(start:length:)","abstract":"

    Convenience function to read a range of Data and deserialize it into the specified type.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE011toBluetoothB0ACyF":{"name":"toBluetoothData()","abstract":"

    Allows using Data as is when using Bluejay and working with write-related operations.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE09bluetoothB0A2C_tcfc":{"name":"init(bluetoothData:)","abstract":"

    Allows using Data as is when using Bluejay and working with read-related operations.

    ","parent_name":"Data"},"Extensions/CBService.html#/s:So9CBServiceC7BluejayE14characteristic4withSo16CBCharacteristicCSgSo6CBUUIDC_tF":{"name":"characteristic(with:)","abstract":"

    Find a characteristic on a service by CBUUID.

    ","parent_name":"CBService"},"Extensions/CBPeripheralState.html#/s:So17CBPeripheralStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBPeripheralState as a string.

    ","parent_name":"CBPeripheralState"},"Extensions/CBPeripheral.html#/s:So12CBPeripheralC7BluejayE7service4withSo9CBServiceCSgSo6CBUUIDC_tF":{"name":"service(with:)","abstract":"

    Find a service on a peripheral by CBUUID.

    ","parent_name":"CBPeripheral"},"Extensions/CBManagerState.html#/s:So14CBManagerStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBManagerState as a string.

    ","parent_name":"CBManagerState"},"Extensions/CBManagerState.html":{"name":"CBManagerState"},"Extensions/CBPeripheral.html":{"name":"CBPeripheral"},"Extensions/CBPeripheralState.html":{"name":"CBPeripheralState"},"Extensions/CBService.html":{"name":"CBService"},"Extensions/Data.html":{"name":"Data"},"Extensions/BinaryInteger.html":{"name":"BinaryInteger","abstract":"

    Extension to Int to make it Sendable and Receivable.

    "},"Extensions/Peripheral.html":{"name":"Peripheral"},"Extensions/String.html":{"name":"String","abstract":"

    Make String Sendable and Receivable.

    "},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7successyA2CmF":{"name":"success","abstract":"

    The write is successful.

    ","parent_name":"WriteResult"},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The write has failed unexpectedly with an error.

    ","parent_name":"WriteResult"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3newyAcA0B7OptionsVcACmF":{"name":"new(_:)","abstract":"

    Start Bluejay using a new CBCentralManager.

    ","parent_name":"StartMode"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3useyACSo16CBCentralManagerC_So12CBPeripheralCSgtcACmF":{"name":"use(manager:peripheral:)","abstract":"

    Start Bluejay using an existing CBCentralManager.

    ","parent_name":"StartMode"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO8continueyA2CmF":{"name":"continue","abstract":"

    Continue scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO9blacklistyA2CmF":{"name":"blacklist","abstract":"

    Continue scanning, but don’t discover the same peripheral in the current callback again within the same scan session.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO4stopyA2CmF":{"name":"stop","abstract":"

    Stop scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO7connectyAcA0B9DiscoveryV_AA7TimeoutOAA14WarningOptionsVyAA16ConnectionResultOctcACmF":{"name":"connect(_:_:_:_:)","abstract":"

    Stop scanning, and connect to a discovery.

    ","parent_name":"ScanAction"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The background task is successful, and the returned value is captured in the associated value.

    ","parent_name":"RunResult"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The background task has failed unexpectedly with an error.

    ","parent_name":"RunResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The read is successful and the value read is captured in the associated value.

    ","parent_name":"ReadResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The read has failed unexpectedly with an error.

    ","parent_name":"ReadResult"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO4trapyA2CmF":{"name":"trap","abstract":"

    New listen and its new callback on the same characteristic will not overwrite an existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO11replaceableyA2CmF":{"name":"replaceable","abstract":"

    New listens and its new callback on the same characteristic will replace the existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO18promiseRestorationyA2CmF":{"name":"promiseRestoration","abstract":"

    Bluejay will continue to receive but do nothing with the incoming listen events until a new listener is installed.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO04stopB0yA2CmF":{"name":"stopListen","abstract":"

    Bluejay will attempt to turn off notifications on the peripheral.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO13keepListeningyA2CmF":{"name":"keepListening","abstract":"

    Keep listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO4doneyA2CmF":{"name":"done","abstract":"

    Stop listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20bluetoothUnavailableyA2CmF":{"name":"bluetoothUnavailable","abstract":"

    Bluetooth is either turned off or unavailable.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO24multipleScanNotSupportedyA2CmF":{"name":"multipleScanNotSupported","abstract":"

    Bluejay does not support another scanning request if Bluejay is still scanning.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO27multipleConnectNotSupportedyA2CmF":{"name":"multipleConnectNotSupported","abstract":"

    Bluejay does not support another connection request if Bluejay is already connected or still connecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO30multipleDisconnectNotSupportedyA2CmF":{"name":"multipleDisconnectNotSupported","abstract":"

    Bluejay does not support another disconnection request if Bluejay is still disconnecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18connectionTimedOutyA2CmF":{"name":"connectionTimedOut","abstract":"

    A connection request in Bluejay has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO12notConnectedyA2CmF":{"name":"notConnected","abstract":"

    Bluejay is not connected to a peripheral.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14missingServiceyAcA0D10IdentifierVcACmF":{"name":"missingService(_:)","abstract":"

    A Bluetooth service is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21missingCharacteristicyAcA0D10IdentifierVcACmF":{"name":"missingCharacteristic(_:)","abstract":"

    A Bluetooth characteristic is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO9cancelledyA2CmF":{"name":"cancelled","abstract":"

    A Bluetooth operation is cancelled.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18explicitDisconnectyA2CmF":{"name":"explicitDisconnect","abstract":"

    Bluejay disconnect is called.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedDisconnectyA2CmF":{"name":"unexpectedDisconnect","abstract":"

    Bluejay disconnected unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO16disconnectQueuedyA2CmF":{"name":"disconnectQueued","abstract":"

    A disconnection operation is queued.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14listenTimedOutyA2CmF":{"name":"listenTimedOut","abstract":"

    An attempt to listen on a characteristic has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO10readFailedyA2CmF":{"name":"readFailed","abstract":"

    An attempt to read a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11writeFailedyA2CmF":{"name":"writeFailed","abstract":"

    An attempt to write a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11missingDatayA2CmF":{"name":"missingData","abstract":"

    An attempt to read a value from a characteristic has returned no data unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15dataOutOfBoundsyACSi_S2itcACmF":{"name":"dataOutOfBounds(start:length:count:)","abstract":"

    An attempt to read a range of data has failed due to incorrect bounds or an unexpected length.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedPeripheralyAcA0D10IdentifierVcACmF":{"name":"unexpectedPeripheral(_:)","abstract":"

    An unexpected peripheral is cached and retrieved from CoreBluetooth.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO39allowDuplicatesInBackgroundNotSupportedyA2CmF":{"name":"allowDuplicatesInBackgroundNotSupported","abstract":"

    iOS will not continue scanning in the background if allow duplicates is turned on.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO37missingServiceIdentifiersInBackgroundyA2CmF":{"name":"missingServiceIdentifiersInBackground","abstract":"

    iOS will not continue scanning in the background if no service identifiers are specified.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21backgroundTaskRunningyA2CmF":{"name":"backgroundTaskRunning","abstract":"

    Bluejay does not support further Bluetooth operations while a Bluejay background task is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO34multipleBackgroundTaskNotSupportedyA2CmF":{"name":"multipleBackgroundTaskNotSupported","abstract":"

    Bluejay does not support another Bluejay background task when there is already one that is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15indefiniteFlushyA2CmF":{"name":"indefiniteFlush","abstract":"

    Indefinite flush will not exit.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO7stoppedyA2CmF":{"name":"stopped","abstract":"

    Bluejay has stopped.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO31backgroundRestorationInProgressyA2CmF":{"name":"backgroundRestorationInProgress","abstract":"

    Bluejay cannot perform certain actions when background restoration is still in progress.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO28startupBackgroundTaskExpiredyA2CmF":{"name":"startupBackgroundTaskExpired","abstract":"

    Startup background task has expired during state restoration.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21multipleListenTrappedyA2CmF":{"name":"multipleListenTrapped","abstract":"

    The original listen declared that duplicated listens are not allowed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO22multipleListenReplacedyA2CmF":{"name":"multipleListenReplaced","abstract":"

    The original listen declared that it can be replaced by a new listen.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP11errorDomainSSvpZ":{"name":"errorDomain","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP9errorCodeSivp":{"name":"errorCode","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"BluejayError"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO12disconnectedyAcA20PeripheralIdentifierVcACmF":{"name":"disconnected(_:)","abstract":"

    The disconnection is successful, and the disconnected peripheral is captured in the associated value.

    ","parent_name":"DisconnectionResult"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The disconnection has failed unexpectedly with an error.

    ","parent_name":"DisconnectionResult"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO8noChangeyA2CmF":{"name":"noChange","abstract":"

    Bluejay will maintain its current auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO6changeyACSb_tcACmF":{"name":"change(shouldAutoReconnect:)","abstract":"

    Override Bluejay’s auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7successyAcA20PeripheralIdentifierVcACmF":{"name":"success(_:)","abstract":"

    The connection is successful, and the peripheral connected is captured in the associated value.

    ","parent_name":"ConnectionResult"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The connection has failed unexpectedly with an error.

    ","parent_name":"ConnectionResult"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO7secondsyACSdcACmF":{"name":"seconds(_:)","abstract":"

    Specify a timeout with a duration in seconds.

    ","parent_name":"Timeout"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO4noneyA2CmF":{"name":"none","abstract":"

    Specify there is no timeout.

    ","parent_name":"Timeout"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8callbackyACyyccACmF":{"name":"callback(_:)","abstract":"

    Put required Bluejay API or application calls that are needed after a background restoration inside this callback.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8continueyA2CmF":{"name":"continue","abstract":"

    Return this if no callback is needed after a background restoration.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO7disableyA2CmF":{"name":"disable","abstract":"

    Bluejay will not start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO6enableyAcA0bC6ConfigVcACmF":{"name":"enable(_:)","abstract":"

    Bluejay will start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html":{"name":"BackgroundRestoreMode","abstract":"

    Determines how Bluejay should opt-in to CoreBluetooth state restoration.

    "},"Enums/BackgroundRestoreCompletion.html":{"name":"BackgroundRestoreCompletion","abstract":"

    Allows capturing further Bluejay operations to be queued and executed after background restoration is completed.

    "},"Enums/Timeout.html":{"name":"Timeout","abstract":"

    Types of connection time outs. Can specify a time out in seconds, or no time out.

    "},"Enums/ConnectionResult.html":{"name":"ConnectionResult","abstract":"

    Indicates a successful, cancelled, or failed connection attempt, where the success case contains the peripheral connected to.

    "},"Enums/AutoReconnectMode.html":{"name":"AutoReconnectMode","abstract":"

    Tells Bluejay whether it should auto-reconnect.

    "},"Enums/DisconnectionResult.html":{"name":"DisconnectionResult","abstract":"

    Indicates a successful, cancelled, or failed disconnection attempt, where the success case contains the peripheral disconnected from.

    "},"Enums/BluejayError.html":{"name":"BluejayError","abstract":"

    Errors specific to Bluejay.

    "},"Enums/ListenAction.html":{"name":"ListenAction","abstract":"

    Indicates whether the current listen on a characteristic should continue or end.

    "},"Enums/ListenRestoreAction.html":{"name":"ListenRestoreAction","abstract":"

    Available actions to take on an unhandled listen event from background restoration.

    "},"Enums/MultipleListenOption.html":{"name":"MultipleListenOption","abstract":"

    Ways to handle calling listen on the same characteristic multiple times.

    "},"Enums/ReadResult.html":{"name":"ReadResult","abstract":"

    Indicates a successful, cancelled, or failed read attempt, where the success case contains the value read.

    "},"Enums/RunResult.html":{"name":"RunResult","abstract":"

    Indicates a successful, cancelled, or failed run(backgroundTask:completionOnMainThread:) attempt, where the success case contains the value returned at the end of the background task.

    "},"Enums/ScanAction.html":{"name":"ScanAction","abstract":"

    Indicates whether a scan should continue, continue but blacklist the current discovery, stop, or stop and connect.

    "},"Enums/StartMode.html":{"name":"StartMode","abstract":"

    Specifies whether to start a new Bluejay instance from scratch, or from an existing CoreBluetooth session.

    "},"Enums/WriteResult.html":{"name":"WriteResult","abstract":"

    Indicates a successful, cancelled, or failed write attempt.

    "},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC4read4fromxAA24CharacteristicIdentifierV_tKAA10ReceivableRzlF":{"name":"read(from:)","abstract":"

    Read a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC5write2to5value4typeyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVtKAA8SendableRzlF":{"name":"write(to:value:type:)","abstract":"

    Write a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC12writeAndRead0D2To5value4type8readFromxAA24CharacteristicIdentifierV_q_So25CBCharacteristicWriteTypeVAJtKAA10ReceivableRzAA8SendableR_r0_lF":{"name":"writeAndRead(writeTo:value:type:readFrom:)","abstract":"

    Write to one characterestic then reading a value from another.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC6listen2to7timeout10completionyAA24CharacteristicIdentifierV_AA7TimeoutOAA12ListenActionOxctKAA10ReceivableRzlF":{"name":"listen(to:timeout:completion:)","abstract":"

    Listen for changes on a specified characterstic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC9endListen2to5error10completionyAA24CharacteristicIdentifierV_s5Error_pSgyAA11WriteResultOcSgtKF":{"name":"endListen(to:error:completion:)","abstract":"

    Stop listening to a characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC11flushListen2to14nonZeroTimeout10completionyAA24CharacteristicIdentifierV_AA0I0OyyctKF":{"name":"flushListen(to:nonZeroTimeout:completion:)","abstract":"

    Flush a listen to a characteristic by receiving and discarding values for the specified duration.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC14writeAndListen0D2To5value4type06listenG016timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVALSiAA0F6ActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndListen(writeTo:value:type:listenTo:timeoutInSeconds:completion:)","abstract":"

    Handle a compound operation consisting of writing on one characterstic followed by listening on another for some streamed data.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC16writeAndAssemble0D2To5value06listenG014expectedLength16timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xALS2iAA12ListenActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndAssemble(writeTo:value:listenTo:expectedLength:timeoutInSeconds:completion:)","abstract":"

    Similar to writeAndListen, but use this if you don’t know or don’t have control over how many packets will be sent to you. You still need to know the total size of the data you’re receiving.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC23maximumWriteValueLength3forSiSo016CBCharacteristicE4TypeV_tF":{"name":"maximumWriteValueLength(for:)","abstract":"

    Ask for the peripheral’s maximum payload length in bytes for a single write request.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","parent_name":"SynchronizedPeripheral"},"Classes/Bluejay.html#/s:7BluejayAAC4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    Helps distinguish one Bluejay instance from another.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC20isBluetoothAvailableSbvp":{"name":"isBluetoothAvailable","abstract":"

    Allows checking whether Bluetooth is powered on. Also returns false if Bluejay is not started yet.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBluetoothStateUpdateImminentSbvp":{"name":"isBluetoothStateUpdateImminent","abstract":"

    Allows checking for if CoreBluetooth state is transitional (update is imminent)","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12isConnectingSbvp":{"name":"isConnecting","abstract":"

    Allows checking whether Bluejay is currently connecting to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isConnectedSbvp":{"name":"isConnected","abstract":"

    Allows checking whether Bluejay is currently connected to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC15isDisconnectingSbvp":{"name":"isDisconnecting","abstract":"

    Allows checking whether Bluejay is currently disconnecting from a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC19shouldAutoReconnectSbvp":{"name":"shouldAutoReconnect","abstract":"

    Allowing checking whether Bluejay will automatic reconnect after an unexpected disconnection. Default is true, and Bluejay will also always set this to true on a successful connection to a peripheral. Conversely, Bluejay will always set this to false after an explicit disconnection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10isScanningSbvp":{"name":"isScanning","abstract":"

    Allows checking whether Bluejay is currently scanning.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10hasStartedSbvp":{"name":"hasStarted","abstract":"

    Allows checking whether Bluejay has started and is available for use.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC21defaultWarningOptionsAA0cD0Vvp":{"name":"defaultWarningOptions","abstract":"

    Warning options to use for each new connection if the options are not specified at the creation of those connections.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBackgroundRestorationEnabledSbvp":{"name":"isBackgroundRestorationEnabled","abstract":"

    Allows checking whether Bluejay has background restoration enabled.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3logyySSF":{"name":"log(_:)","abstract":"

    Allow apps that use Bluejay to log alongside of Bluejay’s internal logs.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7getLogsSSSgyF":{"name":"getLogs()","abstract":"

    Get the current content of the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9clearLogsyyF":{"name":"clearLogs()","abstract":"

    Clears the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@M@Bluejay@objc(cs)Bluejay(im)init":{"name":"init()","abstract":"

    Initializing a Bluejay instance will not yet initialize the CoreBluetooth stack. An explicit start call after Bluejay is intialized will then initialize the CoreBluetooth stack and is required because in cases where a state resotration is trying to restore a listen on a characteristic, a listen restorer must be available before the CoreBluetooth stack is re-initialized. This two-step startup allows you to prepare and gaurantee the setup of your listen restorer in between the initialization of Bluejay and the initialization of the CoreBluetooth stack.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5start4modeyAA9StartModeO_tF":{"name":"start(mode:)","abstract":"

    Starting Bluejay will initialize the CoreBluetooth stack. Simply initializing a Bluejay instance without calling this function will not initialize the CoreBluetooth stack. An explicit start call is required so that we can also support proper background restoration, where CoreBluetooth must be initialized in the AppDelegate’s application(_:didFinishLaunchingWithOptions:) for both starting an iOS background task and for parsing the restore identifier.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC28stopAndExtractBluetoothStateSo16CBCentralManagerC7manager_So12CBPeripheralCSg10peripheraltyF":{"name":"stopAndExtractBluetoothState()","abstract":"

    Stops all operations and clears all states in Bluejay before returning a Core Bluetooth state that can then be used by another library or code outside of Bluejay.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC16cancelEverything5error16shouldDisconnectys5Error_p_SbtF":{"name":"cancelEverything(error:shouldDisconnect:)","abstract":"

    This will cancel the current and all pending operations in the Bluejay queue. It will also disconnect by default after the queue is emptied, but you can cancel everything without disconnecting.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register18connectionObserveryAA010ConnectionD0_p_tF":{"name":"register(connectionObserver:)","abstract":"

    Register for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister18connectionObserveryAA010ConnectionD0_p_tF":{"name":"unregister(connectionObserver:)","abstract":"

    Unregister for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register12rssiObserveryAA12RSSIObserver_p_tF":{"name":"register(rssiObserver:)","abstract":"

    Register for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister12rssiObserveryAA12RSSIObserver_p_tF":{"name":"unregister(rssiObserver:)","abstract":"

    Unregister for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register11logObserveryAA03LogD0_p_tF":{"name":"register(logObserver:)","abstract":"

    Register for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister11logObserveryAA03LogD0_p_tF":{"name":"unregister(logObserver:)","abstract":"

    Unregister for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC25registerDisconnectHandler7handleryAA0cD0_p_tF":{"name":"registerDisconnectHandler(handler:)","abstract":"

    Register a single disconnection handler for giving it a final say on what to do at the end of a disconnection, as well as evaluate and control Bluejay’s auto-reconnect behaviour.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC27unregisterDisconnectHandleryyF":{"name":"unregisterDisconnectHandler()","abstract":"

    Remove any registered disconnection handler.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4scan8duration15allowDuplicates17throttleRSSIDelta18serviceIdentifiers9discovery7expired7stoppedySd_SbSiSayAA17ServiceIdentifierVGSgAA10ScanActionOAA0O9DiscoveryV_SayARGtcApR_AStcSgyAS_s5Error_pSgtctF":{"name":"scan(duration:allowDuplicates:throttleRSSIDelta:serviceIdentifiers:discovery:expired:stopped:)","abstract":"

    Scan for the peripheral(s) specified.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12stopScanningyyF":{"name":"stopScanning()","abstract":"

    Stops current or queued scan.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7connect_7timeout14warningOptions10completionyAA20PeripheralIdentifierV_AA7TimeoutOAA07WarningE0VSgyAA16ConnectionResultOctF":{"name":"connect(_:timeout:warningOptions:completion:)","abstract":"

    Attempt to connect directly to a known peripheral. The call will fail if Bluetooth is not available, or if Bluejay is already connected. Making a connection request while Bluejay is scanning will also cause Bluejay to stop the current scan for you behind the scene prior to fulfilling your connection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10disconnect9immediate10completionySb_yAA19DisconnectionResultOcSgtF":{"name":"disconnect(immediate:completion:)","abstract":"

    Disconnect a connected peripheral or cancel a connecting peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4read4from10completionyAA24CharacteristicIdentifierV_yAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"read(from:completion:)","abstract":"

    Read from the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5write2to5value4type10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVyAA0J6ResultOctAA8SendableRzlF":{"name":"write(to:value:type:completion:)","abstract":"

    Write to the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC6listen2to20multipleListenOption10completionyAA24CharacteristicIdentifierV_AA08MultipleeF0OyAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"listen(to:multipleListenOption:completion:)","abstract":"

    Listen for notifications on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9endListen2to10completionyAA24CharacteristicIdentifierV_yAA11WriteResultOcSgtF":{"name":"endListen(to:completion:)","abstract":"

    End listening on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isListening2toSbAA24CharacteristicIdentifierV_tKF":{"name":"isListening(to:)","abstract":"

    Check if a peripheral is listening to a specific characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8readRSSIyyKF":{"name":"readRSSI()","abstract":"

    Attempts to read the RSSI (signal strength) of the currently connected peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyyAA22SynchronizedPeripheralCKc_yAA9RunResultOyytGctF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This is the simplest one as the background task will not return any typed values back to the completion block on finishing the background task, except for thrown errors, and it also doesn’t provide an input for an object that might need thread safe access.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyxAA22SynchronizedPeripheralCKc_yAA9RunResultOyxGctlF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run8userData14backgroundTask22completionOnMainThreadyx_q_AA22SynchronizedPeripheralC_xtKcyAA9RunResultOyq_Gctr0_lF":{"name":"run(userData:backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully, as well as supplying an object for thread safe access inside the background task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7combine9sendables10Foundation4DataVSayAA8Sendable_pG_tFZ":{"name":"combine(sendables:)","abstract":"

    A helper function to take an array of Sendables and combine their data together.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManagerDidUpdateState:":{"name":"centralManagerDidUpdateState(_:)","abstract":"

    Bluejay uses this to figure out whether Bluetooth is available or not.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:willRestoreState:":{"name":"centralManager(_:willRestoreState:)","abstract":"

    If Core Bluetooth will restore state, update Bluejay’s internal states to match the states of the Core Bluetooth stack by assigning the peripheral to connectingPeripheral or connectedPeripheral, or niling them out, depending on what the restored CBPeripheral state is.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didConnectPeripheral:":{"name":"centralManager(_:didConnect:)","abstract":"

    When connected, update Bluejay’s states by updating the values for connectingPeripheral, connectedPeripheral, and shouldAutoReconnect. Also, make sure to broadcast the event to observers, and notify the queue so that the current operation in-flight can process this event and get a chance to finish.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDisconnectPeripheral:error:":{"name":"centralManager(_:didDisconnectPeripheral:error:)","abstract":"

    Handle a disconnection event from Core Bluetooth by figuring out what kind of disconnection it is (planned or unplanned), and updating Bluejay’s internal state and sending notifications as appropriate.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didFailToConnectPeripheral:error:":{"name":"centralManager(_:didFailToConnect:error:)","abstract":"

    This mostly happens when either the Bluetooth device or the Core Bluetooth stack somehow only partially completes the negotiation of a connection. For simplicity, Bluejay is currently treating this as a disconnection event, so it can perform all the same clean up logic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDiscoverPeripheral:advertisementData:RSSI:":{"name":"centralManager(_:didDiscover:advertisementData:rssi:)","abstract":"

    This should only be called when the current operation in the queue is a Scan task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html":{"name":"Bluejay","abstract":"

    Bluejay is a simple wrapper around CoreBluetooth that focuses on making a common usage case as straight forward as possible: a single connected peripheral that the user is interacting with regularly (think most personal electronics devices that have an associated iOS app: fitness trackers, guitar amps, etc).

    "},"Classes/SynchronizedPeripheral.html":{"name":"SynchronizedPeripheral","abstract":"

    A synchronous interface to the Bluetooth peripheral, intended to be used inside the backgroundTask block of run(backgroundTask:completionOnMainThread:) to perform multi-part operations without the need for a complicated callback or promise setup.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file +{"Typealiases.html#/s:7Bluejay17RestoreIdentifiera":{"name":"RestoreIdentifier","abstract":"

    An alias to make it clearer that the string should be some kind of identifier for restoration, and not just any arbitrary string.

    "},"Typealiases.html#/s:7Bluejay13LaunchOptionsa":{"name":"LaunchOptions","abstract":"

    An alias to make it clearer that the dictionary should be the launch options from UIApplicationDelegate.

    "},"Typealiases.html#/s:7Bluejay14ListenCallbacka":{"name":"ListenCallback","abstract":"

    Gives name to a specific callback type used for listens.

    "},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Sensible default warning options: all off in favour of not aggressively notifying the user of changes when the app is backgrounded.

    ","parent_name":"WarningOptions"},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV18notifyOnConnection0dE13Disconnection0dE12NotificationACSb_S2btcfc":{"name":"init(notifyOnConnection:notifyOnDisconnection:notifyOnNotification:)","abstract":"

    Creates a connection options that can specify whether iOS can display a system alert when certain conditions are met while your app is suspended, usually an alert dialog outside of your app in the Home screen for example.

    ","parent_name":"WarningOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV20enableBluetoothAlert17backgroundRestoreACSb_AA010BackgroundH4ModeOtcfc":{"name":"init(enableBluetoothAlert:backgroundRestore:)","abstract":"

    Configurations for starting Bluejay.

    ","parent_name":"StartOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Convenience factory method to avoid having to use the public initializer.

    ","parent_name":"StartOptions"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this service.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSS_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a string. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSo6CBUUIDC_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two ServiceIdentifier.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV20peripheralIdentifierAA010PeripheralE0Vvp":{"name":"peripheralIdentifier","abstract":"

    The unique, persistent identifier associated with the peer.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV19advertisementPacketSDySSypGvp":{"name":"advertisementPacket","abstract":"

    The advertisement packet the discovered peripheral is sending.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV4rssiSivp":{"name":"rssi","abstract":"

    The signal strength of the peripheral discovered.

    ","parent_name":"ScanDiscovery"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    The UUID of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4nameSSvp":{"name":"name","abstract":"

    The name of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns both the name and uuid of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid4nameAC10Foundation4UUIDV_SSSgtcfc":{"name":"init(uuid:name:)","abstract":"

    Create a PeripheralIdentifier using a UUID.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SH9hashValueSivp":{"name":"hashValue","parent_name":"PeripheralIdentifier"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingVyACSicfc":{"name":"init(_:)","abstract":"

    Create empty data.

    ","parent_name":"DataPadding"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingV011toBluetoothB010Foundation0B0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to the Sendable protocol, which allows Bluejay to serialize DataPadding when performing write-related operations.

    ","parent_name":"DataPadding"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV7serviceAA07ServiceC0Vvp":{"name":"service","abstract":"

    The service this characteristic belongs to.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierVyACSo16CBCharacteristicCcfc":{"name":"init(_:)","abstract":"

    Create a CharacteristicIdentifier using a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns the essential description of a characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSS_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a string and a ServiceIdentifier. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSo6CBUUIDC_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a CBUUID and a ServiceIdentifier.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_So16CBCharacteristicCtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between a CharacteristicIdentifier and a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two CharacteristicIdentifiers.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifierSSvp":{"name":"restoreIdentifier","abstract":"

    A restore identifier helps uniquely identify which device is triggering background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV18backgroundRestorerAA0bF0_pvp":{"name":"backgroundRestorer","abstract":"

    A background restorer is required to handle the results of a background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV14listenRestorerAA06ListenF0_pvp":{"name":"listenRestorer","abstract":"

    A listen restorer is required for any potential unhandled listens when restoring to a connected peripheral.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV13launchOptionsSDySo019UIApplicationLaunchF3KeyaypGSgvp":{"name":"launchOptions","abstract":"

    The launch options from application(_:didFinishLaunchingWithOptions:) is required to parse the restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV11centralKeysSaySSGSgvp":{"name":"centralKeys","abstract":"

    Convenience return of bluetooth central keys from the launch options.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV015isRestoringFromB0Sbvp":{"name":"isRestoringFromBackground","abstract":"

    If CoreBluetooth is restoring from background, the bluetooth central keys from launch options will contain the designated restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifier18backgroundRestorer06listenH013launchOptionsACSS_AA0bH0_pAA06ListenH0_pSDySo019UIApplicationLaunchK3KeyaypGSgtcfc":{"name":"init(restoreIdentifier:backgroundRestorer:listenRestorer:launchOptions:)","abstract":"

    Initializes a container for all required configurations necessary to support background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html":{"name":"BackgroundRestoreConfig","abstract":"

    Contains all required configurations for background restoration.

    "},"Structs/CharacteristicIdentifier.html":{"name":"CharacteristicIdentifier","abstract":"

    A wrapper for CBUUID specific to a characteristic to help distinguish it from a CBUUID of a service.

    "},"Structs/DataPadding.html":{"name":"DataPadding","abstract":"

    Helper object that can create empty data to be used as padding in packet construction.

    "},"Structs/PeripheralIdentifier.html":{"name":"PeripheralIdentifier","abstract":"

    Uniquely identifies a peripheral to the current iOS device. The UUID changes and is different on different iOS devices.

    "},"Structs/ScanDiscovery.html":{"name":"ScanDiscovery","abstract":"

    A model capturing what is found from a scan callback.

    "},"Structs/ServiceIdentifier.html":{"name":"ServiceIdentifier","abstract":"

    A wrapper for CBUUID specific to a service to help distinguish it from a CBUUID of a characteristic.

    "},"Structs/StartOptions.html":{"name":"StartOptions","abstract":"

    Wrapper for CBCentralManager initialization configurations when starting a new Bluejay instance.

    "},"Structs/WarningOptions.html":{"name":"WarningOptions","abstract":"

    A connection’s configurations for system alerts.

    "},"Protocols/ServiceObserver.html#/s:7Bluejay15ServiceObserverP17didModifyServices4from011invalidatedF0yAA20PeripheralIdentifierV_SayAA0bJ0VGtF":{"name":"didModifyServices(from:invalidatedServices:)","abstract":"

    Called whenever a peripheral’s services change.

    ","parent_name":"ServiceObserver"},"Protocols/Sendable.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","abstract":"

    A place to implement your serialization logic.

    ","parent_name":"Sendable"},"Protocols/Receivable.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","abstract":"

    A place to implement your deserialization logic.

    ","parent_name":"Receivable"},"Protocols/RSSIObserver.html#/s:7Bluejay12RSSIObserverP11didReadRSSI4from0E05erroryAA20PeripheralIdentifierV_So8NSNumberCs5Error_pSgtF":{"name":"didReadRSSI(from:RSSI:error:)","abstract":"

    Called whenever a peripheral’s RSSI value changes.

    ","parent_name":"RSSIObserver"},"Protocols/LogObserver.html#/s:7Bluejay11LogObserverP14logFileUpdated4logsySS_tF":{"name":"logFileUpdated(logs:)","abstract":"

    Called whenever the log file is updated.

    ","parent_name":"LogObserver"},"Protocols/ListenRestorer.html#/s:7Bluejay14ListenRestorerP019didReceiveUnhandledB04from2on4withAA0B13RestoreActionOAA20PeripheralIdentifierV_AA014CharacteristicM0V10Foundation4DataVSgtF":{"name":"didReceiveUnhandledListen(from:on:with:)","abstract":"

    Called whenever there is an unhandled listen.

    ","parent_name":"ListenRestorer"},"Protocols/DisconnectHandler.html#/s:7Bluejay17DisconnectHandlerP03didB04from4with13willReconnectAA04AutoH4ModeOAA20PeripheralIdentifierV_s5Error_pSgSbtF":{"name":"didDisconnect(from:with:willReconnect:)","abstract":"

    Notifies the delegate that the peripheral is fully disconnected.

    ","parent_name":"DisconnectHandler"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","abstract":"

    Called whenever Bluetooth availability changes, as well as when an object first subscribes to become a ConnectionObserver.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP9connected2toyAA20PeripheralIdentifierV_tF":{"name":"connected(to:)","abstract":"

    Called whenever a peripheral is connected, as well as when an object first subscribes to become a ConnectionObserver and the peripheral is already connected.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","abstract":"

    Called whenever a peripheral is disconnected.

    ","parent_name":"ConnectionObserver"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP20didRestoreConnection2toAA0bE10CompletionOAA20PeripheralIdentifierV_tF":{"name":"didRestoreConnection(to:)","abstract":"

    Bluejay was able to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP26didFailToRestoreConnection2to5errorAA0bG10CompletionOAA20PeripheralIdentifierV_s5Error_ptF":{"name":"didFailToRestoreConnection(to:error:)","abstract":"

    Bluejay failed to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html":{"name":"BackgroundRestorer","abstract":"

    Protocols for handling the results of a background restoration.

    "},"Protocols/ConnectionObserver.html":{"name":"ConnectionObserver","abstract":"

    A protocol allowing conforming objects registered to Bluejay to optionally respond to Bluetooth connection events.

    "},"Protocols/DisconnectHandler.html":{"name":"DisconnectHandler","abstract":"

    A protocol allowing a single delegate registered to Bluejay to have a final say at the end of a disconnection, as well as evaluate and control the auto-reconnect behaviour.

    "},"Protocols/ListenRestorer.html":{"name":"ListenRestorer","abstract":"

    Protocol for handling a listen event that does not have a callback due to background restoration.

    "},"Protocols/LogObserver.html":{"name":"LogObserver","abstract":"

    A protocol allowing conforming objects to monitor log file changes.

    "},"Protocols/RSSIObserver.html":{"name":"RSSIObserver","abstract":"

    A protocol allowing conforming objects to monitor the RSSI changes of a connected peripheral.

    "},"Protocols/Receivable.html":{"name":"Receivable","abstract":"

    Protocol to indicate that a type can be received from the Bluetooth connection.

    "},"Protocols/Sendable.html":{"name":"Sendable","abstract":"

    Protocol to indicate that a type can be sent via the Bluetooth connection.

    "},"Protocols/ServiceObserver.html":{"name":"ServiceObserver","abstract":"

    A protocol allowing conforming objects to monitor the services changes of a connected peripheral.

    "},"Extensions/String.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","parent_name":"String"},"Extensions/String.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","parent_name":"String"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverServices:":{"name":"peripheral(_:didDiscoverServices:)","abstract":"

    Captures CoreBluetooth’s did discover services event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverCharacteristicsForService:error:":{"name":"peripheral(_:didDiscoverCharacteristicsFor:error:)","abstract":"

    Captures CoreBluetooth’s did discover characteristics event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didWriteValueForCharacteristic:error:":{"name":"peripheral(_:didWriteValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did write to charactersitic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateValueForCharacteristic:error:":{"name":"peripheral(_:didUpdateValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did receive a notification/value from a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateNotificationStateForCharacteristic:error:":{"name":"peripheral(_:didUpdateNotificationStateFor:error:)","abstract":"

    Captures CoreBluetooth’s did turn on or off notification/listening on a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didReadRSSI:error:":{"name":"peripheral(_:didReadRSSI:error:)","abstract":"

    Captures CoreBluetooth’s did read RSSI event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didModifyServices:":{"name":"peripheral(_:didModifyServices:)","abstract":"

    Called when the peripheral removed or added services.

    ","parent_name":"Peripheral"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE15toBluetoothData10Foundation0D0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to Sendable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE13bluetoothDatax10Foundation0C0V_tcfc":{"name":"init(bluetoothData:)","abstract":"

    This function is required to conform to Receivable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE7extract5start6lengthxSi_SitKlF":{"name":"extract(start:length:)","abstract":"

    Convenience function to read a range of Data and deserialize it into the specified type.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE011toBluetoothB0ACyF":{"name":"toBluetoothData()","abstract":"

    Allows using Data as is when using Bluejay and working with write-related operations.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE09bluetoothB0A2C_tcfc":{"name":"init(bluetoothData:)","abstract":"

    Allows using Data as is when using Bluejay and working with read-related operations.

    ","parent_name":"Data"},"Extensions/CBService.html#/s:So9CBServiceC7BluejayE14characteristic4withSo16CBCharacteristicCSgSo6CBUUIDC_tF":{"name":"characteristic(with:)","abstract":"

    Find a characteristic on a service by CBUUID.

    ","parent_name":"CBService"},"Extensions/CBPeripheralState.html#/s:So17CBPeripheralStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBPeripheralState as a string.

    ","parent_name":"CBPeripheralState"},"Extensions/CBPeripheral.html#/s:So12CBPeripheralC7BluejayE7service4withSo9CBServiceCSgSo6CBUUIDC_tF":{"name":"service(with:)","abstract":"

    Find a service on a peripheral by CBUUID.

    ","parent_name":"CBPeripheral"},"Extensions/CBManagerState.html#/s:So14CBManagerStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBManagerState as a string.

    ","parent_name":"CBManagerState"},"Extensions/CBManagerState.html":{"name":"CBManagerState"},"Extensions/CBPeripheral.html":{"name":"CBPeripheral"},"Extensions/CBPeripheralState.html":{"name":"CBPeripheralState"},"Extensions/CBService.html":{"name":"CBService"},"Extensions/Data.html":{"name":"Data"},"Extensions/BinaryInteger.html":{"name":"BinaryInteger","abstract":"

    Extension to Int to make it Sendable and Receivable.

    "},"Extensions/Peripheral.html":{"name":"Peripheral"},"Extensions/String.html":{"name":"String","abstract":"

    Make String Sendable and Receivable.

    "},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7successyA2CmF":{"name":"success","abstract":"

    The write is successful.

    ","parent_name":"WriteResult"},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The write has failed unexpectedly with an error.

    ","parent_name":"WriteResult"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3newyAcA0B7OptionsVcACmF":{"name":"new(_:)","abstract":"

    Start Bluejay using a new CBCentralManager.

    ","parent_name":"StartMode"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3useyACSo16CBCentralManagerC_So12CBPeripheralCSgtcACmF":{"name":"use(manager:peripheral:)","abstract":"

    Start Bluejay using an existing CBCentralManager.

    ","parent_name":"StartMode"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO8continueyA2CmF":{"name":"continue","abstract":"

    Continue scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO9blacklistyA2CmF":{"name":"blacklist","abstract":"

    Continue scanning, but don’t discover the same peripheral in the current callback again within the same scan session.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO4stopyA2CmF":{"name":"stop","abstract":"

    Stop scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO7connectyAcA0B9DiscoveryV_AA7TimeoutOAA14WarningOptionsVyAA16ConnectionResultOctcACmF":{"name":"connect(_:_:_:_:)","abstract":"

    Stop scanning, and connect to a discovery.

    ","parent_name":"ScanAction"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The background task is successful, and the returned value is captured in the associated value.

    ","parent_name":"RunResult"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The background task has failed unexpectedly with an error.

    ","parent_name":"RunResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The read is successful and the value read is captured in the associated value.

    ","parent_name":"ReadResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The read has failed unexpectedly with an error.

    ","parent_name":"ReadResult"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO4trapyA2CmF":{"name":"trap","abstract":"

    New listen and its new callback on the same characteristic will not overwrite an existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO11replaceableyA2CmF":{"name":"replaceable","abstract":"

    New listens and its new callback on the same characteristic will replace the existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO18promiseRestorationyA2CmF":{"name":"promiseRestoration","abstract":"

    Bluejay will continue to receive but do nothing with the incoming listen events until a new listener is installed.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO04stopB0yA2CmF":{"name":"stopListen","abstract":"

    Bluejay will attempt to turn off notifications on the peripheral.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO13keepListeningyA2CmF":{"name":"keepListening","abstract":"

    Keep listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO4doneyA2CmF":{"name":"done","abstract":"

    Stop listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20bluetoothUnavailableyA2CmF":{"name":"bluetoothUnavailable","abstract":"

    Bluetooth is either turned off or unavailable.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO24multipleScanNotSupportedyA2CmF":{"name":"multipleScanNotSupported","abstract":"

    Bluejay does not support another scanning request if Bluejay is still scanning.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO27multipleConnectNotSupportedyA2CmF":{"name":"multipleConnectNotSupported","abstract":"

    Bluejay does not support another connection request if Bluejay is already connected or still connecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO30multipleDisconnectNotSupportedyA2CmF":{"name":"multipleDisconnectNotSupported","abstract":"

    Bluejay does not support another disconnection request if Bluejay is still disconnecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18connectionTimedOutyA2CmF":{"name":"connectionTimedOut","abstract":"

    A connection request in Bluejay has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO12notConnectedyA2CmF":{"name":"notConnected","abstract":"

    Bluejay is not connected to a peripheral.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14missingServiceyAcA0D10IdentifierVcACmF":{"name":"missingService(_:)","abstract":"

    A Bluetooth service is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21missingCharacteristicyAcA0D10IdentifierVcACmF":{"name":"missingCharacteristic(_:)","abstract":"

    A Bluetooth characteristic is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO9cancelledyA2CmF":{"name":"cancelled","abstract":"

    A Bluetooth operation is cancelled.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18explicitDisconnectyA2CmF":{"name":"explicitDisconnect","abstract":"

    Bluejay disconnect is called.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedDisconnectyA2CmF":{"name":"unexpectedDisconnect","abstract":"

    Bluejay disconnected unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO16disconnectQueuedyA2CmF":{"name":"disconnectQueued","abstract":"

    A disconnection operation is queued.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14listenTimedOutyA2CmF":{"name":"listenTimedOut","abstract":"

    An attempt to listen on a characteristic has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO10readFailedyA2CmF":{"name":"readFailed","abstract":"

    An attempt to read a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11writeFailedyA2CmF":{"name":"writeFailed","abstract":"

    An attempt to write a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11missingDatayA2CmF":{"name":"missingData","abstract":"

    An attempt to read a value from a characteristic has returned no data unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15dataOutOfBoundsyACSi_S2itcACmF":{"name":"dataOutOfBounds(start:length:count:)","abstract":"

    An attempt to read a range of data has failed due to incorrect bounds or an unexpected length.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedPeripheralyAcA0D10IdentifierVcACmF":{"name":"unexpectedPeripheral(_:)","abstract":"

    An unexpected peripheral is cached and retrieved from CoreBluetooth.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO39allowDuplicatesInBackgroundNotSupportedyA2CmF":{"name":"allowDuplicatesInBackgroundNotSupported","abstract":"

    iOS will not continue scanning in the background if allow duplicates is turned on.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO37missingServiceIdentifiersInBackgroundyA2CmF":{"name":"missingServiceIdentifiersInBackground","abstract":"

    iOS will not continue scanning in the background if no service identifiers are specified.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21backgroundTaskRunningyA2CmF":{"name":"backgroundTaskRunning","abstract":"

    Bluejay does not support further Bluetooth operations while a Bluejay background task is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO34multipleBackgroundTaskNotSupportedyA2CmF":{"name":"multipleBackgroundTaskNotSupported","abstract":"

    Bluejay does not support another Bluejay background task when there is already one that is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15indefiniteFlushyA2CmF":{"name":"indefiniteFlush","abstract":"

    Indefinite flush will not exit.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO7stoppedyA2CmF":{"name":"stopped","abstract":"

    Bluejay has stopped.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO31backgroundRestorationInProgressyA2CmF":{"name":"backgroundRestorationInProgress","abstract":"

    Bluejay cannot perform certain actions when background restoration is still in progress.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO28startupBackgroundTaskExpiredyA2CmF":{"name":"startupBackgroundTaskExpired","abstract":"

    Startup background task has expired during state restoration.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21multipleListenTrappedyA2CmF":{"name":"multipleListenTrapped","abstract":"

    The original listen declared that duplicated listens are not allowed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO22multipleListenReplacedyA2CmF":{"name":"multipleListenReplaced","abstract":"

    The original listen declared that it can be replaced by a new listen.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP11errorDomainSSvpZ":{"name":"errorDomain","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP9errorCodeSivp":{"name":"errorCode","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"BluejayError"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO12disconnectedyAcA20PeripheralIdentifierVcACmF":{"name":"disconnected(_:)","abstract":"

    The disconnection is successful, and the disconnected peripheral is captured in the associated value.

    ","parent_name":"DisconnectionResult"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The disconnection has failed unexpectedly with an error.

    ","parent_name":"DisconnectionResult"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO8noChangeyA2CmF":{"name":"noChange","abstract":"

    Bluejay will maintain its current auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO6changeyACSb_tcACmF":{"name":"change(shouldAutoReconnect:)","abstract":"

    Override Bluejay’s auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7successyAcA20PeripheralIdentifierVcACmF":{"name":"success(_:)","abstract":"

    The connection is successful, and the peripheral connected is captured in the associated value.

    ","parent_name":"ConnectionResult"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The connection has failed unexpectedly with an error.

    ","parent_name":"ConnectionResult"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO7secondsyACSdcACmF":{"name":"seconds(_:)","abstract":"

    Specify a timeout with a duration in seconds.

    ","parent_name":"Timeout"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO4noneyA2CmF":{"name":"none","abstract":"

    Specify there is no timeout.

    ","parent_name":"Timeout"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8callbackyACyyccACmF":{"name":"callback(_:)","abstract":"

    Put required Bluejay API or application calls that are needed after a background restoration inside this callback.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8continueyA2CmF":{"name":"continue","abstract":"

    Return this if no callback is needed after a background restoration.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO7disableyA2CmF":{"name":"disable","abstract":"

    Bluejay will not start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO6enableyAcA0bC6ConfigVcACmF":{"name":"enable(_:)","abstract":"

    Bluejay will start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html":{"name":"BackgroundRestoreMode","abstract":"

    Determines how Bluejay should opt-in to CoreBluetooth state restoration.

    "},"Enums/BackgroundRestoreCompletion.html":{"name":"BackgroundRestoreCompletion","abstract":"

    Allows capturing further Bluejay operations to be queued and executed after background restoration is completed.

    "},"Enums/Timeout.html":{"name":"Timeout","abstract":"

    Types of connection time outs. Can specify a time out in seconds, or no time out.

    "},"Enums/ConnectionResult.html":{"name":"ConnectionResult","abstract":"

    Indicates a successful, cancelled, or failed connection attempt, where the success case contains the peripheral connected to.

    "},"Enums/AutoReconnectMode.html":{"name":"AutoReconnectMode","abstract":"

    Tells Bluejay whether it should auto-reconnect.

    "},"Enums/DisconnectionResult.html":{"name":"DisconnectionResult","abstract":"

    Indicates a successful, cancelled, or failed disconnection attempt, where the success case contains the peripheral disconnected from.

    "},"Enums/BluejayError.html":{"name":"BluejayError","abstract":"

    Errors specific to Bluejay.

    "},"Enums/ListenAction.html":{"name":"ListenAction","abstract":"

    Indicates whether the current listen on a characteristic should continue or end.

    "},"Enums/ListenRestoreAction.html":{"name":"ListenRestoreAction","abstract":"

    Available actions to take on an unhandled listen event from background restoration.

    "},"Enums/MultipleListenOption.html":{"name":"MultipleListenOption","abstract":"

    Ways to handle calling listen on the same characteristic multiple times.

    "},"Enums/ReadResult.html":{"name":"ReadResult","abstract":"

    Indicates a successful, cancelled, or failed read attempt, where the success case contains the value read.

    "},"Enums/RunResult.html":{"name":"RunResult","abstract":"

    Indicates a successful, cancelled, or failed run(backgroundTask:completionOnMainThread:) attempt, where the success case contains the value returned at the end of the background task.

    "},"Enums/ScanAction.html":{"name":"ScanAction","abstract":"

    Indicates whether a scan should continue, continue but blacklist the current discovery, stop, or stop and connect.

    "},"Enums/StartMode.html":{"name":"StartMode","abstract":"

    Specifies whether to start a new Bluejay instance from scratch, or from an existing CoreBluetooth session.

    "},"Enums/WriteResult.html":{"name":"WriteResult","abstract":"

    Indicates a successful, cancelled, or failed write attempt.

    "},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC4read4fromxAA24CharacteristicIdentifierV_tKAA10ReceivableRzlF":{"name":"read(from:)","abstract":"

    Read a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC5write2to5value4typeyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVtKAA8SendableRzlF":{"name":"write(to:value:type:)","abstract":"

    Write a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC12writeAndRead0D2To5value4type8readFromxAA24CharacteristicIdentifierV_q_So25CBCharacteristicWriteTypeVAJtKAA10ReceivableRzAA8SendableR_r0_lF":{"name":"writeAndRead(writeTo:value:type:readFrom:)","abstract":"

    Write to one characterestic then reading a value from another.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC6listen2to7timeout10completionyAA24CharacteristicIdentifierV_AA7TimeoutOAA12ListenActionOxctKAA10ReceivableRzlF":{"name":"listen(to:timeout:completion:)","abstract":"

    Listen for changes on a specified characterstic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC9endListen2to5error10completionyAA24CharacteristicIdentifierV_s5Error_pSgyAA11WriteResultOcSgtKF":{"name":"endListen(to:error:completion:)","abstract":"

    Stop listening to a characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC11flushListen2to14nonZeroTimeout10completionyAA24CharacteristicIdentifierV_AA0I0OyyctKF":{"name":"flushListen(to:nonZeroTimeout:completion:)","abstract":"

    Flush a listen to a characteristic by receiving and discarding values for the specified duration.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC14writeAndListen0D2To5value4type06listenG016timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVALSiAA0F6ActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndListen(writeTo:value:type:listenTo:timeoutInSeconds:completion:)","abstract":"

    Handle a compound operation consisting of writing on one characterstic followed by listening on another for some streamed data.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC16writeAndAssemble0D2To5value06listenG014expectedLength16timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xALS2iAA12ListenActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndAssemble(writeTo:value:listenTo:expectedLength:timeoutInSeconds:completion:)","abstract":"

    Similar to writeAndListen, but use this if you don’t know or don’t have control over how many packets will be sent to you. You still need to know the total size of the data you’re receiving.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC23maximumWriteValueLength3forSiSo016CBCharacteristicE4TypeV_tF":{"name":"maximumWriteValueLength(for:)","abstract":"

    Ask for the peripheral’s maximum payload length in bytes for a single write request.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","parent_name":"SynchronizedPeripheral"},"Classes/Bluejay.html#/s:7BluejayAAC4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    Helps distinguish one Bluejay instance from another.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC20isBluetoothAvailableSbvp":{"name":"isBluetoothAvailable","abstract":"

    Allows checking whether Bluetooth is powered on. Also returns false if Bluejay is not started yet.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBluetoothStateUpdateImminentSbvp":{"name":"isBluetoothStateUpdateImminent","abstract":"

    Allows checking for if CoreBluetooth state is transitional (update is imminent)","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12isConnectingSbvp":{"name":"isConnecting","abstract":"

    Allows checking whether Bluejay is currently connecting to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isConnectedSbvp":{"name":"isConnected","abstract":"

    Allows checking whether Bluejay is currently connected to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC15isDisconnectingSbvp":{"name":"isDisconnecting","abstract":"

    Allows checking whether Bluejay is currently disconnecting from a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC19shouldAutoReconnectSbvp":{"name":"shouldAutoReconnect","abstract":"

    Allowing checking whether Bluejay will automatic reconnect after an unexpected disconnection. Default is true, and Bluejay will also always set this to true on a successful connection to a peripheral. Conversely, Bluejay will always set this to false after an explicit disconnection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10isScanningSbvp":{"name":"isScanning","abstract":"

    Allows checking whether Bluejay is currently scanning.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10hasStartedSbvp":{"name":"hasStarted","abstract":"

    Allows checking whether Bluejay has started and is available for use.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC21defaultWarningOptionsAA0cD0Vvp":{"name":"defaultWarningOptions","abstract":"

    Warning options to use for each new connection if the options are not specified at the creation of those connections.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBackgroundRestorationEnabledSbvp":{"name":"isBackgroundRestorationEnabled","abstract":"

    Allows checking whether Bluejay has background restoration enabled.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3logyySSF":{"name":"log(_:)","abstract":"

    Allow apps that use Bluejay to log alongside of Bluejay’s internal logs.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7getLogsSSSgyF":{"name":"getLogs()","abstract":"

    Get the current content of the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9clearLogsyyF":{"name":"clearLogs()","abstract":"

    Clears the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@M@Bluejay@objc(cs)Bluejay(im)init":{"name":"init()","abstract":"

    Initializing a Bluejay instance will not yet initialize the CoreBluetooth stack. An explicit start call after Bluejay is intialized will then initialize the CoreBluetooth stack and is required because in cases where a state resotration is trying to restore a listen on a characteristic, a listen restorer must be available before the CoreBluetooth stack is re-initialized. This two-step startup allows you to prepare and gaurantee the setup of your listen restorer in between the initialization of Bluejay and the initialization of the CoreBluetooth stack.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5start4modeyAA9StartModeO_tF":{"name":"start(mode:)","abstract":"

    Starting Bluejay will initialize the CoreBluetooth stack. Simply initializing a Bluejay instance without calling this function will not initialize the CoreBluetooth stack. An explicit start call is required so that we can also support proper background restoration, where CoreBluetooth must be initialized in the AppDelegate’s application(_:didFinishLaunchingWithOptions:) for both starting an iOS background task and for parsing the restore identifier.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC28stopAndExtractBluetoothStateSo16CBCentralManagerC7manager_So12CBPeripheralCSg10peripheraltyF":{"name":"stopAndExtractBluetoothState()","abstract":"

    Stops all operations and clears all states in Bluejay before returning a Core Bluetooth state that can then be used by another library or code outside of Bluejay.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC16cancelEverything5error16shouldDisconnectys5Error_p_SbtF":{"name":"cancelEverything(error:shouldDisconnect:)","abstract":"

    This will cancel the current and all pending operations in the Bluejay queue. It will also disconnect by default after the queue is emptied, but you can cancel everything without disconnecting.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register18connectionObserveryAA010ConnectionD0_p_tF":{"name":"register(connectionObserver:)","abstract":"

    Register for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister18connectionObserveryAA010ConnectionD0_p_tF":{"name":"unregister(connectionObserver:)","abstract":"

    Unregister for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register12rssiObserveryAA12RSSIObserver_p_tF":{"name":"register(rssiObserver:)","abstract":"

    Register for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister12rssiObserveryAA12RSSIObserver_p_tF":{"name":"unregister(rssiObserver:)","abstract":"

    Unregister for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register15serviceObserveryAA07ServiceD0_p_tF":{"name":"register(serviceObserver:)","abstract":"

    Register for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister15serviceObserveryAA07ServiceD0_p_tF":{"name":"unregister(serviceObserver:)","abstract":"

    Unregister for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register11logObserveryAA03LogD0_p_tF":{"name":"register(logObserver:)","abstract":"

    Register for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister11logObserveryAA03LogD0_p_tF":{"name":"unregister(logObserver:)","abstract":"

    Unregister for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC25registerDisconnectHandler7handleryAA0cD0_p_tF":{"name":"registerDisconnectHandler(handler:)","abstract":"

    Register a single disconnection handler for giving it a final say on what to do at the end of a disconnection, as well as evaluate and control Bluejay’s auto-reconnect behaviour.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC27unregisterDisconnectHandleryyF":{"name":"unregisterDisconnectHandler()","abstract":"

    Remove any registered disconnection handler.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4scan8duration15allowDuplicates17throttleRSSIDelta18serviceIdentifiers9discovery7expired7stoppedySd_SbSiSayAA17ServiceIdentifierVGSgAA10ScanActionOAA0O9DiscoveryV_SayARGtcApR_AStcSgyAS_s5Error_pSgtctF":{"name":"scan(duration:allowDuplicates:throttleRSSIDelta:serviceIdentifiers:discovery:expired:stopped:)","abstract":"

    Scan for the peripheral(s) specified.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12stopScanningyyF":{"name":"stopScanning()","abstract":"

    Stops current or queued scan.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7connect_7timeout14warningOptions10completionyAA20PeripheralIdentifierV_AA7TimeoutOAA07WarningE0VSgyAA16ConnectionResultOctF":{"name":"connect(_:timeout:warningOptions:completion:)","abstract":"

    Attempt to connect directly to a known peripheral. The call will fail if Bluetooth is not available, or if Bluejay is already connected. Making a connection request while Bluejay is scanning will also cause Bluejay to stop the current scan for you behind the scene prior to fulfilling your connection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10disconnect9immediate10completionySb_yAA19DisconnectionResultOcSgtF":{"name":"disconnect(immediate:completion:)","abstract":"

    Disconnect a connected peripheral or cancel a connecting peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4read4from10completionyAA24CharacteristicIdentifierV_yAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"read(from:completion:)","abstract":"

    Read from the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5write2to5value4type10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVyAA0J6ResultOctAA8SendableRzlF":{"name":"write(to:value:type:completion:)","abstract":"

    Write to the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC6listen2to20multipleListenOption10completionyAA24CharacteristicIdentifierV_AA08MultipleeF0OyAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"listen(to:multipleListenOption:completion:)","abstract":"

    Listen for notifications on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9endListen2to10completionyAA24CharacteristicIdentifierV_yAA11WriteResultOcSgtF":{"name":"endListen(to:completion:)","abstract":"

    End listening on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isListening2toSbAA24CharacteristicIdentifierV_tKF":{"name":"isListening(to:)","abstract":"

    Check if a peripheral is listening to a specific characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8readRSSIyyKF":{"name":"readRSSI()","abstract":"

    Attempts to read the RSSI (signal strength) of the currently connected peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyyAA22SynchronizedPeripheralCKc_yAA9RunResultOyytGctF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This is the simplest one as the background task will not return any typed values back to the completion block on finishing the background task, except for thrown errors, and it also doesn’t provide an input for an object that might need thread safe access.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyxAA22SynchronizedPeripheralCKc_yAA9RunResultOyxGctlF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run8userData14backgroundTask22completionOnMainThreadyx_q_AA22SynchronizedPeripheralC_xtKcyAA9RunResultOyq_Gctr0_lF":{"name":"run(userData:backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully, as well as supplying an object for thread safe access inside the background task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7combine9sendables10Foundation4DataVSayAA8Sendable_pG_tFZ":{"name":"combine(sendables:)","abstract":"

    A helper function to take an array of Sendables and combine their data together.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManagerDidUpdateState:":{"name":"centralManagerDidUpdateState(_:)","abstract":"

    Bluejay uses this to figure out whether Bluetooth is available or not.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:willRestoreState:":{"name":"centralManager(_:willRestoreState:)","abstract":"

    If Core Bluetooth will restore state, update Bluejay’s internal states to match the states of the Core Bluetooth stack by assigning the peripheral to connectingPeripheral or connectedPeripheral, or niling them out, depending on what the restored CBPeripheral state is.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didConnectPeripheral:":{"name":"centralManager(_:didConnect:)","abstract":"

    When connected, update Bluejay’s states by updating the values for connectingPeripheral, connectedPeripheral, and shouldAutoReconnect. Also, make sure to broadcast the event to observers, and notify the queue so that the current operation in-flight can process this event and get a chance to finish.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDisconnectPeripheral:error:":{"name":"centralManager(_:didDisconnectPeripheral:error:)","abstract":"

    Handle a disconnection event from Core Bluetooth by figuring out what kind of disconnection it is (planned or unplanned), and updating Bluejay’s internal state and sending notifications as appropriate.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didFailToConnectPeripheral:error:":{"name":"centralManager(_:didFailToConnect:error:)","abstract":"

    This mostly happens when either the Bluetooth device or the Core Bluetooth stack somehow only partially completes the negotiation of a connection. For simplicity, Bluejay is currently treating this as a disconnection event, so it can perform all the same clean up logic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDiscoverPeripheral:advertisementData:RSSI:":{"name":"centralManager(_:didDiscover:advertisementData:rssi:)","abstract":"

    This should only be called when the current operation in the queue is a Scan task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html":{"name":"Bluejay","abstract":"

    Bluejay is a simple wrapper around CoreBluetooth that focuses on making a common usage case as straight forward as possible: a single connected peripheral that the user is interacting with regularly (think most personal electronics devices that have an associated iOS app: fitness trackers, guitar amps, etc).

    "},"Classes/SynchronizedPeripheral.html":{"name":"SynchronizedPeripheral","abstract":"

    A synchronous interface to the Bluetooth peripheral, intended to be used inside the backgroundTask block of run(backgroundTask:completionOnMainThread:) to perform multi-part operations without the need for a complicated callback or promise setup.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file diff --git a/docs/docsets/Bluejay.docset/Contents/Resources/docSet.dsidx b/docs/docsets/Bluejay.docset/Contents/Resources/docSet.dsidx index 09deeff61ce1ea5c34f8fe6438e19480f79edd41..a2f28e069ea0a8a54409187a57e47fd88bb4da75 100644 GIT binary patch delta 5657 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 delta 4908 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 GSoKdREl`>O diff --git a/docs/docsets/Bluejay.tgz b/docs/docsets/Bluejay.tgz index 2a07ab6a5fcb5132e8d6b0f6e714a10fc26d0433..9397fde1b945dfe765a87703c8030d6fcb11a736 100644 GIT binary patch literal 132315 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�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 literal 130591 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 Sendable +

  • Write and Assemble
  • Flush Listen
  • CoreBluetooth Migration
  • +
  • Monitor Peripheral Services
  • Features

    @@ -992,6 +996,29 @@

    CoreBluetooth Migration

    Finally, you can check whether Bluejay has been started or stopped using the hasStarted property.

    +

    Monitor Peripheral Services

    + +

    Some peripherals can add or remove services while it’s being used, and Bluejay provides a basic way to react to this. See BluejayHeartSensorDemo and DittojayHeartSensorDemo in the project for more examples.

    +
    bluejay.register(serviceObserver: self)
    +
    +
    func didModifyServices(
    +  from peripheral: PeripheralIdentifier,
    +  invalidatedServices: [ServiceIdentifier]) {
    +    if invalidatedServices.contains(where: { invalidatedServiceIdentifier -> Bool in
    +        invalidatedServiceIdentifier == chirpCharacteristic.service
    +    }) {
    +        endListen(to: chirpCharacteristic)
    +    } else if invalidatedServices.isEmpty {
    +        listen(to: chirpCharacteristic)
    +    }
    +}
    +
    + +

    Notes from Apple:

    + +
    +

    If you previously discovered any of the services that have changed, they are provided in the invalidatedServices parameter and can no longer be used. You can use the discoverServices: method to discover any new services that have been added to the peripheral’s database or to find out whether any of the invalidated services that you were using (and want to continue using) have been added back to a different location in the peripheral’s database.

    +

    API Documentation

    We have more in-depth API documentation for Bluejay using inline documentation and Jazzy.

    @@ -1000,7 +1027,7 @@

    API Documentation

    diff --git a/docs/search.json b/docs/search.json index 0eb592c..1f896b9 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Typealiases.html#/s:7Bluejay17RestoreIdentifiera":{"name":"RestoreIdentifier","abstract":"

    An alias to make it clearer that the string should be some kind of identifier for restoration, and not just any arbitrary string.

    "},"Typealiases.html#/s:7Bluejay13LaunchOptionsa":{"name":"LaunchOptions","abstract":"

    An alias to make it clearer that the dictionary should be the launch options from UIApplicationDelegate.

    "},"Typealiases.html#/s:7Bluejay14ListenCallbacka":{"name":"ListenCallback","abstract":"

    Gives name to a specific callback type used for listens.

    "},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Sensible default warning options: all off in favour of not aggressively notifying the user of changes when the app is backgrounded.

    ","parent_name":"WarningOptions"},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV18notifyOnConnection0dE13Disconnection0dE12NotificationACSb_S2btcfc":{"name":"init(notifyOnConnection:notifyOnDisconnection:notifyOnNotification:)","abstract":"

    Creates a connection options that can specify whether iOS can display a system alert when certain conditions are met while your app is suspended, usually an alert dialog outside of your app in the Home screen for example.

    ","parent_name":"WarningOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV20enableBluetoothAlert17backgroundRestoreACSb_AA010BackgroundH4ModeOtcfc":{"name":"init(enableBluetoothAlert:backgroundRestore:)","abstract":"

    Configurations for starting Bluejay.

    ","parent_name":"StartOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Convenience factory method to avoid having to use the public initializer.

    ","parent_name":"StartOptions"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this service.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSS_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a string. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSo6CBUUIDC_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two ServiceIdentifier.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV20peripheralIdentifierAA010PeripheralE0Vvp":{"name":"peripheralIdentifier","abstract":"

    The unique, persistent identifier associated with the peer.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV19advertisementPacketSDySSypGvp":{"name":"advertisementPacket","abstract":"

    The advertisement packet the discovered peripheral is sending.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV4rssiSivp":{"name":"rssi","abstract":"

    The signal strength of the peripheral discovered.

    ","parent_name":"ScanDiscovery"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    The UUID of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4nameSSvp":{"name":"name","abstract":"

    The name of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns both the name and uuid of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid4nameAC10Foundation4UUIDV_SSSgtcfc":{"name":"init(uuid:name:)","abstract":"

    Create a PeripheralIdentifier using a UUID.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SH9hashValueSivp":{"name":"hashValue","parent_name":"PeripheralIdentifier"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingVyACSicfc":{"name":"init(_:)","abstract":"

    Create empty data.

    ","parent_name":"DataPadding"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingV011toBluetoothB010Foundation0B0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to the Sendable protocol, which allows Bluejay to serialize DataPadding when performing write-related operations.

    ","parent_name":"DataPadding"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV7serviceAA07ServiceC0Vvp":{"name":"service","abstract":"

    The service this characteristic belongs to.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierVyACSo16CBCharacteristicCcfc":{"name":"init(_:)","abstract":"

    Create a CharacteristicIdentifier using a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns the essential description of a characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSS_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a string and a ServiceIdentifier. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSo6CBUUIDC_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a CBUUID and a ServiceIdentifier.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_So16CBCharacteristicCtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between a CharacteristicIdentifier and a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two CharacteristicIdentifiers.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifierSSvp":{"name":"restoreIdentifier","abstract":"

    A restore identifier helps uniquely identify which device is triggering background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV18backgroundRestorerAA0bF0_pvp":{"name":"backgroundRestorer","abstract":"

    A background restorer is required to handle the results of a background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV14listenRestorerAA06ListenF0_pvp":{"name":"listenRestorer","abstract":"

    A listen restorer is required for any potential unhandled listens when restoring to a connected peripheral.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV13launchOptionsSDySo019UIApplicationLaunchF3KeyaypGSgvp":{"name":"launchOptions","abstract":"

    The launch options from application(_:didFinishLaunchingWithOptions:) is required to parse the restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV11centralKeysSaySSGSgvp":{"name":"centralKeys","abstract":"

    Convenience return of bluetooth central keys from the launch options.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV015isRestoringFromB0Sbvp":{"name":"isRestoringFromBackground","abstract":"

    If CoreBluetooth is restoring from background, the bluetooth central keys from launch options will contain the designated restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifier18backgroundRestorer06listenH013launchOptionsACSS_AA0bH0_pAA06ListenH0_pSDySo019UIApplicationLaunchK3KeyaypGSgtcfc":{"name":"init(restoreIdentifier:backgroundRestorer:listenRestorer:launchOptions:)","abstract":"

    Initializes a container for all required configurations necessary to support background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html":{"name":"BackgroundRestoreConfig","abstract":"

    Contains all required configurations for background restoration.

    "},"Structs/CharacteristicIdentifier.html":{"name":"CharacteristicIdentifier","abstract":"

    A wrapper for CBUUID specific to a characteristic to help distinguish it from a CBUUID of a service.

    "},"Structs/DataPadding.html":{"name":"DataPadding","abstract":"

    Helper object that can create empty data to be used as padding in packet construction.

    "},"Structs/PeripheralIdentifier.html":{"name":"PeripheralIdentifier","abstract":"

    Uniquely identifies a peripheral to the current iOS device. The UUID changes and is different on different iOS devices.

    "},"Structs/ScanDiscovery.html":{"name":"ScanDiscovery","abstract":"

    A model capturing what is found from a scan callback.

    "},"Structs/ServiceIdentifier.html":{"name":"ServiceIdentifier","abstract":"

    A wrapper for CBUUID specific to a service to help distinguish it from a CBUUID of a characteristic.

    "},"Structs/StartOptions.html":{"name":"StartOptions","abstract":"

    Wrapper for CBCentralManager initialization configurations when starting a new Bluejay instance.

    "},"Structs/WarningOptions.html":{"name":"WarningOptions","abstract":"

    A connection’s configurations for system alerts.

    "},"Protocols/Sendable.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","abstract":"

    A place to implement your serialization logic.

    ","parent_name":"Sendable"},"Protocols/Receivable.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","abstract":"

    A place to implement your deserialization logic.

    ","parent_name":"Receivable"},"Protocols/RSSIObserver.html#/s:7Bluejay12RSSIObserverP11didReadRSSI4from0E05erroryAA20PeripheralIdentifierV_So8NSNumberCs5Error_pSgtF":{"name":"didReadRSSI(from:RSSI:error:)","abstract":"

    Called whenever a peripheral’s RSSI value changes.

    ","parent_name":"RSSIObserver"},"Protocols/LogObserver.html#/s:7Bluejay11LogObserverP14logFileUpdated4logsySS_tF":{"name":"logFileUpdated(logs:)","abstract":"

    Called whenever the log file is updated.

    ","parent_name":"LogObserver"},"Protocols/ListenRestorer.html#/s:7Bluejay14ListenRestorerP019didReceiveUnhandledB04from2on4withAA0B13RestoreActionOAA20PeripheralIdentifierV_AA014CharacteristicM0V10Foundation4DataVSgtF":{"name":"didReceiveUnhandledListen(from:on:with:)","abstract":"

    Called whenever there is an unhandled listen.

    ","parent_name":"ListenRestorer"},"Protocols/DisconnectHandler.html#/s:7Bluejay17DisconnectHandlerP03didB04from4with13willReconnectAA04AutoH4ModeOAA20PeripheralIdentifierV_s5Error_pSgSbtF":{"name":"didDisconnect(from:with:willReconnect:)","abstract":"

    Notifies the delegate that the peripheral is fully disconnected.

    ","parent_name":"DisconnectHandler"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","abstract":"

    Called whenever Bluetooth availability changes, as well as when an object first subscribes to become a ConnectionObserver.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP9connected2toyAA20PeripheralIdentifierV_tF":{"name":"connected(to:)","abstract":"

    Called whenever a peripheral is connected, as well as when an object first subscribes to become a ConnectionObserver and the peripheral is already connected.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","abstract":"

    Called whenever a peripheral is disconnected.

    ","parent_name":"ConnectionObserver"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP20didRestoreConnection2toAA0bE10CompletionOAA20PeripheralIdentifierV_tF":{"name":"didRestoreConnection(to:)","abstract":"

    Bluejay was able to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP26didFailToRestoreConnection2to5errorAA0bG10CompletionOAA20PeripheralIdentifierV_s5Error_ptF":{"name":"didFailToRestoreConnection(to:error:)","abstract":"

    Bluejay failed to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html":{"name":"BackgroundRestorer","abstract":"

    Protocols for handling the results of a background restoration.

    "},"Protocols/ConnectionObserver.html":{"name":"ConnectionObserver","abstract":"

    A protocol allowing conforming objects registered to Bluejay to optionally respond to Bluetooth connection events.

    "},"Protocols/DisconnectHandler.html":{"name":"DisconnectHandler","abstract":"

    A protocol allowing a single delegate registered to Bluejay to have a final say at the end of a disconnection, as well as evaluate and control the auto-reconnect behaviour.

    "},"Protocols/ListenRestorer.html":{"name":"ListenRestorer","abstract":"

    Protocol for handling a listen event that does not have a callback due to background restoration.

    "},"Protocols/LogObserver.html":{"name":"LogObserver","abstract":"

    A protocol allowing conforming objects to monitor log file changes.

    "},"Protocols/RSSIObserver.html":{"name":"RSSIObserver","abstract":"

    A protocol allowing conforming objects to monitor the RSSI changes of a connected peripheral.

    "},"Protocols/Receivable.html":{"name":"Receivable","abstract":"

    Protocol to indicate that a type can be received from the Bluetooth connection.

    "},"Protocols/Sendable.html":{"name":"Sendable","abstract":"

    Protocol to indicate that a type can be sent via the Bluetooth connection.

    "},"Extensions/String.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","parent_name":"String"},"Extensions/String.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","parent_name":"String"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverServices:":{"name":"peripheral(_:didDiscoverServices:)","abstract":"

    Captures CoreBluetooth’s did discover services event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverCharacteristicsForService:error:":{"name":"peripheral(_:didDiscoverCharacteristicsFor:error:)","abstract":"

    Captures CoreBluetooth’s did discover characteristics event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didWriteValueForCharacteristic:error:":{"name":"peripheral(_:didWriteValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did write to charactersitic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateValueForCharacteristic:error:":{"name":"peripheral(_:didUpdateValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did receive a notification/value from a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateNotificationStateForCharacteristic:error:":{"name":"peripheral(_:didUpdateNotificationStateFor:error:)","abstract":"

    Captures CoreBluetooth’s did turn on or off notification/listening on a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didReadRSSI:error:":{"name":"peripheral(_:didReadRSSI:error:)","abstract":"

    Captures CoreBluetooth’s did read RSSI event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE15toBluetoothData10Foundation0D0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to Sendable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE13bluetoothDatax10Foundation0C0V_tcfc":{"name":"init(bluetoothData:)","abstract":"

    This function is required to conform to Receivable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE7extract5start6lengthxSi_SitKlF":{"name":"extract(start:length:)","abstract":"

    Convenience function to read a range of Data and deserialize it into the specified type.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE011toBluetoothB0ACyF":{"name":"toBluetoothData()","abstract":"

    Allows using Data as is when using Bluejay and working with write-related operations.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE09bluetoothB0A2C_tcfc":{"name":"init(bluetoothData:)","abstract":"

    Allows using Data as is when using Bluejay and working with read-related operations.

    ","parent_name":"Data"},"Extensions/CBService.html#/s:So9CBServiceC7BluejayE14characteristic4withSo16CBCharacteristicCSgSo6CBUUIDC_tF":{"name":"characteristic(with:)","abstract":"

    Find a characteristic on a service by CBUUID.

    ","parent_name":"CBService"},"Extensions/CBPeripheralState.html#/s:So17CBPeripheralStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBPeripheralState as a string.

    ","parent_name":"CBPeripheralState"},"Extensions/CBPeripheral.html#/s:So12CBPeripheralC7BluejayE7service4withSo9CBServiceCSgSo6CBUUIDC_tF":{"name":"service(with:)","abstract":"

    Find a service on a peripheral by CBUUID.

    ","parent_name":"CBPeripheral"},"Extensions/CBManagerState.html#/s:So14CBManagerStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBManagerState as a string.

    ","parent_name":"CBManagerState"},"Extensions/CBManagerState.html":{"name":"CBManagerState"},"Extensions/CBPeripheral.html":{"name":"CBPeripheral"},"Extensions/CBPeripheralState.html":{"name":"CBPeripheralState"},"Extensions/CBService.html":{"name":"CBService"},"Extensions/Data.html":{"name":"Data"},"Extensions/BinaryInteger.html":{"name":"BinaryInteger","abstract":"

    Extension to Int to make it Sendable and Receivable.

    "},"Extensions/Peripheral.html":{"name":"Peripheral"},"Extensions/String.html":{"name":"String","abstract":"

    Make String Sendable and Receivable.

    "},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7successyA2CmF":{"name":"success","abstract":"

    The write is successful.

    ","parent_name":"WriteResult"},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The write has failed unexpectedly with an error.

    ","parent_name":"WriteResult"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3newyAcA0B7OptionsVcACmF":{"name":"new(_:)","abstract":"

    Start Bluejay using a new CBCentralManager.

    ","parent_name":"StartMode"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3useyACSo16CBCentralManagerC_So12CBPeripheralCSgtcACmF":{"name":"use(manager:peripheral:)","abstract":"

    Start Bluejay using an existing CBCentralManager.

    ","parent_name":"StartMode"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO8continueyA2CmF":{"name":"continue","abstract":"

    Continue scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO9blacklistyA2CmF":{"name":"blacklist","abstract":"

    Continue scanning, but don’t discover the same peripheral in the current callback again within the same scan session.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO4stopyA2CmF":{"name":"stop","abstract":"

    Stop scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO7connectyAcA0B9DiscoveryV_AA7TimeoutOAA14WarningOptionsVyAA16ConnectionResultOctcACmF":{"name":"connect(_:_:_:_:)","abstract":"

    Stop scanning, and connect to a discovery.

    ","parent_name":"ScanAction"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The background task is successful, and the returned value is captured in the associated value.

    ","parent_name":"RunResult"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The background task has failed unexpectedly with an error.

    ","parent_name":"RunResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The read is successful and the value read is captured in the associated value.

    ","parent_name":"ReadResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The read has failed unexpectedly with an error.

    ","parent_name":"ReadResult"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO4trapyA2CmF":{"name":"trap","abstract":"

    New listen and its new callback on the same characteristic will not overwrite an existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO11replaceableyA2CmF":{"name":"replaceable","abstract":"

    New listens and its new callback on the same characteristic will replace the existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO18promiseRestorationyA2CmF":{"name":"promiseRestoration","abstract":"

    Bluejay will continue to receive but do nothing with the incoming listen events until a new listener is installed.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO04stopB0yA2CmF":{"name":"stopListen","abstract":"

    Bluejay will attempt to turn off notifications on the peripheral.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO13keepListeningyA2CmF":{"name":"keepListening","abstract":"

    Keep listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO4doneyA2CmF":{"name":"done","abstract":"

    Stop listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20bluetoothUnavailableyA2CmF":{"name":"bluetoothUnavailable","abstract":"

    Bluetooth is either turned off or unavailable.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO24multipleScanNotSupportedyA2CmF":{"name":"multipleScanNotSupported","abstract":"

    Bluejay does not support another scanning request if Bluejay is still scanning.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO27multipleConnectNotSupportedyA2CmF":{"name":"multipleConnectNotSupported","abstract":"

    Bluejay does not support another connection request if Bluejay is already connected or still connecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO30multipleDisconnectNotSupportedyA2CmF":{"name":"multipleDisconnectNotSupported","abstract":"

    Bluejay does not support another disconnection request if Bluejay is still disconnecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18connectionTimedOutyA2CmF":{"name":"connectionTimedOut","abstract":"

    A connection request in Bluejay has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO12notConnectedyA2CmF":{"name":"notConnected","abstract":"

    Bluejay is not connected to a peripheral.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14missingServiceyAcA0D10IdentifierVcACmF":{"name":"missingService(_:)","abstract":"

    A Bluetooth service is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21missingCharacteristicyAcA0D10IdentifierVcACmF":{"name":"missingCharacteristic(_:)","abstract":"

    A Bluetooth characteristic is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO9cancelledyA2CmF":{"name":"cancelled","abstract":"

    A Bluetooth operation is cancelled.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18explicitDisconnectyA2CmF":{"name":"explicitDisconnect","abstract":"

    Bluejay disconnect is called.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedDisconnectyA2CmF":{"name":"unexpectedDisconnect","abstract":"

    Bluejay disconnected unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO16disconnectQueuedyA2CmF":{"name":"disconnectQueued","abstract":"

    A disconnection operation is queued.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14listenTimedOutyA2CmF":{"name":"listenTimedOut","abstract":"

    An attempt to listen on a characteristic has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO10readFailedyA2CmF":{"name":"readFailed","abstract":"

    An attempt to read a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11writeFailedyA2CmF":{"name":"writeFailed","abstract":"

    An attempt to write a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11missingDatayA2CmF":{"name":"missingData","abstract":"

    An attempt to read a value from a characteristic has returned no data unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15dataOutOfBoundsyACSi_S2itcACmF":{"name":"dataOutOfBounds(start:length:count:)","abstract":"

    An attempt to read a range of data has failed due to incorrect bounds or an unexpected length.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedPeripheralyAcA0D10IdentifierVcACmF":{"name":"unexpectedPeripheral(_:)","abstract":"

    An unexpected peripheral is cached and retrieved from CoreBluetooth.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO39allowDuplicatesInBackgroundNotSupportedyA2CmF":{"name":"allowDuplicatesInBackgroundNotSupported","abstract":"

    iOS will not continue scanning in the background if allow duplicates is turned on.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO37missingServiceIdentifiersInBackgroundyA2CmF":{"name":"missingServiceIdentifiersInBackground","abstract":"

    iOS will not continue scanning in the background if no service identifiers are specified.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21backgroundTaskRunningyA2CmF":{"name":"backgroundTaskRunning","abstract":"

    Bluejay does not support further Bluetooth operations while a Bluejay background task is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO34multipleBackgroundTaskNotSupportedyA2CmF":{"name":"multipleBackgroundTaskNotSupported","abstract":"

    Bluejay does not support another Bluejay background task when there is already one that is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15indefiniteFlushyA2CmF":{"name":"indefiniteFlush","abstract":"

    Indefinite flush will not exit.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO7stoppedyA2CmF":{"name":"stopped","abstract":"

    Bluejay has stopped.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO31backgroundRestorationInProgressyA2CmF":{"name":"backgroundRestorationInProgress","abstract":"

    Bluejay cannot perform certain actions when background restoration is still in progress.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO28startupBackgroundTaskExpiredyA2CmF":{"name":"startupBackgroundTaskExpired","abstract":"

    Startup background task has expired during state restoration.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21multipleListenTrappedyA2CmF":{"name":"multipleListenTrapped","abstract":"

    The original listen declared that duplicated listens are not allowed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO22multipleListenReplacedyA2CmF":{"name":"multipleListenReplaced","abstract":"

    The original listen declared that it can be replaced by a new listen.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP11errorDomainSSvpZ":{"name":"errorDomain","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP9errorCodeSivp":{"name":"errorCode","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"BluejayError"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO12disconnectedyAcA20PeripheralIdentifierVcACmF":{"name":"disconnected(_:)","abstract":"

    The disconnection is successful, and the disconnected peripheral is captured in the associated value.

    ","parent_name":"DisconnectionResult"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The disconnection has failed unexpectedly with an error.

    ","parent_name":"DisconnectionResult"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO8noChangeyA2CmF":{"name":"noChange","abstract":"

    Bluejay will maintain its current auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO6changeyACSb_tcACmF":{"name":"change(shouldAutoReconnect:)","abstract":"

    Override Bluejay’s auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7successyAcA20PeripheralIdentifierVcACmF":{"name":"success(_:)","abstract":"

    The connection is successful, and the peripheral connected is captured in the associated value.

    ","parent_name":"ConnectionResult"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The connection has failed unexpectedly with an error.

    ","parent_name":"ConnectionResult"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO7secondsyACSdcACmF":{"name":"seconds(_:)","abstract":"

    Specify a timeout with a duration in seconds.

    ","parent_name":"Timeout"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO4noneyA2CmF":{"name":"none","abstract":"

    Specify there is no timeout.

    ","parent_name":"Timeout"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8callbackyACyyccACmF":{"name":"callback(_:)","abstract":"

    Put required Bluejay API or application calls that are needed after a background restoration inside this callback.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8continueyA2CmF":{"name":"continue","abstract":"

    Return this if no callback is needed after a background restoration.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO7disableyA2CmF":{"name":"disable","abstract":"

    Bluejay will not start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO6enableyAcA0bC6ConfigVcACmF":{"name":"enable(_:)","abstract":"

    Bluejay will start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html":{"name":"BackgroundRestoreMode","abstract":"

    Determines how Bluejay should opt-in to CoreBluetooth state restoration.

    "},"Enums/BackgroundRestoreCompletion.html":{"name":"BackgroundRestoreCompletion","abstract":"

    Allows capturing further Bluejay operations to be queued and executed after background restoration is completed.

    "},"Enums/Timeout.html":{"name":"Timeout","abstract":"

    Types of connection time outs. Can specify a time out in seconds, or no time out.

    "},"Enums/ConnectionResult.html":{"name":"ConnectionResult","abstract":"

    Indicates a successful, cancelled, or failed connection attempt, where the success case contains the peripheral connected to.

    "},"Enums/AutoReconnectMode.html":{"name":"AutoReconnectMode","abstract":"

    Tells Bluejay whether it should auto-reconnect.

    "},"Enums/DisconnectionResult.html":{"name":"DisconnectionResult","abstract":"

    Indicates a successful, cancelled, or failed disconnection attempt, where the success case contains the peripheral disconnected from.

    "},"Enums/BluejayError.html":{"name":"BluejayError","abstract":"

    Errors specific to Bluejay.

    "},"Enums/ListenAction.html":{"name":"ListenAction","abstract":"

    Indicates whether the current listen on a characteristic should continue or end.

    "},"Enums/ListenRestoreAction.html":{"name":"ListenRestoreAction","abstract":"

    Available actions to take on an unhandled listen event from background restoration.

    "},"Enums/MultipleListenOption.html":{"name":"MultipleListenOption","abstract":"

    Ways to handle calling listen on the same characteristic multiple times.

    "},"Enums/ReadResult.html":{"name":"ReadResult","abstract":"

    Indicates a successful, cancelled, or failed read attempt, where the success case contains the value read.

    "},"Enums/RunResult.html":{"name":"RunResult","abstract":"

    Indicates a successful, cancelled, or failed run(backgroundTask:completionOnMainThread:) attempt, where the success case contains the value returned at the end of the background task.

    "},"Enums/ScanAction.html":{"name":"ScanAction","abstract":"

    Indicates whether a scan should continue, continue but blacklist the current discovery, stop, or stop and connect.

    "},"Enums/StartMode.html":{"name":"StartMode","abstract":"

    Specifies whether to start a new Bluejay instance from scratch, or from an existing CoreBluetooth session.

    "},"Enums/WriteResult.html":{"name":"WriteResult","abstract":"

    Indicates a successful, cancelled, or failed write attempt.

    "},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC4read4fromxAA24CharacteristicIdentifierV_tKAA10ReceivableRzlF":{"name":"read(from:)","abstract":"

    Read a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC5write2to5value4typeyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVtKAA8SendableRzlF":{"name":"write(to:value:type:)","abstract":"

    Write a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC12writeAndRead0D2To5value4type8readFromxAA24CharacteristicIdentifierV_q_So25CBCharacteristicWriteTypeVAJtKAA10ReceivableRzAA8SendableR_r0_lF":{"name":"writeAndRead(writeTo:value:type:readFrom:)","abstract":"

    Write to one characterestic then reading a value from another.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC6listen2to7timeout10completionyAA24CharacteristicIdentifierV_AA7TimeoutOAA12ListenActionOxctKAA10ReceivableRzlF":{"name":"listen(to:timeout:completion:)","abstract":"

    Listen for changes on a specified characterstic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC9endListen2to5error10completionyAA24CharacteristicIdentifierV_s5Error_pSgyAA11WriteResultOcSgtKF":{"name":"endListen(to:error:completion:)","abstract":"

    Stop listening to a characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC11flushListen2to14nonZeroTimeout10completionyAA24CharacteristicIdentifierV_AA0I0OyyctKF":{"name":"flushListen(to:nonZeroTimeout:completion:)","abstract":"

    Flush a listen to a characteristic by receiving and discarding values for the specified duration.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC14writeAndListen0D2To5value4type06listenG016timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVALSiAA0F6ActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndListen(writeTo:value:type:listenTo:timeoutInSeconds:completion:)","abstract":"

    Handle a compound operation consisting of writing on one characterstic followed by listening on another for some streamed data.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC16writeAndAssemble0D2To5value06listenG014expectedLength16timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xALS2iAA12ListenActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndAssemble(writeTo:value:listenTo:expectedLength:timeoutInSeconds:completion:)","abstract":"

    Similar to writeAndListen, but use this if you don’t know or don’t have control over how many packets will be sent to you. You still need to know the total size of the data you’re receiving.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC23maximumWriteValueLength3forSiSo016CBCharacteristicE4TypeV_tF":{"name":"maximumWriteValueLength(for:)","abstract":"

    Ask for the peripheral’s maximum payload length in bytes for a single write request.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","parent_name":"SynchronizedPeripheral"},"Classes/Bluejay.html#/s:7BluejayAAC4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    Helps distinguish one Bluejay instance from another.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC20isBluetoothAvailableSbvp":{"name":"isBluetoothAvailable","abstract":"

    Allows checking whether Bluetooth is powered on. Also returns false if Bluejay is not started yet.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBluetoothStateUpdateImminentSbvp":{"name":"isBluetoothStateUpdateImminent","abstract":"

    Allows checking for if CoreBluetooth state is transitional (update is imminent)","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12isConnectingSbvp":{"name":"isConnecting","abstract":"

    Allows checking whether Bluejay is currently connecting to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isConnectedSbvp":{"name":"isConnected","abstract":"

    Allows checking whether Bluejay is currently connected to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC15isDisconnectingSbvp":{"name":"isDisconnecting","abstract":"

    Allows checking whether Bluejay is currently disconnecting from a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC19shouldAutoReconnectSbvp":{"name":"shouldAutoReconnect","abstract":"

    Allowing checking whether Bluejay will automatic reconnect after an unexpected disconnection. Default is true, and Bluejay will also always set this to true on a successful connection to a peripheral. Conversely, Bluejay will always set this to false after an explicit disconnection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10isScanningSbvp":{"name":"isScanning","abstract":"

    Allows checking whether Bluejay is currently scanning.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10hasStartedSbvp":{"name":"hasStarted","abstract":"

    Allows checking whether Bluejay has started and is available for use.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC21defaultWarningOptionsAA0cD0Vvp":{"name":"defaultWarningOptions","abstract":"

    Warning options to use for each new connection if the options are not specified at the creation of those connections.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBackgroundRestorationEnabledSbvp":{"name":"isBackgroundRestorationEnabled","abstract":"

    Allows checking whether Bluejay has background restoration enabled.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3logyySSF":{"name":"log(_:)","abstract":"

    Allow apps that use Bluejay to log alongside of Bluejay’s internal logs.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7getLogsSSSgyF":{"name":"getLogs()","abstract":"

    Get the current content of the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9clearLogsyyF":{"name":"clearLogs()","abstract":"

    Clears the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@M@Bluejay@objc(cs)Bluejay(im)init":{"name":"init()","abstract":"

    Initializing a Bluejay instance will not yet initialize the CoreBluetooth stack. An explicit start call after Bluejay is intialized will then initialize the CoreBluetooth stack and is required because in cases where a state resotration is trying to restore a listen on a characteristic, a listen restorer must be available before the CoreBluetooth stack is re-initialized. This two-step startup allows you to prepare and gaurantee the setup of your listen restorer in between the initialization of Bluejay and the initialization of the CoreBluetooth stack.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5start4modeyAA9StartModeO_tF":{"name":"start(mode:)","abstract":"

    Starting Bluejay will initialize the CoreBluetooth stack. Simply initializing a Bluejay instance without calling this function will not initialize the CoreBluetooth stack. An explicit start call is required so that we can also support proper background restoration, where CoreBluetooth must be initialized in the AppDelegate’s application(_:didFinishLaunchingWithOptions:) for both starting an iOS background task and for parsing the restore identifier.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC28stopAndExtractBluetoothStateSo16CBCentralManagerC7manager_So12CBPeripheralCSg10peripheraltyF":{"name":"stopAndExtractBluetoothState()","abstract":"

    Stops all operations and clears all states in Bluejay before returning a Core Bluetooth state that can then be used by another library or code outside of Bluejay.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC16cancelEverything5error16shouldDisconnectys5Error_p_SbtF":{"name":"cancelEverything(error:shouldDisconnect:)","abstract":"

    This will cancel the current and all pending operations in the Bluejay queue. It will also disconnect by default after the queue is emptied, but you can cancel everything without disconnecting.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register18connectionObserveryAA010ConnectionD0_p_tF":{"name":"register(connectionObserver:)","abstract":"

    Register for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister18connectionObserveryAA010ConnectionD0_p_tF":{"name":"unregister(connectionObserver:)","abstract":"

    Unregister for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register12rssiObserveryAA12RSSIObserver_p_tF":{"name":"register(rssiObserver:)","abstract":"

    Register for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister12rssiObserveryAA12RSSIObserver_p_tF":{"name":"unregister(rssiObserver:)","abstract":"

    Unregister for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register11logObserveryAA03LogD0_p_tF":{"name":"register(logObserver:)","abstract":"

    Register for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister11logObserveryAA03LogD0_p_tF":{"name":"unregister(logObserver:)","abstract":"

    Unregister for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC25registerDisconnectHandler7handleryAA0cD0_p_tF":{"name":"registerDisconnectHandler(handler:)","abstract":"

    Register a single disconnection handler for giving it a final say on what to do at the end of a disconnection, as well as evaluate and control Bluejay’s auto-reconnect behaviour.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC27unregisterDisconnectHandleryyF":{"name":"unregisterDisconnectHandler()","abstract":"

    Remove any registered disconnection handler.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4scan8duration15allowDuplicates17throttleRSSIDelta18serviceIdentifiers9discovery7expired7stoppedySd_SbSiSayAA17ServiceIdentifierVGSgAA10ScanActionOAA0O9DiscoveryV_SayARGtcApR_AStcSgyAS_s5Error_pSgtctF":{"name":"scan(duration:allowDuplicates:throttleRSSIDelta:serviceIdentifiers:discovery:expired:stopped:)","abstract":"

    Scan for the peripheral(s) specified.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12stopScanningyyF":{"name":"stopScanning()","abstract":"

    Stops current or queued scan.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7connect_7timeout14warningOptions10completionyAA20PeripheralIdentifierV_AA7TimeoutOAA07WarningE0VSgyAA16ConnectionResultOctF":{"name":"connect(_:timeout:warningOptions:completion:)","abstract":"

    Attempt to connect directly to a known peripheral. The call will fail if Bluetooth is not available, or if Bluejay is already connected. Making a connection request while Bluejay is scanning will also cause Bluejay to stop the current scan for you behind the scene prior to fulfilling your connection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10disconnect9immediate10completionySb_yAA19DisconnectionResultOcSgtF":{"name":"disconnect(immediate:completion:)","abstract":"

    Disconnect a connected peripheral or cancel a connecting peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4read4from10completionyAA24CharacteristicIdentifierV_yAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"read(from:completion:)","abstract":"

    Read from the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5write2to5value4type10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVyAA0J6ResultOctAA8SendableRzlF":{"name":"write(to:value:type:completion:)","abstract":"

    Write to the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC6listen2to20multipleListenOption10completionyAA24CharacteristicIdentifierV_AA08MultipleeF0OyAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"listen(to:multipleListenOption:completion:)","abstract":"

    Listen for notifications on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9endListen2to10completionyAA24CharacteristicIdentifierV_yAA11WriteResultOcSgtF":{"name":"endListen(to:completion:)","abstract":"

    End listening on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isListening2toSbAA24CharacteristicIdentifierV_tKF":{"name":"isListening(to:)","abstract":"

    Check if a peripheral is listening to a specific characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8readRSSIyyKF":{"name":"readRSSI()","abstract":"

    Attempts to read the RSSI (signal strength) of the currently connected peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyyAA22SynchronizedPeripheralCKc_yAA9RunResultOyytGctF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This is the simplest one as the background task will not return any typed values back to the completion block on finishing the background task, except for thrown errors, and it also doesn’t provide an input for an object that might need thread safe access.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyxAA22SynchronizedPeripheralCKc_yAA9RunResultOyxGctlF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run8userData14backgroundTask22completionOnMainThreadyx_q_AA22SynchronizedPeripheralC_xtKcyAA9RunResultOyq_Gctr0_lF":{"name":"run(userData:backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully, as well as supplying an object for thread safe access inside the background task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7combine9sendables10Foundation4DataVSayAA8Sendable_pG_tFZ":{"name":"combine(sendables:)","abstract":"

    A helper function to take an array of Sendables and combine their data together.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManagerDidUpdateState:":{"name":"centralManagerDidUpdateState(_:)","abstract":"

    Bluejay uses this to figure out whether Bluetooth is available or not.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:willRestoreState:":{"name":"centralManager(_:willRestoreState:)","abstract":"

    If Core Bluetooth will restore state, update Bluejay’s internal states to match the states of the Core Bluetooth stack by assigning the peripheral to connectingPeripheral or connectedPeripheral, or niling them out, depending on what the restored CBPeripheral state is.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didConnectPeripheral:":{"name":"centralManager(_:didConnect:)","abstract":"

    When connected, update Bluejay’s states by updating the values for connectingPeripheral, connectedPeripheral, and shouldAutoReconnect. Also, make sure to broadcast the event to observers, and notify the queue so that the current operation in-flight can process this event and get a chance to finish.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDisconnectPeripheral:error:":{"name":"centralManager(_:didDisconnectPeripheral:error:)","abstract":"

    Handle a disconnection event from Core Bluetooth by figuring out what kind of disconnection it is (planned or unplanned), and updating Bluejay’s internal state and sending notifications as appropriate.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didFailToConnectPeripheral:error:":{"name":"centralManager(_:didFailToConnect:error:)","abstract":"

    This mostly happens when either the Bluetooth device or the Core Bluetooth stack somehow only partially completes the negotiation of a connection. For simplicity, Bluejay is currently treating this as a disconnection event, so it can perform all the same clean up logic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDiscoverPeripheral:advertisementData:RSSI:":{"name":"centralManager(_:didDiscover:advertisementData:rssi:)","abstract":"

    This should only be called when the current operation in the queue is a Scan task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html":{"name":"Bluejay","abstract":"

    Bluejay is a simple wrapper around CoreBluetooth that focuses on making a common usage case as straight forward as possible: a single connected peripheral that the user is interacting with regularly (think most personal electronics devices that have an associated iOS app: fitness trackers, guitar amps, etc).

    "},"Classes/SynchronizedPeripheral.html":{"name":"SynchronizedPeripheral","abstract":"

    A synchronous interface to the Bluetooth peripheral, intended to be used inside the backgroundTask block of run(backgroundTask:completionOnMainThread:) to perform multi-part operations without the need for a complicated callback or promise setup.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file +{"Typealiases.html#/s:7Bluejay17RestoreIdentifiera":{"name":"RestoreIdentifier","abstract":"

    An alias to make it clearer that the string should be some kind of identifier for restoration, and not just any arbitrary string.

    "},"Typealiases.html#/s:7Bluejay13LaunchOptionsa":{"name":"LaunchOptions","abstract":"

    An alias to make it clearer that the dictionary should be the launch options from UIApplicationDelegate.

    "},"Typealiases.html#/s:7Bluejay14ListenCallbacka":{"name":"ListenCallback","abstract":"

    Gives name to a specific callback type used for listens.

    "},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Sensible default warning options: all off in favour of not aggressively notifying the user of changes when the app is backgrounded.

    ","parent_name":"WarningOptions"},"Structs/WarningOptions.html#/s:7Bluejay14WarningOptionsV18notifyOnConnection0dE13Disconnection0dE12NotificationACSb_S2btcfc":{"name":"init(notifyOnConnection:notifyOnDisconnection:notifyOnNotification:)","abstract":"

    Creates a connection options that can specify whether iOS can display a system alert when certain conditions are met while your app is suspended, usually an alert dialog outside of your app in the Home screen for example.

    ","parent_name":"WarningOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV20enableBluetoothAlert17backgroundRestoreACSb_AA010BackgroundH4ModeOtcfc":{"name":"init(enableBluetoothAlert:backgroundRestore:)","abstract":"

    Configurations for starting Bluejay.

    ","parent_name":"StartOptions"},"Structs/StartOptions.html#/s:7Bluejay12StartOptionsV7defaultACvpZ":{"name":"default","abstract":"

    Convenience factory method to avoid having to use the public initializer.

    ","parent_name":"StartOptions"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this service.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSS_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a string. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV4uuidACSo6CBUUIDC_tcfc":{"name":"init(uuid:)","abstract":"

    Create a ServiceIdentifier using a CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two ServiceIdentifier.

    ","parent_name":"ServiceIdentifier"},"Structs/ServiceIdentifier.html#/s:7Bluejay17ServiceIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"ServiceIdentifier"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV20peripheralIdentifierAA010PeripheralE0Vvp":{"name":"peripheralIdentifier","abstract":"

    The unique, persistent identifier associated with the peer.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV19advertisementPacketSDySSypGvp":{"name":"advertisementPacket","abstract":"

    The advertisement packet the discovered peripheral is sending.

    ","parent_name":"ScanDiscovery"},"Structs/ScanDiscovery.html#/s:7Bluejay13ScanDiscoveryV4rssiSivp":{"name":"rssi","abstract":"

    The signal strength of the peripheral discovered.

    ","parent_name":"ScanDiscovery"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    The UUID of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4nameSSvp":{"name":"name","abstract":"

    The name of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns both the name and uuid of the peripheral.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:7Bluejay20PeripheralIdentifierV4uuid4nameAC10Foundation4UUIDV_SSSgtcfc":{"name":"init(uuid:name:)","abstract":"

    Create a PeripheralIdentifier using a UUID.

    ","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"PeripheralIdentifier"},"Structs/PeripheralIdentifier.html#/s:SH9hashValueSivp":{"name":"hashValue","parent_name":"PeripheralIdentifier"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingVyACSicfc":{"name":"init(_:)","abstract":"

    Create empty data.

    ","parent_name":"DataPadding"},"Structs/DataPadding.html#/s:7Bluejay11DataPaddingV011toBluetoothB010Foundation0B0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to the Sendable protocol, which allows Bluejay to serialize DataPadding when performing write-related operations.

    ","parent_name":"DataPadding"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV7serviceAA07ServiceC0Vvp":{"name":"service","abstract":"

    The service this characteristic belongs to.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuidSo6CBUUIDCvp":{"name":"uuid","abstract":"

    The CBUUID of this characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierVyACSo16CBCharacteristicCcfc":{"name":"init(_:)","abstract":"

    Create a CharacteristicIdentifier using a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV11descriptionSSvp":{"name":"description","abstract":"

    Returns the essential description of a characteristic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSS_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a string and a ServiceIdentifier. Please supply a valid 128-bit UUID, or a valid 16 or 32-bit commonly used UUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV4uuid7serviceACSo6CBUUIDC_AA07ServiceC0Vtcfc":{"name":"init(uuid:service:)","abstract":"

    Create a CharacteristicIdentifier using a CBUUID and a ServiceIdentifier.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_So16CBCharacteristicCtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between a CharacteristicIdentifier and a CBCharacterstic.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Check equality between two CharacteristicIdentifiers.

    ","parent_name":"CharacteristicIdentifier"},"Structs/CharacteristicIdentifier.html#/s:7Bluejay24CharacteristicIdentifierV9hashValueSivp":{"name":"hashValue","abstract":"

    The hash value of the CBUUID.

    ","parent_name":"CharacteristicIdentifier"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifierSSvp":{"name":"restoreIdentifier","abstract":"

    A restore identifier helps uniquely identify which device is triggering background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV18backgroundRestorerAA0bF0_pvp":{"name":"backgroundRestorer","abstract":"

    A background restorer is required to handle the results of a background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV14listenRestorerAA06ListenF0_pvp":{"name":"listenRestorer","abstract":"

    A listen restorer is required for any potential unhandled listens when restoring to a connected peripheral.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV13launchOptionsSDySo019UIApplicationLaunchF3KeyaypGSgvp":{"name":"launchOptions","abstract":"

    The launch options from application(_:didFinishLaunchingWithOptions:) is required to parse the restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV11centralKeysSaySSGSgvp":{"name":"centralKeys","abstract":"

    Convenience return of bluetooth central keys from the launch options.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV015isRestoringFromB0Sbvp":{"name":"isRestoringFromBackground","abstract":"

    If CoreBluetooth is restoring from background, the bluetooth central keys from launch options will contain the designated restore identifier.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html#/s:7Bluejay23BackgroundRestoreConfigV17restoreIdentifier18backgroundRestorer06listenH013launchOptionsACSS_AA0bH0_pAA06ListenH0_pSDySo019UIApplicationLaunchK3KeyaypGSgtcfc":{"name":"init(restoreIdentifier:backgroundRestorer:listenRestorer:launchOptions:)","abstract":"

    Initializes a container for all required configurations necessary to support background restoration.

    ","parent_name":"BackgroundRestoreConfig"},"Structs/BackgroundRestoreConfig.html":{"name":"BackgroundRestoreConfig","abstract":"

    Contains all required configurations for background restoration.

    "},"Structs/CharacteristicIdentifier.html":{"name":"CharacteristicIdentifier","abstract":"

    A wrapper for CBUUID specific to a characteristic to help distinguish it from a CBUUID of a service.

    "},"Structs/DataPadding.html":{"name":"DataPadding","abstract":"

    Helper object that can create empty data to be used as padding in packet construction.

    "},"Structs/PeripheralIdentifier.html":{"name":"PeripheralIdentifier","abstract":"

    Uniquely identifies a peripheral to the current iOS device. The UUID changes and is different on different iOS devices.

    "},"Structs/ScanDiscovery.html":{"name":"ScanDiscovery","abstract":"

    A model capturing what is found from a scan callback.

    "},"Structs/ServiceIdentifier.html":{"name":"ServiceIdentifier","abstract":"

    A wrapper for CBUUID specific to a service to help distinguish it from a CBUUID of a characteristic.

    "},"Structs/StartOptions.html":{"name":"StartOptions","abstract":"

    Wrapper for CBCentralManager initialization configurations when starting a new Bluejay instance.

    "},"Structs/WarningOptions.html":{"name":"WarningOptions","abstract":"

    A connection’s configurations for system alerts.

    "},"Protocols/ServiceObserver.html#/s:7Bluejay15ServiceObserverP17didModifyServices4from011invalidatedF0yAA20PeripheralIdentifierV_SayAA0bJ0VGtF":{"name":"didModifyServices(from:invalidatedServices:)","abstract":"

    Called whenever a peripheral’s services change.

    ","parent_name":"ServiceObserver"},"Protocols/Sendable.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","abstract":"

    A place to implement your serialization logic.

    ","parent_name":"Sendable"},"Protocols/Receivable.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","abstract":"

    A place to implement your deserialization logic.

    ","parent_name":"Receivable"},"Protocols/RSSIObserver.html#/s:7Bluejay12RSSIObserverP11didReadRSSI4from0E05erroryAA20PeripheralIdentifierV_So8NSNumberCs5Error_pSgtF":{"name":"didReadRSSI(from:RSSI:error:)","abstract":"

    Called whenever a peripheral’s RSSI value changes.

    ","parent_name":"RSSIObserver"},"Protocols/LogObserver.html#/s:7Bluejay11LogObserverP14logFileUpdated4logsySS_tF":{"name":"logFileUpdated(logs:)","abstract":"

    Called whenever the log file is updated.

    ","parent_name":"LogObserver"},"Protocols/ListenRestorer.html#/s:7Bluejay14ListenRestorerP019didReceiveUnhandledB04from2on4withAA0B13RestoreActionOAA20PeripheralIdentifierV_AA014CharacteristicM0V10Foundation4DataVSgtF":{"name":"didReceiveUnhandledListen(from:on:with:)","abstract":"

    Called whenever there is an unhandled listen.

    ","parent_name":"ListenRestorer"},"Protocols/DisconnectHandler.html#/s:7Bluejay17DisconnectHandlerP03didB04from4with13willReconnectAA04AutoH4ModeOAA20PeripheralIdentifierV_s5Error_pSgSbtF":{"name":"didDisconnect(from:with:willReconnect:)","abstract":"

    Notifies the delegate that the peripheral is fully disconnected.

    ","parent_name":"DisconnectHandler"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","abstract":"

    Called whenever Bluetooth availability changes, as well as when an object first subscribes to become a ConnectionObserver.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP9connected2toyAA20PeripheralIdentifierV_tF":{"name":"connected(to:)","abstract":"

    Called whenever a peripheral is connected, as well as when an object first subscribes to become a ConnectionObserver and the peripheral is already connected.

    ","parent_name":"ConnectionObserver"},"Protocols/ConnectionObserver.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","abstract":"

    Called whenever a peripheral is disconnected.

    ","parent_name":"ConnectionObserver"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP20didRestoreConnection2toAA0bE10CompletionOAA20PeripheralIdentifierV_tF":{"name":"didRestoreConnection(to:)","abstract":"

    Bluejay was able to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html#/s:7Bluejay18BackgroundRestorerP26didFailToRestoreConnection2to5errorAA0bG10CompletionOAA20PeripheralIdentifierV_s5Error_ptF":{"name":"didFailToRestoreConnection(to:error:)","abstract":"

    Bluejay failed to restore a connection.

    ","parent_name":"BackgroundRestorer"},"Protocols/BackgroundRestorer.html":{"name":"BackgroundRestorer","abstract":"

    Protocols for handling the results of a background restoration.

    "},"Protocols/ConnectionObserver.html":{"name":"ConnectionObserver","abstract":"

    A protocol allowing conforming objects registered to Bluejay to optionally respond to Bluetooth connection events.

    "},"Protocols/DisconnectHandler.html":{"name":"DisconnectHandler","abstract":"

    A protocol allowing a single delegate registered to Bluejay to have a final say at the end of a disconnection, as well as evaluate and control the auto-reconnect behaviour.

    "},"Protocols/ListenRestorer.html":{"name":"ListenRestorer","abstract":"

    Protocol for handling a listen event that does not have a callback due to background restoration.

    "},"Protocols/LogObserver.html":{"name":"LogObserver","abstract":"

    A protocol allowing conforming objects to monitor log file changes.

    "},"Protocols/RSSIObserver.html":{"name":"RSSIObserver","abstract":"

    A protocol allowing conforming objects to monitor the RSSI changes of a connected peripheral.

    "},"Protocols/Receivable.html":{"name":"Receivable","abstract":"

    Protocol to indicate that a type can be received from the Bluetooth connection.

    "},"Protocols/Sendable.html":{"name":"Sendable","abstract":"

    Protocol to indicate that a type can be sent via the Bluetooth connection.

    "},"Protocols/ServiceObserver.html":{"name":"ServiceObserver","abstract":"

    A protocol allowing conforming objects to monitor the services changes of a connected peripheral.

    "},"Extensions/String.html#/s:7Bluejay10ReceivableP13bluetoothDatax10Foundation0D0V_tKcfc":{"name":"init(bluetoothData:)","parent_name":"String"},"Extensions/String.html#/s:7Bluejay8SendableP15toBluetoothData10Foundation0E0VyF":{"name":"toBluetoothData()","parent_name":"String"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverServices:":{"name":"peripheral(_:didDiscoverServices:)","abstract":"

    Captures CoreBluetooth’s did discover services event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didDiscoverCharacteristicsForService:error:":{"name":"peripheral(_:didDiscoverCharacteristicsFor:error:)","abstract":"

    Captures CoreBluetooth’s did discover characteristics event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didWriteValueForCharacteristic:error:":{"name":"peripheral(_:didWriteValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did write to charactersitic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateValueForCharacteristic:error:":{"name":"peripheral(_:didUpdateValueFor:error:)","abstract":"

    Captures CoreBluetooth’s did receive a notification/value from a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didUpdateNotificationStateForCharacteristic:error:":{"name":"peripheral(_:didUpdateNotificationStateFor:error:)","abstract":"

    Captures CoreBluetooth’s did turn on or off notification/listening on a characteristic event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didReadRSSI:error:":{"name":"peripheral(_:didReadRSSI:error:)","abstract":"

    Captures CoreBluetooth’s did read RSSI event and pass it to Bluejay’s queue for processing.

    ","parent_name":"Peripheral"},"Extensions/Peripheral.html#/c:@CM@Bluejay@objc(cs)Peripheral(im)peripheral:didModifyServices:":{"name":"peripheral(_:didModifyServices:)","abstract":"

    Called when the peripheral removed or added services.

    ","parent_name":"Peripheral"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE15toBluetoothData10Foundation0D0VyF":{"name":"toBluetoothData()","abstract":"

    This function is required to conform to Sendable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/BinaryInteger.html#/s:Sz7BluejayE13bluetoothDatax10Foundation0C0V_tcfc":{"name":"init(bluetoothData:)","abstract":"

    This function is required to conform to Receivable, and figures out the size of the Integer used by the iOS device.

    ","parent_name":"BinaryInteger"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE7extract5start6lengthxSi_SitKlF":{"name":"extract(start:length:)","abstract":"

    Convenience function to read a range of Data and deserialize it into the specified type.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE011toBluetoothB0ACyF":{"name":"toBluetoothData()","abstract":"

    Allows using Data as is when using Bluejay and working with write-related operations.

    ","parent_name":"Data"},"Extensions/Data.html#/s:10Foundation4DataV7BluejayE09bluetoothB0A2C_tcfc":{"name":"init(bluetoothData:)","abstract":"

    Allows using Data as is when using Bluejay and working with read-related operations.

    ","parent_name":"Data"},"Extensions/CBService.html#/s:So9CBServiceC7BluejayE14characteristic4withSo16CBCharacteristicCSgSo6CBUUIDC_tF":{"name":"characteristic(with:)","abstract":"

    Find a characteristic on a service by CBUUID.

    ","parent_name":"CBService"},"Extensions/CBPeripheralState.html#/s:So17CBPeripheralStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBPeripheralState as a string.

    ","parent_name":"CBPeripheralState"},"Extensions/CBPeripheral.html#/s:So12CBPeripheralC7BluejayE7service4withSo9CBServiceCSgSo6CBUUIDC_tF":{"name":"service(with:)","abstract":"

    Find a service on a peripheral by CBUUID.

    ","parent_name":"CBPeripheral"},"Extensions/CBManagerState.html#/s:So14CBManagerStateV7BluejayE6stringSSyF":{"name":"string()","abstract":"

    Returns the name of a CBManagerState as a string.

    ","parent_name":"CBManagerState"},"Extensions/CBManagerState.html":{"name":"CBManagerState"},"Extensions/CBPeripheral.html":{"name":"CBPeripheral"},"Extensions/CBPeripheralState.html":{"name":"CBPeripheralState"},"Extensions/CBService.html":{"name":"CBService"},"Extensions/Data.html":{"name":"Data"},"Extensions/BinaryInteger.html":{"name":"BinaryInteger","abstract":"

    Extension to Int to make it Sendable and Receivable.

    "},"Extensions/Peripheral.html":{"name":"Peripheral"},"Extensions/String.html":{"name":"String","abstract":"

    Make String Sendable and Receivable.

    "},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7successyA2CmF":{"name":"success","abstract":"

    The write is successful.

    ","parent_name":"WriteResult"},"Enums/WriteResult.html#/s:7Bluejay11WriteResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The write has failed unexpectedly with an error.

    ","parent_name":"WriteResult"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3newyAcA0B7OptionsVcACmF":{"name":"new(_:)","abstract":"

    Start Bluejay using a new CBCentralManager.

    ","parent_name":"StartMode"},"Enums/StartMode.html#/s:7Bluejay9StartModeO3useyACSo16CBCentralManagerC_So12CBPeripheralCSgtcACmF":{"name":"use(manager:peripheral:)","abstract":"

    Start Bluejay using an existing CBCentralManager.

    ","parent_name":"StartMode"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO8continueyA2CmF":{"name":"continue","abstract":"

    Continue scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO9blacklistyA2CmF":{"name":"blacklist","abstract":"

    Continue scanning, but don’t discover the same peripheral in the current callback again within the same scan session.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO4stopyA2CmF":{"name":"stop","abstract":"

    Stop scanning.

    ","parent_name":"ScanAction"},"Enums/ScanAction.html#/s:7Bluejay10ScanActionO7connectyAcA0B9DiscoveryV_AA7TimeoutOAA14WarningOptionsVyAA16ConnectionResultOctcACmF":{"name":"connect(_:_:_:_:)","abstract":"

    Stop scanning, and connect to a discovery.

    ","parent_name":"ScanAction"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The background task is successful, and the returned value is captured in the associated value.

    ","parent_name":"RunResult"},"Enums/RunResult.html#/s:7Bluejay9RunResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The background task has failed unexpectedly with an error.

    ","parent_name":"RunResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7successyACyxGxcAEmlF":{"name":"success(_:)","abstract":"

    The read is successful and the value read is captured in the associated value.

    ","parent_name":"ReadResult"},"Enums/ReadResult.html#/s:7Bluejay10ReadResultO7failureyACyxGs5Error_pcAEmlF":{"name":"failure(_:)","abstract":"

    The read has failed unexpectedly with an error.

    ","parent_name":"ReadResult"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO4trapyA2CmF":{"name":"trap","abstract":"

    New listen and its new callback on the same characteristic will not overwrite an existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/MultipleListenOption.html#/s:7Bluejay20MultipleListenOptionO11replaceableyA2CmF":{"name":"replaceable","abstract":"

    New listens and its new callback on the same characteristic will replace the existing listen.

    ","parent_name":"MultipleListenOption"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO18promiseRestorationyA2CmF":{"name":"promiseRestoration","abstract":"

    Bluejay will continue to receive but do nothing with the incoming listen events until a new listener is installed.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenRestoreAction.html#/s:7Bluejay19ListenRestoreActionO04stopB0yA2CmF":{"name":"stopListen","abstract":"

    Bluejay will attempt to turn off notifications on the peripheral.

    ","parent_name":"ListenRestoreAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO13keepListeningyA2CmF":{"name":"keepListening","abstract":"

    Keep listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/ListenAction.html#/s:7Bluejay12ListenActionO4doneyA2CmF":{"name":"done","abstract":"

    Stop listening to the characteristic.

    ","parent_name":"ListenAction"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20bluetoothUnavailableyA2CmF":{"name":"bluetoothUnavailable","abstract":"

    Bluetooth is either turned off or unavailable.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO24multipleScanNotSupportedyA2CmF":{"name":"multipleScanNotSupported","abstract":"

    Bluejay does not support another scanning request if Bluejay is still scanning.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO27multipleConnectNotSupportedyA2CmF":{"name":"multipleConnectNotSupported","abstract":"

    Bluejay does not support another connection request if Bluejay is already connected or still connecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO30multipleDisconnectNotSupportedyA2CmF":{"name":"multipleDisconnectNotSupported","abstract":"

    Bluejay does not support another disconnection request if Bluejay is still disconnecting.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18connectionTimedOutyA2CmF":{"name":"connectionTimedOut","abstract":"

    A connection request in Bluejay has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO12notConnectedyA2CmF":{"name":"notConnected","abstract":"

    Bluejay is not connected to a peripheral.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14missingServiceyAcA0D10IdentifierVcACmF":{"name":"missingService(_:)","abstract":"

    A Bluetooth service is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21missingCharacteristicyAcA0D10IdentifierVcACmF":{"name":"missingCharacteristic(_:)","abstract":"

    A Bluetooth characteristic is not found.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO9cancelledyA2CmF":{"name":"cancelled","abstract":"

    A Bluetooth operation is cancelled.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO18explicitDisconnectyA2CmF":{"name":"explicitDisconnect","abstract":"

    Bluejay disconnect is called.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedDisconnectyA2CmF":{"name":"unexpectedDisconnect","abstract":"

    Bluejay disconnected unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO16disconnectQueuedyA2CmF":{"name":"disconnectQueued","abstract":"

    A disconnection operation is queued.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO14listenTimedOutyA2CmF":{"name":"listenTimedOut","abstract":"

    An attempt to listen on a characteristic has timed out.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO10readFailedyA2CmF":{"name":"readFailed","abstract":"

    An attempt to read a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11writeFailedyA2CmF":{"name":"writeFailed","abstract":"

    An attempt to write a characteristic has failed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO11missingDatayA2CmF":{"name":"missingData","abstract":"

    An attempt to read a value from a characteristic has returned no data unexpectedly.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15dataOutOfBoundsyACSi_S2itcACmF":{"name":"dataOutOfBounds(start:length:count:)","abstract":"

    An attempt to read a range of data has failed due to incorrect bounds or an unexpected length.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO20unexpectedPeripheralyAcA0D10IdentifierVcACmF":{"name":"unexpectedPeripheral(_:)","abstract":"

    An unexpected peripheral is cached and retrieved from CoreBluetooth.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO39allowDuplicatesInBackgroundNotSupportedyA2CmF":{"name":"allowDuplicatesInBackgroundNotSupported","abstract":"

    iOS will not continue scanning in the background if allow duplicates is turned on.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO37missingServiceIdentifiersInBackgroundyA2CmF":{"name":"missingServiceIdentifiersInBackground","abstract":"

    iOS will not continue scanning in the background if no service identifiers are specified.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21backgroundTaskRunningyA2CmF":{"name":"backgroundTaskRunning","abstract":"

    Bluejay does not support further Bluetooth operations while a Bluejay background task is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO34multipleBackgroundTaskNotSupportedyA2CmF":{"name":"multipleBackgroundTaskNotSupported","abstract":"

    Bluejay does not support another Bluejay background task when there is already one that is still running.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO15indefiniteFlushyA2CmF":{"name":"indefiniteFlush","abstract":"

    Indefinite flush will not exit.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO7stoppedyA2CmF":{"name":"stopped","abstract":"

    Bluejay has stopped.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO31backgroundRestorationInProgressyA2CmF":{"name":"backgroundRestorationInProgress","abstract":"

    Bluejay cannot perform certain actions when background restoration is still in progress.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO28startupBackgroundTaskExpiredyA2CmF":{"name":"startupBackgroundTaskExpired","abstract":"

    Startup background task has expired during state restoration.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO21multipleListenTrappedyA2CmF":{"name":"multipleListenTrapped","abstract":"

    The original listen declared that duplicated listens are not allowed.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:7Bluejay0A5ErrorO22multipleListenReplacedyA2CmF":{"name":"multipleListenReplaced","abstract":"

    The original listen declared that it can be replaced by a new listen.

    ","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP11errorDomainSSvpZ":{"name":"errorDomain","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP9errorCodeSivp":{"name":"errorCode","parent_name":"BluejayError"},"Enums/BluejayError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"BluejayError"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO12disconnectedyAcA20PeripheralIdentifierVcACmF":{"name":"disconnected(_:)","abstract":"

    The disconnection is successful, and the disconnected peripheral is captured in the associated value.

    ","parent_name":"DisconnectionResult"},"Enums/DisconnectionResult.html#/s:7Bluejay19DisconnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The disconnection has failed unexpectedly with an error.

    ","parent_name":"DisconnectionResult"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO8noChangeyA2CmF":{"name":"noChange","abstract":"

    Bluejay will maintain its current auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/AutoReconnectMode.html#/s:7Bluejay17AutoReconnectModeO6changeyACSb_tcACmF":{"name":"change(shouldAutoReconnect:)","abstract":"

    Override Bluejay’s auto-reconnect behaviour.

    ","parent_name":"AutoReconnectMode"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7successyAcA20PeripheralIdentifierVcACmF":{"name":"success(_:)","abstract":"

    The connection is successful, and the peripheral connected is captured in the associated value.

    ","parent_name":"ConnectionResult"},"Enums/ConnectionResult.html#/s:7Bluejay16ConnectionResultO7failureyACs5Error_pcACmF":{"name":"failure(_:)","abstract":"

    The connection has failed unexpectedly with an error.

    ","parent_name":"ConnectionResult"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO7secondsyACSdcACmF":{"name":"seconds(_:)","abstract":"

    Specify a timeout with a duration in seconds.

    ","parent_name":"Timeout"},"Enums/Timeout.html#/s:7Bluejay7TimeoutO4noneyA2CmF":{"name":"none","abstract":"

    Specify there is no timeout.

    ","parent_name":"Timeout"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8callbackyACyyccACmF":{"name":"callback(_:)","abstract":"

    Put required Bluejay API or application calls that are needed after a background restoration inside this callback.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreCompletion.html#/s:7Bluejay27BackgroundRestoreCompletionO8continueyA2CmF":{"name":"continue","abstract":"

    Return this if no callback is needed after a background restoration.

    ","parent_name":"BackgroundRestoreCompletion"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO7disableyA2CmF":{"name":"disable","abstract":"

    Bluejay will not start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html#/s:7Bluejay21BackgroundRestoreModeO6enableyAcA0bC6ConfigVcACmF":{"name":"enable(_:)","abstract":"

    Bluejay will start CoreBluetooth with state restoration.

    ","parent_name":"BackgroundRestoreMode"},"Enums/BackgroundRestoreMode.html":{"name":"BackgroundRestoreMode","abstract":"

    Determines how Bluejay should opt-in to CoreBluetooth state restoration.

    "},"Enums/BackgroundRestoreCompletion.html":{"name":"BackgroundRestoreCompletion","abstract":"

    Allows capturing further Bluejay operations to be queued and executed after background restoration is completed.

    "},"Enums/Timeout.html":{"name":"Timeout","abstract":"

    Types of connection time outs. Can specify a time out in seconds, or no time out.

    "},"Enums/ConnectionResult.html":{"name":"ConnectionResult","abstract":"

    Indicates a successful, cancelled, or failed connection attempt, where the success case contains the peripheral connected to.

    "},"Enums/AutoReconnectMode.html":{"name":"AutoReconnectMode","abstract":"

    Tells Bluejay whether it should auto-reconnect.

    "},"Enums/DisconnectionResult.html":{"name":"DisconnectionResult","abstract":"

    Indicates a successful, cancelled, or failed disconnection attempt, where the success case contains the peripheral disconnected from.

    "},"Enums/BluejayError.html":{"name":"BluejayError","abstract":"

    Errors specific to Bluejay.

    "},"Enums/ListenAction.html":{"name":"ListenAction","abstract":"

    Indicates whether the current listen on a characteristic should continue or end.

    "},"Enums/ListenRestoreAction.html":{"name":"ListenRestoreAction","abstract":"

    Available actions to take on an unhandled listen event from background restoration.

    "},"Enums/MultipleListenOption.html":{"name":"MultipleListenOption","abstract":"

    Ways to handle calling listen on the same characteristic multiple times.

    "},"Enums/ReadResult.html":{"name":"ReadResult","abstract":"

    Indicates a successful, cancelled, or failed read attempt, where the success case contains the value read.

    "},"Enums/RunResult.html":{"name":"RunResult","abstract":"

    Indicates a successful, cancelled, or failed run(backgroundTask:completionOnMainThread:) attempt, where the success case contains the value returned at the end of the background task.

    "},"Enums/ScanAction.html":{"name":"ScanAction","abstract":"

    Indicates whether a scan should continue, continue but blacklist the current discovery, stop, or stop and connect.

    "},"Enums/StartMode.html":{"name":"StartMode","abstract":"

    Specifies whether to start a new Bluejay instance from scratch, or from an existing CoreBluetooth session.

    "},"Enums/WriteResult.html":{"name":"WriteResult","abstract":"

    Indicates a successful, cancelled, or failed write attempt.

    "},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC4read4fromxAA24CharacteristicIdentifierV_tKAA10ReceivableRzlF":{"name":"read(from:)","abstract":"

    Read a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC5write2to5value4typeyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVtKAA8SendableRzlF":{"name":"write(to:value:type:)","abstract":"

    Write a value from the specified characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC12writeAndRead0D2To5value4type8readFromxAA24CharacteristicIdentifierV_q_So25CBCharacteristicWriteTypeVAJtKAA10ReceivableRzAA8SendableR_r0_lF":{"name":"writeAndRead(writeTo:value:type:readFrom:)","abstract":"

    Write to one characterestic then reading a value from another.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC6listen2to7timeout10completionyAA24CharacteristicIdentifierV_AA7TimeoutOAA12ListenActionOxctKAA10ReceivableRzlF":{"name":"listen(to:timeout:completion:)","abstract":"

    Listen for changes on a specified characterstic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC9endListen2to5error10completionyAA24CharacteristicIdentifierV_s5Error_pSgyAA11WriteResultOcSgtKF":{"name":"endListen(to:error:completion:)","abstract":"

    Stop listening to a characteristic synchronously.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC11flushListen2to14nonZeroTimeout10completionyAA24CharacteristicIdentifierV_AA0I0OyyctKF":{"name":"flushListen(to:nonZeroTimeout:completion:)","abstract":"

    Flush a listen to a characteristic by receiving and discarding values for the specified duration.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC14writeAndListen0D2To5value4type06listenG016timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVALSiAA0F6ActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndListen(writeTo:value:type:listenTo:timeoutInSeconds:completion:)","abstract":"

    Handle a compound operation consisting of writing on one characterstic followed by listening on another for some streamed data.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC16writeAndAssemble0D2To5value06listenG014expectedLength16timeoutInSeconds10completionyAA24CharacteristicIdentifierV_xALS2iAA12ListenActionOq_ctKAA8SendableRzAA10ReceivableR_r0_lF":{"name":"writeAndAssemble(writeTo:value:listenTo:expectedLength:timeoutInSeconds:completion:)","abstract":"

    Similar to writeAndListen, but use this if you don’t know or don’t have control over how many packets will be sent to you. You still need to know the total size of the data you’re receiving.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay22SynchronizedPeripheralC23maximumWriteValueLength3forSiSo016CBCharacteristicE4TypeV_tF":{"name":"maximumWriteValueLength(for:)","abstract":"

    Ask for the peripheral’s maximum payload length in bytes for a single write request.

    ","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP18bluetoothAvailableyySbF":{"name":"bluetoothAvailable(_:)","parent_name":"SynchronizedPeripheral"},"Classes/SynchronizedPeripheral.html#/s:7Bluejay18ConnectionObserverP12disconnected4fromyAA20PeripheralIdentifierV_tF":{"name":"disconnected(from:)","parent_name":"SynchronizedPeripheral"},"Classes/Bluejay.html#/s:7BluejayAAC4uuid10Foundation4UUIDVvp":{"name":"uuid","abstract":"

    Helps distinguish one Bluejay instance from another.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC20isBluetoothAvailableSbvp":{"name":"isBluetoothAvailable","abstract":"

    Allows checking whether Bluetooth is powered on. Also returns false if Bluejay is not started yet.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBluetoothStateUpdateImminentSbvp":{"name":"isBluetoothStateUpdateImminent","abstract":"

    Allows checking for if CoreBluetooth state is transitional (update is imminent)","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12isConnectingSbvp":{"name":"isConnecting","abstract":"

    Allows checking whether Bluejay is currently connecting to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isConnectedSbvp":{"name":"isConnected","abstract":"

    Allows checking whether Bluejay is currently connected to a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC15isDisconnectingSbvp":{"name":"isDisconnecting","abstract":"

    Allows checking whether Bluejay is currently disconnecting from a peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC19shouldAutoReconnectSbvp":{"name":"shouldAutoReconnect","abstract":"

    Allowing checking whether Bluejay will automatic reconnect after an unexpected disconnection. Default is true, and Bluejay will also always set this to true on a successful connection to a peripheral. Conversely, Bluejay will always set this to false after an explicit disconnection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10isScanningSbvp":{"name":"isScanning","abstract":"

    Allows checking whether Bluejay is currently scanning.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10hasStartedSbvp":{"name":"hasStarted","abstract":"

    Allows checking whether Bluejay has started and is available for use.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC21defaultWarningOptionsAA0cD0Vvp":{"name":"defaultWarningOptions","abstract":"

    Warning options to use for each new connection if the options are not specified at the creation of those connections.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC30isBackgroundRestorationEnabledSbvp":{"name":"isBackgroundRestorationEnabled","abstract":"

    Allows checking whether Bluejay has background restoration enabled.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3logyySSF":{"name":"log(_:)","abstract":"

    Allow apps that use Bluejay to log alongside of Bluejay’s internal logs.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7getLogsSSSgyF":{"name":"getLogs()","abstract":"

    Get the current content of the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9clearLogsyyF":{"name":"clearLogs()","abstract":"

    Clears the log file.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@M@Bluejay@objc(cs)Bluejay(im)init":{"name":"init()","abstract":"

    Initializing a Bluejay instance will not yet initialize the CoreBluetooth stack. An explicit start call after Bluejay is intialized will then initialize the CoreBluetooth stack and is required because in cases where a state resotration is trying to restore a listen on a characteristic, a listen restorer must be available before the CoreBluetooth stack is re-initialized. This two-step startup allows you to prepare and gaurantee the setup of your listen restorer in between the initialization of Bluejay and the initialization of the CoreBluetooth stack.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5start4modeyAA9StartModeO_tF":{"name":"start(mode:)","abstract":"

    Starting Bluejay will initialize the CoreBluetooth stack. Simply initializing a Bluejay instance without calling this function will not initialize the CoreBluetooth stack. An explicit start call is required so that we can also support proper background restoration, where CoreBluetooth must be initialized in the AppDelegate’s application(_:didFinishLaunchingWithOptions:) for both starting an iOS background task and for parsing the restore identifier.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC28stopAndExtractBluetoothStateSo16CBCentralManagerC7manager_So12CBPeripheralCSg10peripheraltyF":{"name":"stopAndExtractBluetoothState()","abstract":"

    Stops all operations and clears all states in Bluejay before returning a Core Bluetooth state that can then be used by another library or code outside of Bluejay.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC16cancelEverything5error16shouldDisconnectys5Error_p_SbtF":{"name":"cancelEverything(error:shouldDisconnect:)","abstract":"

    This will cancel the current and all pending operations in the Bluejay queue. It will also disconnect by default after the queue is emptied, but you can cancel everything without disconnecting.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register18connectionObserveryAA010ConnectionD0_p_tF":{"name":"register(connectionObserver:)","abstract":"

    Register for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister18connectionObserveryAA010ConnectionD0_p_tF":{"name":"unregister(connectionObserver:)","abstract":"

    Unregister for notifications on Bluetooth connection events and state changes. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register12rssiObserveryAA12RSSIObserver_p_tF":{"name":"register(rssiObserver:)","abstract":"

    Register for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister12rssiObserveryAA12RSSIObserver_p_tF":{"name":"unregister(rssiObserver:)","abstract":"

    Unregister for notifications when readRSSI is called. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register15serviceObserveryAA07ServiceD0_p_tF":{"name":"register(serviceObserver:)","abstract":"

    Register for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister15serviceObserveryAA07ServiceD0_p_tF":{"name":"unregister(serviceObserver:)","abstract":"

    Unregister for notifications when a connected peripheral’s services change. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8register11logObserveryAA03LogD0_p_tF":{"name":"register(logObserver:)","abstract":"

    Register for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10unregister11logObserveryAA03LogD0_p_tF":{"name":"unregister(logObserver:)","abstract":"

    Unregister for notifications when the log file is updated. Unregistering is not required, Bluejay will unregister for you if the observer is no longer in memory.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC25registerDisconnectHandler7handleryAA0cD0_p_tF":{"name":"registerDisconnectHandler(handler:)","abstract":"

    Register a single disconnection handler for giving it a final say on what to do at the end of a disconnection, as well as evaluate and control Bluejay’s auto-reconnect behaviour.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC27unregisterDisconnectHandleryyF":{"name":"unregisterDisconnectHandler()","abstract":"

    Remove any registered disconnection handler.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4scan8duration15allowDuplicates17throttleRSSIDelta18serviceIdentifiers9discovery7expired7stoppedySd_SbSiSayAA17ServiceIdentifierVGSgAA10ScanActionOAA0O9DiscoveryV_SayARGtcApR_AStcSgyAS_s5Error_pSgtctF":{"name":"scan(duration:allowDuplicates:throttleRSSIDelta:serviceIdentifiers:discovery:expired:stopped:)","abstract":"

    Scan for the peripheral(s) specified.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC12stopScanningyyF":{"name":"stopScanning()","abstract":"

    Stops current or queued scan.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7connect_7timeout14warningOptions10completionyAA20PeripheralIdentifierV_AA7TimeoutOAA07WarningE0VSgyAA16ConnectionResultOctF":{"name":"connect(_:timeout:warningOptions:completion:)","abstract":"

    Attempt to connect directly to a known peripheral. The call will fail if Bluetooth is not available, or if Bluejay is already connected. Making a connection request while Bluejay is scanning will also cause Bluejay to stop the current scan for you behind the scene prior to fulfilling your connection request.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC10disconnect9immediate10completionySb_yAA19DisconnectionResultOcSgtF":{"name":"disconnect(immediate:completion:)","abstract":"

    Disconnect a connected peripheral or cancel a connecting peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC4read4from10completionyAA24CharacteristicIdentifierV_yAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"read(from:completion:)","abstract":"

    Read from the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC5write2to5value4type10completionyAA24CharacteristicIdentifierV_xSo25CBCharacteristicWriteTypeVyAA0J6ResultOctAA8SendableRzlF":{"name":"write(to:value:type:completion:)","abstract":"

    Write to the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC6listen2to20multipleListenOption10completionyAA24CharacteristicIdentifierV_AA08MultipleeF0OyAA10ReadResultOyxGctAA10ReceivableRzlF":{"name":"listen(to:multipleListenOption:completion:)","abstract":"

    Listen for notifications on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC9endListen2to10completionyAA24CharacteristicIdentifierV_yAA11WriteResultOcSgtF":{"name":"endListen(to:completion:)","abstract":"

    End listening on the specified characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC11isListening2toSbAA24CharacteristicIdentifierV_tKF":{"name":"isListening(to:)","abstract":"

    Check if a peripheral is listening to a specific characteristic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC8readRSSIyyKF":{"name":"readRSSI()","abstract":"

    Attempts to read the RSSI (signal strength) of the currently connected peripheral.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyyAA22SynchronizedPeripheralCKc_yAA9RunResultOyytGctF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This is the simplest one as the background task will not return any typed values back to the completion block on finishing the background task, except for thrown errors, and it also doesn’t provide an input for an object that might need thread safe access.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run14backgroundTask22completionOnMainThreadyxAA22SynchronizedPeripheralCKc_yAA9RunResultOyxGctlF":{"name":"run(backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC3run8userData14backgroundTask22completionOnMainThreadyx_q_AA22SynchronizedPeripheralC_xtKcyAA9RunResultOyq_Gctr0_lF":{"name":"run(userData:backgroundTask:completionOnMainThread:)","abstract":"

    One of the three ways to run a background task using a synchronous interface to the Bluetooth peripheral. This one allows the background task to potentially return a typed value back to the completion block on finishing the background task successfully, as well as supplying an object for thread safe access inside the background task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/s:7BluejayAAC7combine9sendables10Foundation4DataVSayAA8Sendable_pG_tFZ":{"name":"combine(sendables:)","abstract":"

    A helper function to take an array of Sendables and combine their data together.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManagerDidUpdateState:":{"name":"centralManagerDidUpdateState(_:)","abstract":"

    Bluejay uses this to figure out whether Bluetooth is available or not.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:willRestoreState:":{"name":"centralManager(_:willRestoreState:)","abstract":"

    If Core Bluetooth will restore state, update Bluejay’s internal states to match the states of the Core Bluetooth stack by assigning the peripheral to connectingPeripheral or connectedPeripheral, or niling them out, depending on what the restored CBPeripheral state is.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didConnectPeripheral:":{"name":"centralManager(_:didConnect:)","abstract":"

    When connected, update Bluejay’s states by updating the values for connectingPeripheral, connectedPeripheral, and shouldAutoReconnect. Also, make sure to broadcast the event to observers, and notify the queue so that the current operation in-flight can process this event and get a chance to finish.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDisconnectPeripheral:error:":{"name":"centralManager(_:didDisconnectPeripheral:error:)","abstract":"

    Handle a disconnection event from Core Bluetooth by figuring out what kind of disconnection it is (planned or unplanned), and updating Bluejay’s internal state and sending notifications as appropriate.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didFailToConnectPeripheral:error:":{"name":"centralManager(_:didFailToConnect:error:)","abstract":"

    This mostly happens when either the Bluetooth device or the Core Bluetooth stack somehow only partially completes the negotiation of a connection. For simplicity, Bluejay is currently treating this as a disconnection event, so it can perform all the same clean up logic.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html#/c:@CM@Bluejay@objc(cs)Bluejay(im)centralManager:didDiscoverPeripheral:advertisementData:RSSI:":{"name":"centralManager(_:didDiscover:advertisementData:rssi:)","abstract":"

    This should only be called when the current operation in the queue is a Scan task.

    ","parent_name":"Bluejay"},"Classes/Bluejay.html":{"name":"Bluejay","abstract":"

    Bluejay is a simple wrapper around CoreBluetooth that focuses on making a common usage case as straight forward as possible: a single connected peripheral that the user is interacting with regularly (think most personal electronics devices that have an associated iOS app: fitness trackers, guitar amps, etc).

    "},"Classes/SynchronizedPeripheral.html":{"name":"SynchronizedPeripheral","abstract":"

    A synchronous interface to the Bluetooth peripheral, intended to be used inside the backgroundTask block of run(backgroundTask:completionOnMainThread:) to perform multi-part operations without the need for a complicated callback or promise setup.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file