Core Bluetooth: αρχιτεκτονική και ανάπτυξη BLE στο iOS

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-16 Χρόνος ανάγνωσης: 10 λεπ

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 — το σύστημα πλαίσιο της Apple για ανάπτυξη BLE σε iOS, iPadOS και macOS
  • CBCentralManager — κλάση για σάρωση και σύνδεση με περιφερειακές BLE από την πλευρά της κεντρικής συσκευής
  • CBPeripheralManager — κλάση για δημιουργία διακομιστή BLE που δημοσιεύει υπηρεσίες και χαρακτηριστικά
  • Προφίλ GATT — ιεραρχικό μοντέλο υπηρεσιών, χαρακτηριστικών και περιγραφέων για ανταλλαγή δεδομένων
  • Λειτουργίες παρασκηνίου — Το Core Bluetooth υποστηρίζει επικοινωνία BLE στο παρασκήνιο μέσω συστημικών αντιπροσώπων και state restoration

Τι είναι το Core Bluetooth: αρχιτεκτονική και συστατικά

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

CBCentralManager — το σημείο εισόδου για όλες τις λειτουργίες BLE από την πλευρά της κεντρικής συσκευής. Η αρχικοποίηση δέχεται έναν αντιπρόσωπο (CBCentralManagerDelegate) και μια ουρά DispatchQueue — η σύσταση της Apple είναι να χρησιμοποιείτε main queue για απλότητα ή serial queue για απόδοση. Μετά την αρχικοποίηση, το πλαίσιο ελέγχει αυτόματα την κατάσταση Bluetooth και καλεί το centralManagerDidUpdateState: — τον πρώτο υποχρεωτικό αντιπρόσωπο για επεξεργασία.

Η σάρωση ξεκινά με τη μέθοδο scanForPeripheralsWithServices:options:. Η πρώτη παράμετρος είναι ένας πίνακας CBUUID υπηρεσιών για φιλτράρισμα: εάν τα UUID των ενδιαφερόντων υπηρεσιών είναι γνωστά, η μεταβίβασή τους μειώνει την κατανάλωση ενέργειας και τον χρόνο αναζήτησης. Εάν είναι nil, όλες οι συσκευές BLE εντός εμβέλειας ανιχνεύονται. Οι επιλογές περιλαμβάνουν .allowDuplicatesKey (επαναλαμβανόμενη ανίχνευση της ίδιας συσκευής) και .solicitedServiceUUIDsKey (για υπηρεσίες που δημοσιεύονται στο κέντρο).

swift
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 στο 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+.

swift
// Περιφερειακό 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: ανάγνωση, εγγραφή και ειδοποιήσεις

Λειτουργίες 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:didUpdateValueForCharacteristicPolling (αίτημα-απόκριση)
Εγγραφή withResponsewriteValue:forCharacteristic:type:withResponsedidWriteValueForCharacteristicΜε επιβεβαίωση
Εγγραφή withoutResponsewriteValue:forCharacteristic:type:withoutResponseΧωρίς αντιπρόσωποΧωρίς επιβεβαίωση
ΕιδοποίησηsetNotifyValue:true forCharacteristic:didUpdateNotificationStateForCharacteristic + didUpdateValueForCharacteristicPush από περιφερειακό

Λειτουργία παρασκηνίου Core Bluetooth και State Restoration

Λειτουργία παρασκηνίου Το 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 και εκκρεμείς συνδέσεις.

swift
// Διαμόρφωση 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 σε Swift συνδυάζει την κεντρική και περιφερειακή συσκευή σε ένα έργο. Η εφαρμογή μπορεί να λειτουργήσει σε δύο λειτουργίες: ανίχνευση και σύνδεση με συσκευές BLE (Central) ή εξομοίωση αξεσουάρ BLE (Peripheral). Παρακάτω παρουσιάζεται η αρχιτεκτονική με έναν κοινό διαχειριστή BLE που επιλέγει ρόλο κατά την εκκίνηση.

swift
// Καθολικός διαχειριστής 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;

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 και CBPeripheralManager;

CBCentralManager — κλάση για εργασία στον ρόλο κεντρικής συσκευής: σαρώνει περιφερειακά BLE, δημιουργεί συνδέσεις, διαβάζει και γράφει χαρακτηριστικά. CBPeripheralManager — κλάση για εργασία στον ρόλο περιφερειακού: δημοσιεύει υπηρεσίες, απαντά σε αιτήματα ανάγνωσης/εγγραφής και στέλνει ειδοποιήσεις. Ένα iPhone μπορεί ταυτόχρονα να λειτουργεί σε δύο ρόλους μέσω διαφορετικών περιπτώσεων διαχειριστών.

Πώς διαμορφώνεται το Core Bluetooth για εργασία παρασκηνίου;

Για εργασία BLE στο παρασκήνιο, ενεργοποιήστε το capability „Uses Bluetooth LE accessories” στο Xcode και προσθέστε το κλειδί „bluetooth-central” στο UIBackgroundModes. Για τον ρόλο περιφερειακού — „bluetooth-peripheral”. Καθορίστε το restoreIdentifier κατά την αρχικοποίηση του διαχειριστή για State Restoration. Χωρίς αυτές τις ρυθμίσεις, η εφαρμογή στο παρασκήνιο δεν λαμβάνει συμβάντα BLE και χάνει συνδέσεις.

Γιατί το Core Bluetooth δεν βρίσκει συσκευές;

Κύριες αιτίες: CBCentralManager.state != .poweredOn (Bluetooth απενεργοποιημένο ή μη εξουσιοδοτημένο), ο αντιπρόσωπος δεν έχει οριστεί, η συσκευή είναι εκτός εμβέλειας ή δεν στέλνει πακέτα διαφήμισης. Ελέγξτε την άδεια NSBluetoothAlwaysUsageDescription στο Info.plist, την κατάσταση Bluetooth στο centralManagerDidUpdateState και βεβαιωθείτε ότι το scanForPeripherals καλείται μόνο σε .poweredOn.

Μπορούν να συνδεθούν πολλά CBPeripheral ταυτόχρονα;

Ναι, το Core Bluetooth υποστηρίζει ταυτόχρονη σύνδεση σε πολλές συσκευές BLE. Κάθε CBPeripheral διαχειρίζεται ανεξάρτητα μέσω του δικού του αντιπροσώπου. Το iOS περιορίζει τον αριθμό ταυτόχρονων συνδέσεων BLE σε επίπεδο συστήματος (συνήθως 5–7 για iPhone). Για σενάρια 1:N (π.χ. κέντρο γυμναστικής με 10 ιχνηλάτες), απαιτείται ουρά και κυκλική εξυπηρέτηση περιφερειακών.

Σύνοψη

  • Core Bluetooth — το σύστημα πλαίσιο της Apple για ανάπτυξη BLE με τις κλάσεις CBCentralManager και CBPeripheralManager
  • CBCentralManager διαχειρίζεται σάρωση, σύνδεση και λειτουργίες GATT με απομακρυσμένες συσκευές BLE
  • CBPeripheralManager εξομοιώνει περιφερειακό BLE με δημοσίευση υπηρεσιών και επεξεργασία εισερχόμενων αιτημάτων
  • Προφίλ GATT περιλαμβάνει υπηρεσίες, χαρακτηριστικά και περιγραφείς με λειτουργίες ανάγνωσης, εγγραφής και ειδοποιήσεων
  • Λειτουργία παρασκηνίου απαιτεί UIBackgroundModes και restoreIdentifier για State Restoration
  • MTU BLE περιορίζει το μέγεθος πακέτου: 23 byte για BLE 4.0, έως 251 byte για BLE 5.0+ με extended MTU
  • Swift async/await μέσω CheckedContinuation απλοποιεί τον ασύγχρονο κώδικα BLE με αντιπροσώπους

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης