Core Bluetooth είναι το πλαίσιο της Apple για αλληλεπίδραση με Bluetooth Low Energy σε iOS, iPadOS και macOS. Το πλαίσιο παρέχει ένα πλήρες σύνολο API για εργασία και στους δύο ρόλους BLE: κεντρική συσκευή (CBCentralManager) για σάρωση και σύνδεση με περιφερειακές συσκευές, και περιφερειακή συσκευή (CBPeripheralManager) για εξομοίωση διακομιστή BLE. Το Core Bluetooth αφαιρεί τη στοίβα πρωτοκόλλου BLE από το φυσικό ραδιόφωνο έως το προφίλ GATT εφαρμογής. Σύμφωνα με το Apple Developer, 2026, το Core Bluetooth είναι το μοναδικό επίσημο API της Apple για ανάπτυξη BLE, υποστηρίζοντας BLE 4.0–5.4 με extended advertising, 2M PHY και LE Audio.
Κύρια Σημεία
Core Bluetooth χωρίζει τη στοίβα BLE σε δύο λογικούς ρόλους που ορίζονται από την προδιαγραφή Bluetooth SIG. Ο ρόλος της κεντρικής συσκευής (Central) αντιπροσωπεύεται από την κλάση CBCentralManager — εκκινεί τη σάρωση, δημιουργεί συνδέσεις και διαχειρίζεται τη λίστα των συνδεδεμένων CBPeripheral. Ο ρόλος της περιφερειακής συσκευής (Peripheral) αντιπροσωπεύεται από το CBPeripheralManager — δημοσιεύει υπηρεσίες και χαρακτηριστικά, απαντά σε αιτήματα του κέντρου και στέλνει ειδοποιήσεις. Μία συνεδρία iOS μπορεί ταυτόχρονα να λειτουργεί και στους δύο ρόλους σε διαφορετικά ραδιόφωνα BLE, αλλά η τυπική εφαρμογή χρησιμοποιεί έναν ρόλο.
Η αρχιτεκτονική Core Bluetooth περιλαμβάνει πέντε βασικές αφαιρέσεις. CBCentralManager διαχειρίζεται την κατάσταση του προσαρμογέα Bluetooth της συσκευής: poweredOn (έτοιμο για λειτουργία), poweredOff (Bluetooth απενεργοποιημένο), unauthorized (χωρίς άδεια), unsupported (BLE μη διαθέσιμο). CBPeripheral αντιπροσωπεύει μια απομακρυσμένη συσκευή BLE με το UUID, το όνομα, το RSSI και την ιεραρχία GATT της. CBService — λογική ομάδα χαρακτηριστικών. CBCharacteristic — σημείο δεδομένων για ανάγνωση/εγγραφή/ειδοποιήσεις. CBPeripheralManager δημιουργεί έναν τοπικό διακομιστή GATT για εξομοίωση περιφερειακού.
| Κλάση | Ρόλος | Κύριες μέθοδοι |
|---|---|---|
| CBCentralManager | Κεντρική συσκευή | scanForPeripherals, connect, cancelPeripheralConnection, retrievePeripherals |
| CBPeripheral | Απομακρυσμένο περιφερειακό | discoverServices, discoverCharacteristics, readValue, writeValue, setNotifyValue |
| CBPeripheralManager | Τοπικό περιφερειακό | addService, removeService, startAdvertising, respondToRequest, updateValue |
| CBCentral | Απομακρυσμένο κέντρο | maximumUpdateValueLength, identifier, ancsAuthorized |
Καταστάσεις CBCentralManager διαχειρίζονται όλες τις λειτουργίες BLE. Κατά την εκκίνηση της εφαρμογής, το centralManagerDidUpdateState καλείται με την τρέχουσα κατάσταση Bluetooth. Εάν η κατάσταση δεν είναι .poweredOn, οποιεσδήποτε κλήσεις BLE αγνοούνται από το σύστημα. Ο προγραμματιστής πρέπει να ελέγχει το state πριν από κάθε σάρωση και σύνδεση. Η μετάβαση από .poweredOff σε .poweredOn συμβαίνει όταν το Bluetooth ενεργοποιείται στις Ρυθμίσεις iOS — ο αντιπρόσωπος λαμβάνει επαναλαμβανόμενη κλήση και η εφαρμογή μπορεί να συνεχίσει τη σάρωση.
CBCentralManager — το σημείο εισόδου για όλες τις λειτουργίες BLE από την πλευρά της κεντρικής συσκευής. Η αρχικοποίηση δέχεται έναν αντιπρόσωπο (CBCentralManagerDelegate) και μια ουρά DispatchQueue — η σύσταση της Apple είναι να χρησιμοποιείτε main queue για απλότητα ή serial queue για απόδοση. Μετά την αρχικοποίηση, το πλαίσιο ελέγχει αυτόματα την κατάσταση Bluetooth και καλεί το centralManagerDidUpdateState: — τον πρώτο υποχρεωτικό αντιπρόσωπο για επεξεργασία.
Η σάρωση ξεκινά με τη μέθοδο scanForPeripheralsWithServices:options:. Η πρώτη παράμετρος είναι ένας πίνακας CBUUID υπηρεσιών για φιλτράρισμα: εάν τα UUID των ενδιαφερόντων υπηρεσιών είναι γνωστά, η μεταβίβασή τους μειώνει την κατανάλωση ενέργειας και τον χρόνο αναζήτησης. Εάν είναι nil, όλες οι συσκευές BLE εντός εμβέλειας ανιχνεύονται. Οι επιλογές περιλαμβάνουν .allowDuplicatesKey (επαναλαμβανόμενη ανίχνευση της ίδιας συσκευής) και .solicitedServiceUUIDsKey (για υπηρεσίες που δημοσιεύονται στο κέντρο).
import CoreBluetooth
class BLECentral: NSObject {
private var centralManager: CBCentralManager!
private var discoveredPeripherals: [CBPeripheral] = []
override init() {
super.init()
centralManager = CBCentralManager(delegate: self, queue: .main)
}
// Έναρξη σάρωσης BLE
func startScan() {
guard centralManager.state == .poweredOn else {
print("Bluetooth μη διαθέσιμο")
return
}
// Σάρωση όλων των συσκευών (nil = χωρίς φίλτρο)
centralManager.scanForPeripherals(withServices: nil,
options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
}
// Διακοπή σάρωσης
func stopScan() {
centralManager.stopScan()
}
// Σύνδεση στην επιλεγμένη συσκευή
func connect(to peripheral: CBPeripheral) {
centralManager.connect(peripheral, options: nil)
}
}
// MARK: - CBCentralManagerDelegate
extension BLECentral: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
startScan()
}
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi: NSNumber) {
if !discoveredPeripherals.contains(where: { $0.identifier == peripheral.identifier }) {
discoveredPeripherals.append(peripheral)
print("Found devices: \(peripheral.name ?? "Unknown"), RSSI: \(rssi)")
}
}
func centralManager(_ central: CBCentralManager,
didConnect peripheral: CBPeripheral) {
print("Connected: \(peripheral.identifier)")
peripheral.delegate = self
peripheral.discoverServices(nil)
}
func centralManager(_ central: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
error: Error?) {
print("Disconnected: \(peripheral.identifier)")
}
}
Η κλάση BLECentral παρουσιάζει τον πλήρη κύκλο σάρωσης και σύνδεσης συσκευών BLE. Το centralManagerDidUpdateState ξεκινά τη σάρωση όταν το Bluetooth είναι ενεργοποιημένο. Το didDiscoverPeripheral συλλέγει τις συσκευές που βρέθηκαν στον πίνακα discoveredPeripherals με αφαιρετική διπλοτύπων βάσει identifier. Μετά τη σύνδεση (didConnect), ξεκινά αμέσως η ανακάλυψη υπηρεσιών — αυτό είναι υποχρεωτικό βήμα πριν από οποιεσδήποτε λειτουργίες GATT.
CBPeripheralManager — κλάση για εξομοίωση περιφερειακής συσκευής BLE στο iOS. Η εφαρμογή στον ρόλο του περιφερειακού μπορεί να δημοσιεύσει τις δικές της υπηρεσίες και χαρακτηριστικά, να λαμβάνει εισερχόμενα αιτήματα ανάγνωσης/εγγραφής από την κεντρική συσκευή και να στέλνει ειδοποιήσεις. Το CBPeripheralManager χρησιμοποιείται για αξεσουάρ BLE που εξομοιώνονται από iPhone: τηλεχειριστήρια, πληκτρολόγια, ιχνηλάτες, πύλες IoT.
Ο κύκλος ζωής του CBPeripheralManager ξεκινά με αρχικοποίηση και τον αντιπρόσωπο CBPeripheralManagerDelegate. Μετά την επιβεβαίωση του poweredOn μέσω peripheralManagerDidUpdateState:, οι υπηρεσίες δημοσιεύονται (addService:) και η διαφήμιση ξεκινά (startAdvertising:). Τα δεδομένα διαφήμισης CBAdvertisementData περιλαμβάνουν το τοπικό όνομα (CBAdvertisementDataLocalNameKey), τα UUID υπηρεσιών (CBAdvertisementDataServiceUUIDsKey) και το επίπεδο ισχύος (CBAdvertisementDataTxPowerLevelKey). Το μέγιστο μέγεθος πακέτου διαφήμισης είναι 31 byte για BLE 4.0, 251 byte για extended advertising BLE 5.0+.
// Περιφερειακό BLE σε iOS μέσω CBPeripheralManager
class BLEPeripheral: NSObject {
private var peripheralManager: CBPeripheralManager!
let serviceUUID = CBUUID(string: "1234")
let characteristicUUID = CBUUID(string: "5678")
override init() {
super.init()
peripheralManager = CBPeripheralManager(delegate: self, queue: .main)
}
// Δημοσίευση υπηρεσίας με χαρακτηριστικό
func setupService() {
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .write, .notify],
value: nil,
permissions: [.readable, .writeable]
)
let service = CBMutableService(type: serviceUUID, primary: true)
service.characteristics = [characteristic]
peripheralManager.add(service)
}
// Έναρξη διαφήμισης
func startAdvertising() {
let advertisementData: [String: Any] = [
CBAdvertisementDataLocalNameKey: "My BLE Device",
CBAdvertisementDataServiceUUIDsKey: [serviceUUID]
]
peripheralManager.startAdvertising(advertisementData)
}
}
// MARK: - CBPeripheralManagerDelegate
extension BLEPeripheral: CBPeripheralManagerDelegate {
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
if peripheral.state == .poweredOn {
setupService()
}
}
func peripheralManager(_ peripheral: CBPeripheralManager,
didAdd service: CBService,
error: Error?) {
if error == nil {
startAdvertising()
}
}
// Χειρισμός αιτήματος ανάγνωσης
func peripheralManager(_ peripheral: CBPeripheralManager,
didReceiveRead request: CBATTRequest) {
let data = "CurrentValue".data(using: .utf8)!
request.value = data
peripheralManager.respond(to: request, withResult: .success)
}
// Χειρισμός αιτήματος εγγραφής
func peripheralManager(_ peripheral: CBPeripheralManager,
didReceiveWrite requests: [CBATTRequest]) {
for request in requests {
if let value = request.value {
print("Write: \(value)")
}
}
peripheralManager.respond(to: requests.first!, withResult: .success)
}
}
Η κλάση BLEPeripheral δημιουργεί έναν διακομιστή BLE με ένα χαρακτηριστικό που υποστηρίζει ανάγνωση, εγγραφή και ειδοποιήσεις. Μετά την αρχικοποίηση, το peripheralManagerDidUpdateState δημοσιεύει την υπηρεσία μέσω addService:, στη συνέχεια ξεκινά τη διαφήμιση μέσω startAdvertising:. Οι χειριστές didReceiveRead και didReceiveWrite απαντούν σε εισερχόμενα αιτήματα GATT από την κεντρική συσκευή. Για αποστολή ειδοποιήσεων χρησιμοποιείται η μέθοδος updateValue:forCharacteristic:onSubscribedCentrals:.
Λειτουργίες GATT (Generic Attribute Profile) — η βάση της ανταλλαγής δεδομένων στο Core Bluetooth. Μετά την ανακάλυψη υπηρεσιών και χαρακτηριστικών, η κεντρική συσκευή μπορεί να εκτελέσει τρεις τύπους λειτουργιών: ανάγνωση της τιμής χαρακτηριστικού, εγγραφή τιμής και εγγραφή σε ειδοποιήσεις/ενδείξεις. Κάθε λειτουργία είναι ασύγχρονη και επιστρέφει το αποτέλεσμα μέσω του αντίστοιχου αντιπροσώπου CBPeripheralDelegate.
Ανάγνωση εκτελείται με κλήση readValueForCharacteristic:. Η τιμή φτάνει στο peripheral:didUpdateValueForCharacteristic:error:. Σημαντικό: η ανάγνωση επιστρέφει την τρέχουσα τιμή από τη συσκευή, όχι προσωρινά αποθηκευμένη. Εάν η συσκευή δεν υποστηρίζει ανάγνωση (ιδιότητα .read), η κλήση θα επιστρέψει σφάλμα. Για μεγάλες τιμές (μεγαλύτερες από MTU), το BLE τεμαχίζει και συναρμολογεί αυτόματα τα δεδομένα σε επίπεδο GATT.
Εγγραφή εκτελείται με writeValue:forCharacteristic:type:. Το BLE υποστηρίζει δύο μοντέλα εγγραφής: withResponse (αξιόπιστο, με επιβεβαίωση) και withoutResponse (γρήγορο, χωρίς επιβεβαίωση). Η ιδιότητα CBCharacteristic.properties καθορίζει τους διαθέσιμους τύπους εγγραφής. Το μέγιστο μέγεθος ενός πακέτου εγγραφής περιορίζεται από το MTU: 23 byte για BLE 4.0 (20 byte χρήσιμων δεδομένων + 3 byte κεφαλίδας), έως 247 byte για BLE 5.0 με extended MTU (MTU 251).
Ειδοποιήσεις ενεργοποιούνται με κλήση setNotifyValue:true forCharacteristic:. Μετά την εγγραφή, το περιφερειακό στέλνει αυτόματα ενημερώσεις μέσω peripheral:didUpdateValueForCharacteristic: κάθε φορά που αλλάζει η τιμή του χαρακτηριστικού. Για απενεργοποίηση ειδοποιήσεων καλείται setNotifyValue:false forCharacteristic:. Το Core Bluetooth διαχειρίζεται αυτόματα τον περιγραφέα CCCD στο περιφερειακό.
| Λειτουργία | Μέθοδος | Αντιπρόσωπος | Τύπος μετάδοσης |
|---|---|---|---|
| Ανάγνωση | readValueForCharacteristic: | didUpdateValueForCharacteristic | Polling (αίτημα-απόκριση) |
| Εγγραφή withResponse | writeValue:forCharacteristic:type:withResponse | didWriteValueForCharacteristic | Με επιβεβαίωση |
| Εγγραφή withoutResponse | writeValue:forCharacteristic:type:withoutResponse | Χωρίς αντιπρόσωπο | Χωρίς επιβεβαίωση |
| Ειδοποίηση | setNotifyValue:true forCharacteristic: | didUpdateNotificationStateForCharacteristic + didUpdateValueForCharacteristic | Push από περιφερειακό |
Λειτουργία παρασκηνίου Το Core Bluetooth επιτρέπει στην εφαρμογή BLE να συνεχίσει τη σάρωση, να διατηρεί συνδέσεις και να λαμβάνει ειδοποιήσεις ενώ βρίσκεται στο παρασκήνιο. Για ενεργοποίηση απαιτείται: ενεργοποιήστε το capability “Uses Bluetooth LE accessories” στο Xcode (Info.plist → Required background modes → App communicates using Core Bluetooth) και προσθέστε το κλειδί „bluetooth-central” στο UIBackgroundModes. Για τον ρόλο περιφερειακού — „bluetooth-peripheral”.
State Restoration — μηχανισμός Core Bluetooth για επαναφορά της κατάστασης συνδέσεων BLE μετά από επανεκκίνηση της εφαρμογής από το σύστημα iOS. Κατά την ενεργοποίηση της λειτουργίας παρασκηνίου και τον καθορισμό του restoreIdentifier στην αρχικοποίηση του CBCentralManager ή CBPeripheralManager, το iOS αποθηκεύει την κατάσταση της στοίβας BLE κατά τον τερματισμό της εφαρμογής και την επαναφέρει στην επόμενη εκκίνηση. Ο αντιπρόσωπος centralManager:willRestoreState: λαμβάνει ένα λεξικό με αποθηκευμένες CBPeripheral και εκκρεμείς συνδέσεις.
// Διαμόρφωση Core Bluetooth με State Restoration
class BLECentralWithRestoration: NSObject {
let restoreIdentifier = "com.app.blecentral"
private var centralManager: CBCentralManager!
override init() {
super.init()
let options: [String: Any] = [
CBCentralManagerOptionRestoreIdentifierKey: restoreIdentifier,
CBCentralManagerOptionShowPowerAlertKey: true
]
centralManager = CBCentralManager(delegate: self,
queue: nil,
options: options)
}
}
extension BLECentralWithRestoration: CBCentralManagerDelegate {
// Επαναφορά κατάστασης μετά από επανεκκίνηση
func centralManager(_ central: CBCentralManager,
willRestoreState dict: [String : Any]) {
if let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey]
as? [CBPeripheral] {
for peripheral in peripherals {
peripheral.delegate = self
// Επαναφορά ανακάλυψης GATT
peripheral.discoverServices(nil)
}
}
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
print("Bluetooth έτοιμο μετά από επαναφορά")
}
}
}
Στη διαμόρφωση BLECentralWithRestoration, το κλειδί CBCentralManagerOptionRestoreIdentifierKey ενεργοποιεί την αποθήκευση κατάστασης. Εάν η εφαρμογή τερματίστηκε από το iOS (π.χ. λόγω έλλειψης μνήμης), κατά την επόμενη εκκίνηση το centralManager:willRestoreState: λαμβάνει τη λίστα των προηγουμένως συνδεδεμένων CBPeripheral. Η εφαρμογή επαναφέρει τους αντιπροσώπους και εκτελεί εκ νέου ανακάλυψη υπηρεσιών — ο χρήστης δεν αντιλαμβάνεται τη διακοπή σύνδεσης. Χωρίς State Restoration, όλες οι συνεδρίες BLE χάνονται κατά τον τερματισμό της εφαρμογής.
Πλήρες παράδειγμα εφαρμογής BLE σε Swift συνδυάζει την κεντρική και περιφερειακή συσκευή σε ένα έργο. Η εφαρμογή μπορεί να λειτουργήσει σε δύο λειτουργίες: ανίχνευση και σύνδεση με συσκευές BLE (Central) ή εξομοίωση αξεσουάρ BLE (Peripheral). Παρακάτω παρουσιάζεται η αρχιτεκτονική με έναν κοινό διαχειριστή BLE που επιλέγει ρόλο κατά την εκκίνηση.
// Καθολικός διαχειριστής BLE για κέντρο και περιφερειακό
class BLEManager {
enum Role {
case central
case peripheral
}
private let role: Role
private var centralManager: CBCentralManager?
private var peripheralManager: CBPeripheralManager?
let advertisedServiceUUID = CBUUID(string: "A001")
init(role: Role) {
self.role = role
switch role {
case .central:
centralManager = CBCentralManager(delegate: nil, queue: .main)
case .peripheral:
peripheralManager = CBPeripheralManager(delegate: nil, queue: .main)
}
}
// Κεντρική συσκευή: σάρωση
func scanForDevices() {
centralManager?.scanForPeripherals(withServices: nil, options: nil)
}
// Περιφερειακή συσκευή: διαφήμιση
func advertiseService() {
let data: [String: Any] = [
CBAdvertisementDataServiceUUIDsKey: [advertisedServiceUUID]
]
peripheralManager?.startAdvertising(data)
}
}
// Χρήση κατά την εκκίνηση
let isCentral = UserDefaults.standard.bool(forKey: "isCentral")
let manager = BLEManager(role: isCentral ? .central : .peripheral)
if isCentral {
manager.scanForDevices()
} else {
manager.advertiseService()
}
Ο διαχειριστής BLEManager επιλέγει ρόλο κατά την αρχικοποίηση και δημιουργεί τον αντίστοιχο Manager (CBCentralManager ή CBPeripheralManager). Η σημαία ρόλου μπορεί να αποθηκευτεί στο UserDefaults ή να μεταδοθεί μέσω διακομιστή διαμόρφωσης. Αυτή η προσέγγιση επιτρέπει στην εφαρμογή BLE να προσαρμόζεται στο σενάριο χρήσης: στο σημείο πώλησης, το iPhone λειτουργεί ως κέντρο για σάρωση τερματικών πληρωμής, στην πύλη IoT — ως περιφερειακό για συλλογή δεδομένων από αισθητήρες.
Συχνές Ερωτήσεις
Core Bluetooth — το πλαίσιο της Apple για ανάπτυξη BLE σε iOS, iPadOS και macOS. Παρέχει API για λειτουργία της κεντρικής (CBCentralManager) και περιφερειακής (CBPeripheralManager) συσκευής. Υποστηρίζει BLE 4.0–5.4, extended advertising, 2M PHY και LE Audio. Το Core Bluetooth είναι το μοναδικό επίσημο API της Apple για επικοινωνία BLE, υποχρεωτικό για όλες τις εφαρμογές iOS που λειτουργούν με Bluetooth Low Energy.
CBCentralManager — κλάση για εργασία στον ρόλο κεντρικής συσκευής: σαρώνει περιφερειακά BLE, δημιουργεί συνδέσεις, διαβάζει και γράφει χαρακτηριστικά. CBPeripheralManager — κλάση για εργασία στον ρόλο περιφερειακού: δημοσιεύει υπηρεσίες, απαντά σε αιτήματα ανάγνωσης/εγγραφής και στέλνει ειδοποιήσεις. Ένα iPhone μπορεί ταυτόχρονα να λειτουργεί σε δύο ρόλους μέσω διαφορετικών περιπτώσεων διαχειριστών.
Για εργασία BLE στο παρασκήνιο, ενεργοποιήστε το capability „Uses Bluetooth LE accessories” στο Xcode και προσθέστε το κλειδί „bluetooth-central” στο UIBackgroundModes. Για τον ρόλο περιφερειακού — „bluetooth-peripheral”. Καθορίστε το restoreIdentifier κατά την αρχικοποίηση του διαχειριστή για State Restoration. Χωρίς αυτές τις ρυθμίσεις, η εφαρμογή στο παρασκήνιο δεν λαμβάνει συμβάντα BLE και χάνει συνδέσεις.
Κύριες αιτίες: CBCentralManager.state != .poweredOn (Bluetooth απενεργοποιημένο ή μη εξουσιοδοτημένο), ο αντιπρόσωπος δεν έχει οριστεί, η συσκευή είναι εκτός εμβέλειας ή δεν στέλνει πακέτα διαφήμισης. Ελέγξτε την άδεια NSBluetoothAlwaysUsageDescription στο Info.plist, την κατάσταση Bluetooth στο centralManagerDidUpdateState και βεβαιωθείτε ότι το scanForPeripherals καλείται μόνο σε .poweredOn.
Ναι, το Core Bluetooth υποστηρίζει ταυτόχρονη σύνδεση σε πολλές συσκευές BLE. Κάθε CBPeripheral διαχειρίζεται ανεξάρτητα μέσω του δικού του αντιπροσώπου. Το iOS περιορίζει τον αριθμό ταυτόχρονων συνδέσεων BLE σε επίπεδο συστήματος (συνήθως 5–7 για iPhone). Για σενάρια 1:N (π.χ. κέντρο γυμναστικής με 10 ιχνηλάτες), απαιτείται ουρά και κυκλική εξυπηρέτηση περιφερειακών.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης