Core Bluetooth: iOS'ta BLE mimarisi ve geliştirme

Yazar: IT Sectr Yayınlanma: 2026-07-16 Okuma süresi: 10 dk

Core Bluetooth, iOS, iPadOS ve macOS'ta Bluetooth Low Energy ile etkileşim için Apple'ın çerçevesidir. Çerçeve, her iki BLE rolünde çalışmak için eksiksiz bir API seti sağlar: merkezi cihaz (CBCentralManager) çevre birimlerini taramak ve bağlanmak için, çevre birim cihazı (CBPeripheralManager) ise bir BLE sunucusunu öykünmek için. Core Bluetooth, BLE protokol yığını fiziksel radyodan uygulama seviyesi GATT profiline kadar soyutlar. Apple Developer, 2026'ya göre Core Bluetooth, BLE geliştirme için tek resmi Apple API'sidir ve BLE 4.0–5.4'ü extended advertising, 2M PHY ve LE Audio ile destekler.

Önemli Noktalar

  • Core Bluetooth — iOS, iPadOS ve macOS'ta BLE geliştirme için Apple'ın sistem çerçevesi
  • CBCentralManager — merkezi cihaz tarafından BLE çevre birimlerini taramak ve bağlanmak için sınıf
  • CBPeripheralManager — hizmetleri ve özellikleri yayınlayan bir BLE sunucusu oluşturmak için sınıf
  • GATT Profili — veri alışverişi için hizmetler, özellikler ve tanımlayıcılardan oluşan hiyerarşik model
  • Arka Plan Modları — Core Bluetooth, sistem temsilcileri ve durum geri yükleme yoluyla arka planda BLE iletişimini destekler

Core Bluetooth Nedir: Mimari ve Bileşenler

Core Bluetooth, BLE yığınını Bluetooth SIG spesifikasyonu tarafından tanımlanan iki mantıksal role ayırır. Merkezi cihaz rolü (Central), CBCentralManager sınıfı tarafından temsil edilir — taramayı başlatır, bağlantılar kurar ve bağlı CBPeripheral'ların listesini yönetir. Çevre birim cihaz rolü (Peripheral), CBPeripheralManager tarafından temsil edilir — hizmetleri ve özellikleri yayınlar, merkezi isteklere yanıt verir ve bildirimler gönderir. Tek bir iOS oturumu, farklı BLE radyolarında aynı anda her iki rolü de çalıştırabilir, ancak tipik bir uygulama tek bir rol kullanır.

Core Bluetooth mimarisi beş temel soyutlama içerir. CBCentralManager cihazın Bluetooth adaptör durumunu yönetir: poweredOn (çalışmaya hazır), poweredOff (Bluetooth devre dışı), unauthorized (izin yok), unsupported (BLE kullanılamıyor). CBPeripheral UUID'si, adı, RSSI'si ve GATT hiyerarşisi ile uzaktaki bir BLE cihazını temsil eder. CBService — özelliklerin mantıksal bir grubu. CBCharacteristic — okuma/yazma/bildirimler için bir veri noktası. CBPeripheralManager bir çevre birimini öykünmek için yerel bir GATT sunucusu oluşturur.

SınıfRolTemel Yöntemler
CBCentralManagerMerkezi cihazscanForPeripherals, connect, cancelPeripheralConnection, retrievePeripherals
CBPeripheralUzak çevre birimdiscoverServices, discoverCharacteristics, readValue, writeValue, setNotifyValue
CBPeripheralManagerYerel çevre birimaddService, removeService, startAdvertising, respondToRequest, updateValue
CBCentralUzak merkezimaximumUpdateValueLength, identifier, ancsAuthorized

