iOS'ta CBCentralManager — nedir, BLE yönetimi ve Core Bluetooth

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

CBCentralManager, iOS'ta BLE çevre birimlerini tarama, bağlanma ve etkileşimi yöneten Core Bluetooth framework'ünün merkezi sınıfıdır. Core Bluetooth (iOS 5+, 2011), GATT seviyesinde BLE yığını üzerinde yüksek seviyeli bir soyutlama sağlayarak Link Layer ve HCI ayrıntılarını geliştiriciden gizler. CBCentralManager, Central rolünü uygular: scanForPeripherals ile havayı tarar, connect ile bağlantı başlatır, discoverServices ile hizmetleri keşfeder ve veri aktarımını yönetir. Apple Developer Documentation'a (2024) göre CBCentralManager, BLE 5.0 destekli cihazlarda BLE cihazlarına kadar 7 eşzamanlı bağlantıyı destekler.

Önemli Noktalar

  • CBCentralManager, Central rolünde BLE taraması, bağlantılar ve veri aktarımını yöneten iOS sınıfıdır.
  • Tarama, enerji tasarrufu için hizmet UUID filtrelemesiyle scanForPeripherals aracılığıyla başlatılır.
  • Bağlantı, temsilci aracılığıyla durum takibiyle connect(peripheral:options:) üzerinden gerçekleştirilir.
  • iOS, BLE 5.0 destekli cihazlarda 7 eşzamanlı BLE bağlantısına kadar destekler.
  • Arka plan taraması, Background Modes'da bluetooth-central etkinleştirmeyi ve CBCentralManagerScanOptionAllowDuplicatesKey kullanmayı gerektirir.

CBCentralManager Nedir?

CBCentralManager, iOS'ta BLE mimarisinde Central rolünü uygulamak için ana Core Bluetooth sınıfıdır. BLE bağlantısının tüm yaşam döngüsünü yönetir: reklam veren cihazları taramaktan veri aktarımına ve bağlantı kesmeye kadar. CBCentralManager, CBCentralManagerDelegate aracılığıyla eşzamansız olarak çalışır ve Bluetooth yığınındaki olaylar hakkında uygulamayı bilgilendirir.

CBCentralManager'ı başlatmak, durum geri yükleme sürecini başlatır: yönetici, cihazdaki Bluetooth durumunu kontrol eder ve uygulama kapatıldıysa önceki bağlantıları geri yükler. Başlatma işlemi, Bluetooth durumuna bağlı olarak 50 ila 500 ms sürebilir. Uygulama, herhangi bir BLE işlemine başlamadan önce centralManagerDidUpdateState çağrısını beklemelidir.

Core Bluetooth mimarisi, Delegation desenine dayanır: CBCentralManager, olay işlemeyi (cihaz keşfi, bağlantı, hatalar) CBCentralManagerDelegate protokolüne devreder. Belirli bir çevre birimiyle çalışmak için, keşfedilen hizmetler, özellikler ve alınan veriler hakkında bildirimde bulunan CBPeripheralDelegate protokolü kullanılır. Bu eşzamansız model, bloke olmayan bir kullanıcı arayüzü sağlar.

CBCentralManager Durumları

CBCentralManager, BLE yığınının kullanılabilir olup olmadığını belirleyen birkaç durumdan geçer. Durum, temsilci aracılığıyla iletilir: centralManagerDidUpdateState(_:). Geliştirici, yalnızca poweredOn'ı değil, Bluetooth'un kapalı veya kullanılamadığı durumları da dahil olmak üzere tüm durumları işlemelidir.

DurumDeğerGeliştirici Eylemi
.poweredOnBluetooth açık ve hazırTaramayı başlat
.poweredOffBluetooth kapalıKullanıcıya uyarı göster
.unauthorizedİzin yokAyarlar'dan izin iste
.unsupportedCihaz BLE desteklemiyorBLE özelliklerini gizle
.unknownDurum tanımlı değilSonraki güncellemeyi bekle
.resettingBluetooth yeniden başlatılıyorKurtarmayı bekle

Yetkisiz durum, iOS 13+'tan itibaren giderek daha yaygın hale geliyor. Bu sürümden itibaren uygulamanın Info.plist'te NSBluetoothAlwaysUsageDescription iznine sahip olması gerekir. Bu izin olmadan, merkezi yönetici .unauthorized durumuna geçer ve tarama imkansızdır. Kullanıcı, Ayarlar > Gizlilik > Bluetooth'tan izni istediği zaman değiştirebilir.

BLE Cihazlarını Tarama

scanForPeripherals(withServices:options:), taramayı başlatmak için ana yöntemdir. withServices parametresi, filtreleme için bir hizmet UUID dizisi kabul eder: nil iletilirse tüm cihazlar keşfedilir ve bu da güç tüketimini önemli ölçüde artırır. Uygulama için gerekli hizmet UUID'lerine göre her zaman filtreleme yapılması önerilir. Tarama seçenekleri arasında CBCentralManagerScanOptionAllowDuplicatesKey (aynı cihaz hakkında tekrarlanan bildirimler) bulunur.

swift
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") // Pil Servisi

        centralManager.scanForPeripherals(
            withServices: [serviceUUID],
            options: [
                CBCentralManagerScanOptionAllowDuplicatesKey: false
            ]
        )
    }
}

Bir cihaz keşfedildiğinde, centralManager(_:didDiscover:advertisementData:rssi:) çağrılır. advertisementData parametresi, cihaz adı (CBAdvertisementDataLocalNameKey), hizmet UUID'leri (CBAdvertisementDataServiceUUIDsKey) ve üretici verileri (CBAdvertisementDataManufacturerDataKey) dahil olmak üzere reklam paketi verilerinin tam sözlüğünü içerir. RSSI, keşif anında kullanılabilen dBm cinsinden sinyal seviyesidir.

Çevre Birimine Bağlanma

connect(_:options:), keşfedilen bir çevre birimiyle BLE bağlantısı kurma yöntemidir. connect çağrıldıktan sonra iOS, cihaza bağlanmayı dener. Başarılı bağlantı centralManager(_:didConnect:) ile onaylanır, hata centralManager(_:didFailToConnect:error:) ile bildirilir. Bağlantı seçenekleri arasında arka plan bildirimleri için CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey ve CBConnectPeripheralOptionNotifyOnNotificationKey bulunur.

swift
// BLE cihazına bağlan
func connectToPeripheral(
    _ peripheral: CBPeripheral
) {
    centralManager.connect(peripheral, options: nil)

    // Çevre birimi için temsilci ayarla
    peripheral.delegate = self
}

// Temsilci: başarılı bağlantı
func centralManager(
    _ central: CBCentralManager,
    didConnect peripheral: CBPeripheral
) {
    print("Bağlandı: " +
          "\(peripheral.name ?? "unknown")")

    // Hizmet keşfini başlat
    peripheral.discoverServices(nil)
}

// Temsilci: bağlantı hatası
func centralManager(
    _ central: CBCentralManager,
    didFailToConnect peripheral: CBPeripheral,
    error: Error?
) {
    print("Connection failed: 
          \(error?.localizedDescription ?? "")")
}

iOS'ta bağlantı zaman aşımı 30 saniyedir. Cihaz bu süre içinde bağlantı isteğine yanıt vermezse didFailToConnect çağrılır. Zaman aşımı şunlardan etkilenir: cihaza olan mesafe, parazit ve cihazın şu anda reklam verip vermediği. Bağlanmadan önce cihazın bağlanabilir reklam modunda (ADV_IND, ADV_NONCONN_IND değil) olduğundan emin olun.

Hizmetleri ve Özellikleri Keşfetme

Bağlantıdan sonra, çevre biriminin hizmetlerini (discoverServices) ve özelliklerini (discoverCharacteristics) keşfetmelisiniz. Bu, veri okuma veya yazmadan önce zorunlu bir adımdır. Süreç eşzamansızdır: discoverServices sonuçları peripheral(_:didDiscoverServices:) aracılığıyla, discoverCharacteristics ise peripheral(_:didDiscoverCharacteristicsFor:error:) aracılığıyla döndürür.

discoverServices'a nil yerine ilgili UUID'lerden oluşan bir dizi iletilmesi önerilir. Filtreleme keşfi hızlandırır ve enerji tasarrufu sağlar. Bir hizmet bulunamazsa, iOS boş bir dizi bildirir. Özellikleri keşfettikten sonra değerlerini okuyabilir (readValue), bildirimlere abone olabilir (setNotifyValue) veya veri yazabilirsiniz (writeValue).

Önemli bir nüans: MTU, bağlantıdan sonra otomatik olarak müzakere edilir. Geçerli MTU'yu almak için peripheral.maximumWriteValueLength(for: .withResponse) veya .withoutResponse kullanın. iOS'ta BLE 5.0 cihazlar için maksimum MTU 512 bayttır. MTU'dan büyük veri aktarmanız gerekiyorsa, uygulama düzeyinde parçalama uygulayın.

Arka Plan Taraması ve iOS Sınırlamaları

iOS'ta BLE cihazlarının arka plan taraması özel yapılandırma gerektirir. Core Bluetooth, arka plan yürütmeyi destekler, ancak önemli sınırlamalarla. Arka planda çalışmak için şunları yapmanız gerekir: proje Yetenekleri'nde Background Modes'da bluetooth-central'ı etkinleştirin, durum geri yükleme için CBCentralManagerOptionRestoreIdentifierKey seçeneğiyle CBCentralManager'ı başlatın ve arka plana geçerken merkezi yönetici olaylarını işleyin.

iOS'ta arka plan BLE sınırlamaları: UUID filtrelemesi olmadan scanForPeripherals arka planda çalışmaz. Uygulama, tarama için somut hizmet UUID'leri belirtmelidir. iOS, BLE olaylarının teslimatını süresiz olarak geciktirebilir. Core Bluetooth, uygulama arka planda olsa bile eşleşen bir cihaz keşfedildiğinde taramayı otomatik olarak devam ettirir. Arka plan tarama zaman aşımı: iOS, enerji tasarrufu için 10-30 dakika sonra taramayı durdurabilir.

State Restoration, uygulama yeniden başlatma veya iOS yeniden başlatmasından sonra BLE bağlantılarını geri yüklemeye olanak tanıyan bir Core Bluetooth mekanizmasıdır. Kullanmak için: başlatma sırasında CBCentralManagerOptionRestoreIdentifierKey belirtin, temsilcide centralManager(_:willRestoreState:) uygulayın ve iletilen sözlükten bağlı çevre birimlerinin listesini geri yükleyin. State Restoration, fitness takip cihazları veya tıbbi cihazlar gibi arka planda çalışan BLE uygulamaları için kritik bir işlevdir.

Hata Yönetimi ve Bağlantı Kurtarma

CBCentralManager çeşitli senaryolarda hata oluşturur: bağlantı başarısız (didFailToConnect), bağlantı kesildi (didDisconnectPeripheral), özellik okuma/yazma için kullanılamıyor (didWriteValue hatası). Tüm Core Bluetooth hataları, CBErrorDomain alanına sahip Error nesnesi aracılığıyla döndürülür. En yaygın kodlar: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).

Bağlantı kurtarma stratejisi: didDisconnectPeripheral alındığında hata kodunu kontrol edin. Hata CBErrorConnectionTimeout veya CBErrorPeripheralDisconnected ise — 1-5 saniye içinde otomatik yeniden bağlanma planlayın. Hata CBErrorOperationNotSupported ise — günlüğe kaydedin ve işlemi tekrar denemeyin. Kritik bağlantılar (tıbbi cihazlar) için maksimum 60 saniye aralıklı üstel geri alma kullanın.

swift
// Otomatik yeniden bağlanmayla bağlantı kesmeyi yönet
func centralManager(
    _ central: CBCentralManager,
    didDisconnectPeripheral peripheral: CBPeripheral,
    error: Error?
) {
    guard let error = error else {
        return // Beklenen bağlantı kesme
    }

    print("Disconnected: \(error.localizedDescription)")

    // Otomatik yeniden bağlanma
    if shouldAutoReconnect {
        DispatchQueue.main.asyncAfter(
            deadline: .now() + reconnectDelay
        ) {
            central.connect(peripheral)
        }
    }
}

iOS'ta sağlam bir BLE uygulaması geliştirirken şunları unutmayın: Core Bluetooth, zayıf sinyalde tüm paketlerin teslimatını garanti etmez. Güvenilir iletim için writeType .withResponse (onaylı yazma) kullanın ve çevre biriminden veri almak için bildirimlere (setNotifyValue) abone olun. Üretimde bağlantı sorunlarını teşhis etmek için bir hata günlüğü tutun.

Sıkça Sorulan Sorular

CBCentralManager neden cihazları algılamıyor?

centralManagerDidUpdateState aracılığıyla yönetici durumunu kontrol edin. Info.plist'te NSBluetoothAlwaysUsageDescription izninin olduğundan, cihazda Bluetooth'un etkin olduğundan ve çevre birimi cihazının doğru türde (bağlanabilir reklam, bağlanamaz değil) reklam verdiğinden emin olun.

iOS'a aynı anda kaç BLE cihazı bağlanabilir?

BLE 5.0 destekli cihazlarda (iPhone 8 ve üzeri) — 7 eşzamanlı bağlantıya kadar. Daha eski cihazlarda — 3-5'e kadar. Taranan cihaz sayısı sınırsızdır, ancak aktif bağlantıların Bluetooth Denetleyicisi tarafından belirlenen katı bir sınırı vardır.

Pili tüketmeden iOS'ta BLE'yi ne sıklıkta tarayabilirim?

UUID filtrelemesiyle tarama yapmanız ve cihaz bulunduğunda taramayı durdurmanız önerilir. Sürekli tarama pili tüketir: 1 saat kesintisiz tarama, iPhone şarjının ~%10-15'ini tüketir. Taramayı durdurmak için zamanlayıcılar ve koşullar kullanın.

CBCentralManager ve CBPeripheralManager arasındaki fark nedir?

CBCentralManager, harici BLE cihazlarını (Central rolü) taramak ve bağlanmak içindir. CBPeripheralManager, iOS cihazınızın BLE çevre birimi olarak hareket etmesi (hizmetleri reklam vermesi) içindir. Bir örnek yalnızca bir rolde olabilir.

BLE cihazıyla bağlantı kaybı nasıl işlenir?

centralManager(_:didDisconnectPeripheral:error:) uygulayın. Hata nil değilse — üstel geri almayla (1 sn → 2 sn → 4 sn → 8 sn → maks 60 sn) otomatik yeniden bağlanma planlayın. Hata nil ise — cihaz normal şekilde bağlantıyı kesmiştir (örneğin, kullanıcı cihazdaki bir düğmeye bastı).

Özet

  • CBCentralManager, iOS'ta Central rolünde BLE taraması, bağlantılar ve veri aktarımını yöneten ana Core Bluetooth sınıfıdır.
  • Tarama, güç tüketimini azaltmak için isteğe bağlı hizmet UUID filtrelemesiyle scanForPeripherals aracılığıyla başlatılır.
  • Bağlantı connect aracılığıyla gerçekleştirilir, başarı didConnect ile, hata 30 saniyelik zaman aşımıyla didFailToConnect ile onaylanır.
  • Bağlantıdan sonra, discoverServices ve discoverCharacteristics aracılığıyla hizmetler ve özellikler keşfedilmelidir.
  • Arka plan taraması bluetooth-central Background Mode gerektirir ve sınırlamalarla (UUID filtreleme, olası gecikmeler) desteklenir.
  • iOS, BLE 5.0 cihazlarda 7 eşzamanlı BLE bağlantısına kadar destekler, yeniden başlatma sonrası kurtarma için durum geri yükleme.
  • Hata yönetimi ve üstel geri alma ile otomatik yeniden bağlanma, iOS'ta güvenilir bir BLE uygulamasının temelidir.

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