CBCentralManager — är den centrala klassen i Core Bluetooth-ramverket i iOS som hanterar skanning, anslutning och interaktion med BLE-kringutrustning. Core Bluetooth (iOS 5+, 2011) ger en högnivåabstraktion över BLE-stacken på GATT-nivå, och döljer detaljerna i Link Layer och HCI från utvecklaren. CBCentralManager utför rollen som Central: den skannar etern via scanForPeripherals, initierar anslutning via connect, upptäcker tjänster via discoverServices och hanterar dataöverföring. Enligt Apple Developer Documentation (2024) stöder CBCentralManager upp till 7 samtidiga BLE-anslutningar på enheter med BLE 5.0.
Huvudpunkter
CBCentralManager — är huvudklassen i Core Bluetooth för att implementera Central-rollen i BLE-arkitekturen på iOS. Den hanterar hela livscykeln för en BLE-anslutning: från skanning av annonserande enheter till dataöverföring och frånkoppling. CBCentralManager arbetar asynkront via delegaten CBCentralManagerDelegate, som meddelar appen om händelser i Bluetooth-stacken.
Initiering av CBCentralManager startar state restoration-processen: hanteraren kontrollerar Bluetooth-status på enheten och återställer tidigare anslutningar om appen stängdes. Initieringsprocessen kan ta 50 till 500 ms beroende på Bluetooth-status. Appen måste vänta på anropet centralManagerDidUpdateState innan några BLE-operationer påbörjas.
Arkitekturen i Core Bluetooth är byggd på mönstret Delegation: CBCentralManager delegerar händelsehantering (enhetsupptäckt, anslutning, fel) till protokollet CBCentralManagerDelegate. För arbete med en specifik Peripheral används protokollet CBPeripheralDelegate, som meddelar om upptäckt av tjänster, egenskaper och mottagning av data. Denna asynkrona modell säkerställer icke-blockerande UI-drift.
CBCentralManager går igenom flera tillstånd som avgör om BLE-stacken är tillgänglig för arbete. Tillståndet överförs via delegaten: centralManagerDidUpdateState(_:). Utvecklaren måste hantera alla tillstånd — inte bara poweredOn, utan även fall när Bluetooth är avstängt eller inte tillgängligt.
| Tillstånd | Betydelse | Utvecklaråtgärd |
|---|---|---|
| .poweredOn | Bluetooth är på och redo | Starta skanning |
| .poweredOff | Bluetooth är avstängt | Visa varning för användaren |
| .unauthorized | Inget tillstånd | Begär tillstånd i Inställningar |
| .unsupported | Enheten stöder inte BLE | Dölj BLE-funktioner |
| .unknown | Tillstånd ej definierat | Vänta på nästa uppdatering |
| .resetting | Bluetooth startas om | Vänta på återställning |
Unauthorized state blir allt vanligare från iOS 13+. Från och med denna version måste appen ha tillståndet NSBluetoothAlwaysUsageDescription i Info.plist. Utan det går den centrala hanteraren över till .unauthorized och skanning är omöjlig. Användaren kan när som helst ändra tillståndet i Inställningar > Integritet > Bluetooth.
scanForPeripherals(withServices:options:) — huvudmetoden för att starta skanning. Parametern withServices tar emot en array av tjänsters UUID för filtrering: om nil skickas kommer alla enheter att upptäckas, vilket avsevärt ökar energiförbrukningen. Det rekommenderas att alltid filtrera efter UUID för de tjänster som appen behöver. Skanningsalternativ inkluderar CBCentralManagerScanOptionAllowDuplicatesKey (upprepade meddelanden om samma enhet).
import CoreBluetooth
class BLEController: NSObject,
CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager =
CBCentralManager(
delegate: self,
queue: nil
)
}
func startScanning() {
let serviceUUID =
CBUUID("180F") // Batteritjänst
centralManager.scanForPeripherals(
withServices: [serviceUUID],
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
När en enhet upptäcks anropas centralManager(_:didDiscover:advertisementData:rssi:). Parametern advertisementData innehåller en fullständig ordbok över annonseringspaketets data, inklusive enhetens namn (CBAdvertisementDataLocalNameKey), tjänsters UUID (CBAdvertisementDataServiceUUIDsKey) och tillverkar data (CBAdvertisementDataManufacturerDataKey). RSSI — signalstyrka i dBm, tillgänglig vid upptäcktstillfället.
connect(_:options:) — metod för att upprätta en BLE-anslutning med en upptäckt Peripheral. Efter anropet connect försöker iOS ansluta till enheten. Lyckad anslutning bekräftas av centralManager(_:didConnect:), fel av centralManager(_:didFailToConnect:error:). Anslutningsalternativ inkluderar CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey och CBConnectPeripheralOptionNotifyOnNotificationKey för bakgrundsmeddelanden.
// Anslut till BLE-enhet
func connectToPeripheral(
_ peripheral: CBPeripheral
) {
centralManager.connect(peripheral, options: nil)
// Ställ in delegat för Peripheral
peripheral.delegate = self
}
// Delegat: lyckad anslutning
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
print("Ansluten till " +
"\(peripheral.name ?? "unknown")")
// Starta tjänstupptäckt
peripheral.discoverServices(nil)
}
// Delegat: anslutningsfel
func centralManager(
_ central: CBCentralManager,
didFailToConnect peripheral: CBPeripheral,
error: Error?
) {
print("Connection failed:
\(error?.localizedDescription ?? "")")
}
Anslutningstimeout på iOS är 30 sekunder. Om enheten inte svarar på anslutningsbegäran inom denna tid anropas didFailToConnect. Faktorer som påverkar timeouter: avstånd till enheten, störningar, om enheten för närvarande annonserar. Innan anslutning, se till att enheten är i connectable advertising-läge (ADV_IND, inte ADV_NONCONN_IND).
Efter anslutning måste tjänster (discoverServices) och egenskaper (discoverCharacteristics) för Peripheral upptäckas. Detta är ett obligatoriskt steg innan läsning eller skrivning av data. Processen är asynkron: discoverServices returnerar resultat via peripheral(_:didDiscoverServices:), och discoverCharacteristics via peripheral(_:didDiscoverCharacteristicsFor:error:).
Det rekommenderas att skicka en array av intressanta UUID till discoverServices, inte nil. Filtrering påskyndar upptäckten och sparar energi. Om tjänsten inte hittas rapporterar iOS en tom array. Efter upptäckt av egenskaper kan deras värden läsas (readValue), prenumerera på meddelanden (setNotifyValue) eller skriva data (writeValue).
En viktig detalj: MTU förhandlas automatiskt efter anslutning. För att få aktuell MTU, använd peripheral.maximumWriteValueLength(for: .withResponse) eller .withoutResponse. I iOS är maximal MTU 512 byte för BLE 5.0-enheter. Om du behöver överföra data större än MTU, implementera fragmentering på applikationsnivå.
Bakgrundsskanning av BLE-enheter på iOS kräver speciell konfiguration. Core Bluetooth stöder bakgrundskörning, men med betydande begränsningar. För bakgrundsarbete krävs: aktivera bluetooth-central i Background Modes i projektets Capabilities, initiera CBCentralManager med alternativet CBCentralManagerOptionRestoreIdentifierKey för state restoration, och hantera händelser från den centrala hanteraren vid övergång till bakgrunden.
BLE-begränsningar i bakgrunden på iOS: scanForPeripherals utan UUID-filtrering fungerar inte i bakgrunden. Appen måste ange specifika tjänsters UUID för skanning. iOS kan fördröja leverans av BLE-händelser på obestämd tid. Core Bluetooth återupptar automatiskt skanning vid upptäckt av en matchande enhet, även om appen är i bakgrunden. Timeout för bakgrundsskanning: iOS kan stoppa skanning efter 10–30 minuter för att spara energi.
State Restoration — Core Bluetooth-mekanismen som möjliggör återställning av BLE-anslutningar efter omstart av appen eller iOS-omstart. För användning: ange CBCentralManagerOptionRestoreIdentifierKey vid initiering, implementera centralManager(_:willRestoreState:) i delegaten och återställ listan över anslutna Peripherals från den skickade ordboken. State Restoration är en kritisk funktionalitet för BLE-appar som fungerar i bakgrunden, till exempel fitnessspårare eller medicinska enheter.
CBCentralManager genererar fel i flera scenarier: anslutning misslyckades (didFailToConnect), anslutning bruten (didDisconnectPeripheral), egenskap inte tillgänglig för läsning/skrivning (didWriteValue error). Alla Core Bluetooth-fel returneras via Error-objektet med domänen CBErrorDomain. De vanligaste koderna: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).
Strategi för återställning av anslutning: vid mottagning av didDisconnectPeripheral, kontrollera felkoden. Om felet är CBErrorConnectionTimeout eller CBErrorPeripheralDisconnected — schemalägg automatisk återanslutning efter 1–5 sekunder. Om felet är CBErrorOperationNotSupported — logga och försök inte upprepa operationen. För kritiska anslutningar (medicinska enheter) använd exponential backoff med maxintervall på 60 sekunder.
// Hantera frånkoppling med automatisk återanslutning
func centralManager(
_ central: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
error: Error?
) {
guard let error = error else {
return // Förväntad frånkoppling
}
print("Disconnected: \(error.localizedDescription)")
// Automatisk återanslutning
if shouldAutoReconnect {
DispatchQueue.main.asyncAfter(
deadline: .now() + reconnectDelay
) {
central.connect(peripheral)
}
}
}
Vid utveckling av en pålitlig BLE-app på iOS, beakta: Core Bluetooth garanterar inte leverans av alla paket vid svag signal. För pålitlig överföring, använd writeType .withResponse (bekräftad skrivning) och prenumerera på meddelanden (setNotifyValue) för att ta emot data från Peripheral. För en fellogg för att diagnostisera anslutningsproblem i produktion.
Vanliga frågor
Kontrollera hanterarens tillstånd via centralManagerDidUpdateState. Se till att tillståndet NSBluetoothAlwaysUsageDescription finns i Info.plist, Bluetooth är påslaget på enheten och kringutrustningen annonserar med rätt typ (connectable advertising, inte non-connectable).
På enheter med BLE 5.0 (iPhone 8 och nyare) — upp till 7 samtidiga anslutningar. På äldre enheter — upp till 3–5. Antalet skannade enheter är obegränsat, men aktiva anslutningar har en strikt gräns som ställts in av Bluetooth Controller.
Det rekommenderas att skanna med UUID-filter och stänga av skanning när enheten hittats. Kontinuerlig skanning förbrukar batteriet: 1 timmes oavbruten skanning förbrukar ~10–15 % av iPhone-batteriet. Använd timer och villkor för att stoppa skanningen.
CBCentralManager — för skanning och anslutning till externa BLE-enheter (Central-roll). CBPeripheralManager — för att din iOS-enhet själv ska fungera som BLE-kringutrustning (annonsera tjänster). En instans kan bara vara i en roll.
Implementera centralManager(_:didDisconnectPeripheral:error:). Om felet inte är nil — schemalägg automatisk återanslutning med exponential backoff (1 s → 2 s → 4 s → 8 s → max 60 s). Om felet är nil — enheten kopplades från normalt (t.ex. användaren tryckte på en knapp på enheten).
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också