CBCentralManager Durumları tüm BLE işlemlerini kontrol eder. Uygulama başladığında, centralManagerDidUpdateState mevcut Bluetooth durumuyla çağrılır. Durum .poweredOn değilse, sistem tüm BLE çağrılarını yok sayar. Geliştirici her tarama ve bağlantıdan önce durumu kontrol etmelidir. .poweredOff'tan .poweredOn'a geçiş, iOS Ayarları'nda Bluetooth etkinleştirildiğinde gerçekleşir — temsilci tekrarlanan bir çağrı alır ve uygulama taramaya devam edebilir.

CBCentralManager: BLE Cihazlarını Tarama ve Bağlama

CBCentralManager, merkezi cihaz tarafındaki tüm BLE işlemleri için giriş noktasıdır. Başlatma, bir temsilci (CBCentralManagerDelegate) ve bir DispatchQueue alır — Apple, basitlik için ana kuyruğu veya performans için seri kuyruğu kullanmayı önerir. Başlatmadan sonra, çerçeve otomatik olarak Bluetooth durumunu kontrol eder ve centralManagerDidUpdateState:'i çağırır — işlenmesi gereken ilk zorunlu temsilci.

Tarama, scanForPeripheralsWithServices:options: yöntemiyle başlar. İlk parametre, filtreleme için bir CBUUID hizmetleri dizisidir: istenen hizmetlerin UUID'leri biliniyorsa, bunları iletmek güç tüketimini ve arama süresini azaltır. Nil ise, menzildeki tüm BLE cihazları keşfedilir. Seçenekler arasında .allowDuplicatesKey (aynı cihazın tekrarlanan keşfi) ve .solicitedServiceUUIDsKey (merkezde yayınlanan hizmetler için) bulunur.

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 taramasını başlat
    func startScan() {
        guard centralManager.state == .poweredOn else {
            print("Bluetooth kullanılamıyor")
            return
        }
        // Tüm cihazları tara (nil = filtre yok)
        centralManager.scanForPeripherals(withServices: nil,
                                            options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
    }

    // Taramayı durdur
    func stopScan() {
        centralManager.stopScan()
    }

    // Seçili cihaza bağlan
    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 sınıfı, BLE cihaz tarama ve bağlantının tam döngüsünü gösterir. centralManagerDidUpdateState, Bluetooth etkin olduğunda taramayı başlatır. didDiscoverPeripheral, identifier'a göre yinelenenleri kaldırarak bulunan cihazları discoveredPeripherals dizisinde toplar. Bağlantıdan (didConnect) sonra, hizmet keşfi hemen başlar — bu, herhangi bir GATT işleminden önce zorunlu bir adımdır.

CBPeripheralManager: iOS'ta BLE Sunucusu Oluşturma

CBPeripheralManager, iOS'ta bir BLE çevre birim cihazını öykünmek için kullanılan sınıftır. Çevre birim rolündeki bir uygulama, hizmetlerini ve özelliklerini yayınlayabilir, merkezi bir cihazdan gelen okuma/yazma isteklerini kabul edebilir ve bildirimler gönderebilir. CBPeripheralManager, iPhone tarafından öykünülen BLE aksesuarları için kullanılır: uzaktan kumandalar, klavyeler, izleyiciler, IoT ağ geçitleri.

CBPeripheralManager'ın yaşam döngüsü, başlatma ve CBPeripheralManagerDelegate ile başlar. peripheralManagerDidUpdateState: aracılığıyla poweredOn onayı alındıktan sonra, hizmetler yayınlanır (addService:) ve reklam başlatılır (startAdvertising:). Reklam verileri CBAdvertisementData, yerel adı (CBAdvertisementDataLocalNameKey), hizmet UUID'lerini (CBAdvertisementDataServiceUUIDsKey) ve iletim gücü seviyesini (CBAdvertisementDataTxPowerLevelKey) içerir. Maksimum reklam paketi boyutu BLE 4.0 için 31 bayt, extended advertising BLE 5.0+ için 251 bayttır.

swift
// CBPeripheralManager ile iOS'ta BLE çevre birimi
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)
    }

    // Özellikle hizmeti yayınla
    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)
    }

    // Reklamı başlat
    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()
        }
    }

    // Okuma isteğini işle
    func peripheralManager(_ peripheral: CBPeripheralManager,
                        didReceiveRead request: CBATTRequest) {
        let data = "CurrentValue".data(using: .utf8)!
        request.value = data
        peripheralManager.respond(to: request, withResult: .success)
    }

    // Yazma isteğini işle
    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 sınıfı, okuma, yazma ve bildirimleri destekleyen tek bir özellikle bir BLE sunucusu oluşturur. Başlatmadan sonra, peripheralManagerDidUpdateState addService: aracılığıyla hizmeti yayınlar, ardından startAdvertising: aracılığıyla reklamı başlatır. didReceiveRead ve didReceiveWrite işleyicileri, merkezi cihazdan gelen GATT isteklerine yanıt verir. Bildirim göndermek için updateValue:forCharacteristic:onSubscribedCentrals: yöntemi kullanılır.

GATT İşlemleri: Okuma, Yazma ve Bildirimler

GATT işlemleri (Generic Attribute Profile), Core Bluetooth'ta veri alışverişinin temelidir. Hizmet ve özellik keşfinden sonra, merkezi cihaz üç tür işlem gerçekleştirebilir: bir özellik değerini okuma, bir değer yazma ve bildirimlere/indikasyonlara abone olma. Her işlem eşzamansızdır ve sonucu ilgili CBPeripheralDelegate geri çağrımı aracılığıyla döndürür.

Okuma: readValueForCharacteristic: çağrılarak gerçekleştirilir. Değer peripheral:didUpdateValueForCharacteristic:error: içinde gelir. Önemli: okuma, cihazdan geçerli değeri döndürür, önbelleğe alınmış bir değeri değil. Cihaz okumayı desteklemiyorsa (.read özelliği), çağrı bir hata döndürür. Büyük değerler (MTU'dan büyük) için BLE, GATT düzeyinde verileri otomatik olarak parçalar ve yeniden birleştirir.

Yazma: writeValue:forCharacteristic:type: çağrılarak gerçekleştirilir. BLE iki yazma modelini destekler: withResponse (güvenilir, onaylı) ve withoutResponse (hızlı, onaysız). CBCharacteristic.properties özelliği, kullanılabilir yazma türlerini tanımlar. Tek bir yazma paketinin maksimum boyutu MTU ile sınırlıdır: BLE 4.0 için 23 bayt (20 bayt yük + 3 bayt başlık), genişletilmiş MTU (MTU 251) ile BLE 5.0+ için 247 bayta kadar.

Bildirimler: setNotifyValue:true forCharacteristic: çağrılarak etkinleştirilir. Abonelikten sonra, çevre birim, özellik değeri her değiştiğinde peripheral:didUpdateValueForCharacteristic: aracılığıyla otomatik olarak güncellemeler gönderir. Bildirimleri devre dışı bırakmak için setNotifyValue:false forCharacteristic: çağrılır. Core Bluetooth, çevre birimde CCCD tanımlayıcısını otomatik olarak yönetir.

İşlemYöntemTemsilciİletim Türü
OkumareadValueForCharacteristic:didUpdateValueForCharacteristicYoklama (istek-yanıt)
withResponse YazmawriteValue:forCharacteristic:type:withResponsedidWriteValueForCharacteristicOnaylı
withoutResponse YazmawriteValue:forCharacteristic:type:withoutResponseTemsilci yokOnaysız
BildirimsetNotifyValue:true forCharacteristic:didUpdateNotificationStateForCharacteristic + didUpdateValueForCharacteristicÇevre birimden itme

Core Bluetooth Arka Plan Modu ve State Restoration

Arka plan modu, Core Bluetooth'ta BLE uygulamalarının arka plandayken taramaya devam etmesine, bağlantıları sürdürmesine ve bildirimler almasına olanak tanır. Etkinleştirmek için Xcode'da “Uses Bluetooth LE accessories” yeteneğini etkinleştirin (Info.plist → Required background modes → App communicates using Core Bluetooth) ve UIBackgroundModes'a “bluetooth-central” anahtarını ekleyin. Çevre birim rolü için — “bluetooth-peripheral”.

State Restoration, iOS tarafından uygulama yeniden başlatıldıktan sonra BLE bağlantılarının durumunu geri yüklemek için Core Bluetooth'un bir mekanizmasıdır. Arka plan modu etkinken ve CBCentralManager veya CBPeripheralManager başlatmasında bir restoreIdentifier belirtildiğinde, iOS uygulama sonlandığında BLE yığını durumunu kaydeder ve bir sonraki başlatmada geri yükler. Temsilci centralManager:willRestoreState:, kaydedilmiş CBPeripheral'lar ve bekleyen bağlantılarla bir sözlük alır.

swift
// State Restoration ile Core Bluetooth yapılandırması
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 {

    // Yeniden başlatmadan sonra durumu geri yükle
    func centralManager(_ central: CBCentralManager,
                        willRestoreState dict: [String : Any]) {
        if let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey]
            as? [CBPeripheral] {
            for peripheral in peripherals {
                peripheral.delegate = self
                // GATT keşfini geri yükle
                peripheral.discoverServices(nil)
            }
        }
    }

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            print("Geri yüklemeden sonra Bluetooth hazır")
        }
    }
}

BLECentralWithRestoration yapılandırmasında, CBCentralManagerOptionRestoreIdentifierKey anahtarı durum korumayı etkinleştirir. Uygulama iOS tarafından sonlandırıldıysa (örneğin, bellek baskısı nedeniyle), bir sonraki başlatmada centralManager:willRestoreState: daha önce bağlanmış CBPeripheral'ların bir listesini alır. Uygulama temsilcileri geri yükler ve hizmetleri yeniden keşfeder — kullanıcı bağlantı kesintisini fark etmez. State Restoration olmadan, uygulama sonlandığında tüm BLE oturumları kaybolur.

Swift'te BLE Uygulama Örneği: Merkezi ve Çevre Birim

Tam bir örnek Swift'teki BLE uygulaması, tek bir projede hem merkezi hem de çevre birim cihazları birleştirir. Uygulama iki modda çalışabilir: BLE cihazlarını keşfetme ve bağlanma (Merkezi) veya bir BLE aksesuarını öykünme (Çevre Birim). Aşağıda, başlangıçta rolü seçen ortak bir BLE yöneticisiyle bir mimari gösterilmiştir.

swift
// Merkezi ve çevre birim için evrensel BLE yöneticisi
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)
        }
    }

    // Merkezi cihaz: tarama
    func scanForDevices() {
        centralManager?.scanForPeripherals(withServices: nil, options: nil)
    }

    // Çevre birim cihaz: reklam
    func advertiseService() {
        let data: [String: Any] = [
            CBAdvertisementDataServiceUUIDsKey: [advertisedServiceUUID]
        ]
        peripheralManager?.startAdvertising(data)
    }
}

// Başlangıçta kullanım
let isCentral = UserDefaults.standard.bool(forKey: "isCentral")
let manager = BLEManager(role: isCentral ? .central : .peripheral)

if isCentral {
    manager.scanForDevices()
} else {
    manager.advertiseService()
}

BLEManager, başlatmada rolü seçer ve ilgili Yöneticiyi (CBCentralManager veya CBPeripheralManager) oluşturur. Rol bayrağı UserDefaults'ta saklanabilir veya bir yapılandırma sunucusu aracılığıyla iletilebilir. Bu yaklaşım, BLE uygulamasının kullanım durumuna uyum sağlamasına olanak tanır: bir satış noktasında iPhone, ödeme terminallerini taramak için merkezi olarak çalışır; bir IoT ağ geçidinde — sensörlerden veri toplamak için çevre birim olarak.

Sıkça Sorulan Sorular

Core Bluetooth nedir?

Core Bluetooth, iOS, iPadOS ve macOS'ta BLE geliştirme için Apple'ın çerçevesidir. Hem merkezi (CBCentralManager) hem de çevre birim (CBPeripheralManager) cihazlar için API sağlar. BLE 4.0–5.4, extended advertising, 2M PHY ve LE Audio'yu destekler. Core Bluetooth, Bluetooth Low Energy ile çalışan tüm iOS uygulamaları için gerekli olan BLE iletişimi için tek resmi Apple API'sidir.

CBCentralManager ve CBPeripheralManager arasındaki fark nedir?

CBCentralManager merkezi cihaz rolünde çalışmak için bir sınıftır: BLE çevre birimlerini tarar, bağlantılar kurar, özellikleri okur ve yazar. CBPeripheralManager çevre birim rolünde çalışmak için bir sınıftır: hizmetleri yayınlar, okuma/yazma isteklerine yanıt verir ve bildirimler gönderir. Tek bir iPhone, farklı yönetici örnekleri aracılığıyla aynı anda her iki rolü de çalıştırabilir.

Arka plan çalışması için Core Bluetooth nasıl yapılandırılır?

Arka plan BLE çalışması için Xcode'da “Uses Bluetooth LE accessories” yeteneğini etkinleştirin ve UIBackgroundModes'a “bluetooth-central” anahtarını ekleyin. Çevre birim rolü için — “bluetooth-peripheral”. State Restoration için yöneticiyi başlatırken bir restoreIdentifier belirtin. Bu ayarlar olmadan, arka plandaki uygulama BLE olaylarını almaz ve bağlantıları kaybeder.

Core Bluetooth neden cihaz bulamıyor?

Yaygın nedenler: CBCentralManager.state != .poweredOn (Bluetooth devre dışı veya yetkisiz), temsilci ayarlanmamış, cihaz menzil dışında veya reklam paketleri göndermiyor. Info.plist'te NSBluetoothAlwaysUsageDescription iznini, centralManagerDidUpdateState'te Bluetooth durumunu kontrol edin ve scanForPeripherals'in yalnızca .poweredOn olduğunda çağrıldığından emin olun.

Aynı anda birden fazla CBPeripheral bağlanabilir mi?

Evet, Core Bluetooth aynı anda birden fazla BLE cihazına eşzamanlı bağlantıyı destekler. Her CBPeripheral, kendi temsilcisi aracılığıyla bağımsız olarak yönetilir. iOS, sistem düzeyinde eşzamanlı BLE bağlantı sayısını sınırlar (genellikle iPhone için 5–7). 1:N senaryoları için (örneğin, 10 izleyicili bir fitness merkezi), çevre birimlerin sıraya alınması ve döngüsel olarak hizmet verilmesi gerekir.

Özet

  • Core Bluetooth — CBCentralManager ve CBPeripheralManager sınıflarıyla BLE geliştirme için Apple'ın sistem çerçevesi
  • CBCentralManager uzak BLE cihazlarıyla tarama, bağlantı ve GATT işlemlerini yönetir
  • CBPeripheralManager hizmet yayınlama ve gelen istek işleme ile BLE çevre birimlerini öykünür
  • GATT Profili okuma, yazma ve bildirim işlemleriyle hizmetleri, özellikleri ve tanımlayıcıları içerir
  • Arka plan modu State Restoration için UIBackgroundModes ve restoreIdentifier gerektirir
  • MTU BLE paket boyutunu sınırlar: BLE 4.0 için 23 bayt, genişletilmiş MTU ile BLE 5.0+ için 251 bayta kadar
  • Swift async/await CheckedContinuation aracılığıyla temsilcilerle eşzamansız BLE kodunu basitleştirir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun