CBCentralManager di iOS — apa itu, manajemen BLE dan Core Bluetooth

Penulis: IT Sectr Diterbitkan: 2026-07-16 Waktu membaca: 11 mnt

CBCentralManager — adalah kelas utama dari framework Core Bluetooth di iOS yang mengelola pemindaian, koneksi, dan interaksi dengan perangkat periferal BLE. Core Bluetooth (iOS 5+, 2011) menyediakan abstraksi tingkat tinggi di atas tumpukan BLE pada level GATT, menyembunyikan detail Link Layer dan HCI dari pengembang. CBCentralManager menjalankan peran Central: ia memindai eter melalui scanForPeripherals, memulai koneksi melalui connect, menemukan layanan melalui discoverServices, dan mengelola transfer data. Menurut Apple Developer Documentation (2024), CBCentralManager mendukung hingga 7 koneksi BLE simultan pada perangkat dengan BLE 5.0.

Poin Penting

  • CBCentralManager — kelas iOS untuk mengelola pemindaian BLE, koneksi, dan transfer data dalam peran Central.
  • Pemindaian dimulai melalui scanForPeripherals dengan penyaringan berdasarkan UUID layanan untuk menghemat energi.
  • Koneksi dilakukan melalui connect(peripheral:options:) dengan pelacakan status melalui delegasi.
  • iOS mendukung hingga 7 koneksi BLE simultan pada perangkat dengan BLE 5.0.
  • Pemindaian latar belakang memerlukan aktivasi bluetooth-central di Background Modes dan penggunaan CBCentralManagerScanOptionAllowDuplicatesKey.

Apa itu CBCentralManager?

CBCentralManager — adalah kelas utama Core Bluetooth untuk mengimplementasikan peran Central dalam arsitektur BLE di iOS. Kelas ini mengelola seluruh siklus hidup koneksi BLE: dari memindai perangkat yang mengiklankan hingga transfer data dan pemutusan koneksi. CBCentralManager bekerja secara asinkron melalui delegasi CBCentralManagerDelegate, memberitahu aplikasi tentang peristiwa di tumpukan Bluetooth.

Inisialisasi CBCentralManager memulai proses state restoration: manajer memeriksa status Bluetooth pada perangkat dan memulihkan koneksi sebelumnya jika aplikasi ditutup. Proses inisialisasi dapat memakan waktu 50 hingga 500 ms tergantung pada status Bluetooth. Aplikasi harus menunggu panggilan centralManagerDidUpdateState sebelum memulai operasi BLE apa pun.

Arsitektur Core Bluetooth dibangun di atas pola Delegation: CBCentralManager mendelegasikan penanganan peristiwa (penemuan perangkat, koneksi, kesalahan) ke protokol CBCentralManagerDelegate. Untuk bekerja dengan Peripheral tertentu, digunakan protokol CBPeripheralDelegate yang memberitahu tentang penemuan layanan, karakteristik, dan penerimaan data. Model asinkron ini memastikan UI tidak terblokir.

Status CBCentralManager

CBCentralManager melewati beberapa status yang menentukan apakah tumpukan BLE tersedia untuk digunakan. Status ditransmisikan melalui delegasi: centralManagerDidUpdateState(_:). Pengembang harus menangani semua status — tidak hanya poweredOn, tetapi juga kasus ketika Bluetooth dimatikan atau tidak tersedia.

StatusArtiTindakan pengembang
.poweredOnBluetooth menyala dan siapMulai pemindaian
.poweredOffBluetooth dimatikanTampilkan peringatan ke pengguna
.unauthorizedTidak ada izinMinta izin di Pengaturan
.unsupportedPerangkat tidak mendukung BLESembunyikan fungsi BLE
.unknownStatus tidak ditentukanTunggu pembaruan berikutnya
.resettingBluetooth sedang diatur ulangTunggu pemulihan

Unauthorized state menjadi semakin umum sejak iOS 13+. Mulai dari versi ini, aplikasi harus memiliki izin NSBluetoothAlwaysUsageDescription di Info.plist. Tanpa itu, manajer pusat beralih ke status .unauthorized dan pemindaian tidak mungkin dilakukan. Pengguna dapat mengubah izin kapan saja di Pengaturan > Privasi > Bluetooth.

Memindai perangkat BLE

scanForPeripherals(withServices:options:) — metode utama untuk memulai pemindaian. Parameter withServices menerima array UUID layanan untuk penyaringan: jika nil dikirimkan, semua perangkat akan ditemukan, yang secara signifikan meningkatkan konsumsi energi. Disarankan untuk selalu memfilter berdasarkan UUID layanan yang dibutuhkan aplikasi. Opsi pemindaian termasuk CBCentralManagerScanOptionAllowDuplicatesKey (pemberitahuan berulang tentang perangkat yang sama).

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") // Layanan Baterai

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

Saat perangkat ditemukan, centralManager(_:didDiscover:advertisementData:rssi:) dipanggil. Parameter advertisementData berisi kamus lengkap data paket iklan, termasuk nama perangkat (CBAdvertisementDataLocalNameKey), UUID layanan (CBAdvertisementDataServiceUUIDsKey) dan data pabrikan (CBAdvertisementDataManufacturerDataKey). RSSI — tingkat sinyal dalam dBm, tersedia pada saat penemuan.

Terhubung ke Peripheral

connect(_:options:) — metode untuk menjalin koneksi BLE dengan Peripheral yang ditemukan. Setelah panggilan connect, iOS mencoba terhubung ke perangkat. Koneksi berhasil dikonfirmasi oleh panggilan centralManager(_:didConnect:), kesalahan oleh centralManager(_:didFailToConnect:error:). Opsi koneksi termasuk CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey dan CBConnectPeripheralOptionNotifyOnNotificationKey untuk pemberitahuan latar belakang.

swift
// Hubungkan ke perangkat BLE
func connectToPeripheral(
    _ peripheral: CBPeripheral
) {
    centralManager.connect(peripheral, options: nil)

    // Atur delegasi untuk Peripheral
    peripheral.delegate = self
}

// Delegasi: koneksi berhasil
func centralManager(
    _ central: CBCentralManager,
    didConnect peripheral: CBPeripheral
) {
    print("Terhubung ke " +
          "\(peripheral.name ?? "unknown")")

    // Mulai penemuan layanan
    peripheral.discoverServices(nil)
}

// Delegasi: kesalahan koneksi
func centralManager(
    _ central: CBCentralManager,
    didFailToConnect peripheral: CBPeripheral,
    error: Error?
) {
    print("Connection failed: 
          \(error?.localizedDescription ?? "")")
}

Batas waktu koneksi di iOS adalah 30 detik. Jika perangkat tidak merespons permintaan koneksi dalam waktu ini, didFailToConnect dipanggil. Faktor yang mempengaruhi batas waktu: jarak ke perangkat, interferensi, apakah perangkat saat ini mengiklankan. Sebelum terhubung, pastikan perangkat dalam mode connectable advertising (ADV_IND, bukan ADV_NONCONN_IND).

Menemukan layanan dan karakteristik

Setelah terhubung perlu ditemukan layanan (discoverServices) dan karakteristik (discoverCharacteristics) dari Peripheral. Ini adalah langkah wajib sebelum membaca atau menulis data. Prosesnya asinkron: discoverServices mengembalikan hasil melalui peripheral(_:didDiscoverServices:), dan discoverCharacteristics melalui peripheral(_:didDiscoverCharacteristicsFor:error:).

Disarankan untuk mengirimkan array UUID yang diminati ke discoverServices, bukan nil. Penyaringan mempercepat penemuan dan menghemat energi. Jika layanan tidak ditemukan, iOS akan melaporkan array kosong. Setelah karakteristik ditemukan, nilainya dapat dibaca (readValue), berlangganan pemberitahuan (setNotifyValue) atau menulis data (writeValue).

Nuansa penting: MTU dinegosiasikan secara otomatis setelah koneksi. Untuk mendapatkan MTU saat ini, gunakan peripheral.maximumWriteValueLength(for: .withResponse) atau .withoutResponse. Di iOS, MTU maksimum adalah 512 byte untuk perangkat BLE 5.0. Jika perlu mentransfer data yang lebih besar dari MTU, terapkan fragmentasi di tingkat aplikasi.

Pemindaian latar belakang dan batasan iOS

Pemindaian latar belakang perangkat BLE di iOS memerlukan konfigurasi khusus. Core Bluetooth mendukung eksekusi latar belakang, tetapi dengan batasan yang signifikan. Untuk bekerja di latar belakang, diperlukan: aktifkan bluetooth-central di Background Modes di Capabilities proyek, inisialisasi CBCentralManager dengan opsi CBCentralManagerOptionRestoreIdentifierKey untuk state restoration, dan tangani peristiwa manajer pusat saat beralih ke latar belakang.

Batasan BLE latar belakang di iOS: scanForPeripherals tanpa penyaringan UUID tidak berfungsi di latar belakang. Aplikasi harus menentukan UUID layanan tertentu untuk pemindaian. iOS dapat menunda pengiriman peristiwa BLE untuk waktu yang tidak ditentukan. Core Bluetooth secara otomatis melanjutkan pemindaian saat menemukan perangkat yang cocok, bahkan jika aplikasi berada di latar belakang. Batas waktu pemindaian latar belakang: iOS dapat menghentikan pemindaian setelah 10–30 menit untuk menghemat energi.

State Restoration — mekanisme Core Bluetooth yang memungkinkan pemulihan koneksi BLE setelah restart aplikasi atau reboot iOS. Untuk penggunaan: tentukan CBCentralManagerOptionRestoreIdentifierKey saat inisialisasi, implementasikan centralManager(_:willRestoreState:) di delegasi dan pulihkan daftar Peripheral yang terhubung dari kamus yang dikirimkan. State Restoration adalah fungsi penting untuk aplikasi BLE yang bekerja di latar belakang, seperti pelacak kebugaran atau perangkat medis.

Penanganan kesalahan dan pemulihan koneksi

CBCentralManager menghasilkan kesalahan dalam beberapa skenario: koneksi gagal (didFailToConnect), koneksi terputus (didDisconnectPeripheral), karakteristik tidak tersedia untuk baca/tulis (didWriteValue error). Semua kesalahan Core Bluetooth dikembalikan melalui objek Error dengan domain CBErrorDomain. Kode yang paling umum: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).

Strategi pemulihan koneksi: saat menerima didDisconnectPeripheral, periksa kode kesalahan. Jika kesalahan adalah CBErrorConnectionTimeout atau CBErrorPeripheralDisconnected — jadwalkan koneksi ulang otomatis setelah 1–5 detik. Jika kesalahan adalah CBErrorOperationNotSupported — catat dan jangan coba mengulangi operasi. Untuk koneksi kritis (perangkat medis) gunakan exponential backoff dengan interval maksimum 60 detik.

swift
// Tangani pemutusan dengan koneksi ulang otomatis
func centralManager(
    _ central: CBCentralManager,
    didDisconnectPeripheral peripheral: CBPeripheral,
    error: Error?
) {
    guard let error = error else {
        return // Pemutusan yang diharapkan
    }

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

    // Koneksi ulang otomatis
    if shouldAutoReconnect {
        DispatchQueue.main.asyncAfter(
            deadline: .now() + reconnectDelay
        ) {
            central.connect(peripheral)
        }
    }
}

Saat mengembangkan aplikasi BLE yang andal di iOS, pertimbangkan: Core Bluetooth tidak menjamin pengiriman semua paket saat sinyal lemah. Untuk transfer yang andal, gunakan writeType .withResponse (penulisan terkonfirmasi) dan berlangganan pemberitahuan (setNotifyValue) untuk menerima data dari Peripheral. Simpan log kesalahan untuk mendiagnosis masalah koneksi di produksi.

Pertanyaan Umum

Mengapa CBCentralManager tidak mendeteksi perangkat?

Periksa status manajer melalui centralManagerDidUpdateState. Pastikan izin NSBluetoothAlwaysUsageDescription ada di Info.plist, Bluetooth aktif di perangkat, dan perangkat periferal mengiklankan dengan tipe yang benar (connectable advertising, bukan non-connectable).

Berapa banyak perangkat BLE yang dapat terhubung secara simultan ke iOS?

Pada perangkat dengan BLE 5.0 (iPhone 8 dan lebih baru) — hingga 7 koneksi simultan. Pada perangkat yang lebih lama — hingga 3–5. Jumlah perangkat yang dipindai tidak terbatas, tetapi koneksi aktif memiliki batas ketat yang ditetapkan oleh Bluetooth Controller.

Seberapa sering saya dapat memindai BLE di iOS tanpa kehilangan baterai?

Disarankan memindai dengan filter UUID dan mematikan pemindaian saat perangkat ditemukan. Pemindaian terus-menerus menghabiskan baterai: 1 jam pemindaian terus-menerus mengkonsumsi ~10–15% baterai iPhone. Gunakan timer dan kondisi untuk menghentikan pemindaian.

Apa perbedaan antara CBCentralManager dan CBPeripheralManager?

CBCentralManager — untuk memindai dan terhubung ke perangkat BLE eksternal (peran Central). CBPeripheralManager — agar perangkat iOS Anda sendiri bertindak sebagai periferal BLE (mengiklankan layanan). Satu instance hanya dapat berada dalam satu peran.

Bagaimana cara menangani kehilangan koneksi dengan perangkat BLE?

Implementasikan centralManager(_:didDisconnectPeripheral:error:). Jika kesalahan tidak nil — jadwalkan koneksi ulang otomatis dengan exponential backoff (1 detik → 2 → 4 → 8 → maks 60). Jika kesalahan nil — perangkat terputus secara normal (misalnya, pengguna menekan tombol pada perangkat).

Kesimpulan

  • CBCentralManager — kelas utama Core Bluetooth untuk mengelola pemindaian BLE, koneksi, dan transfer data dalam peran Central di iOS.
  • Pemindaian dimulai melalui scanForPeripherals dengan penyaringan opsional UUID layanan untuk mengurangi konsumsi energi.
  • Koneksi dilakukan melalui connect, keberhasilan dikonfirmasi oleh didConnect, kesalahan oleh didFailToConnect dengan batas waktu 30 detik.
  • Setelah terhubung, layanan dan karakteristik harus ditemukan melalui discoverServices dan discoverCharacteristics.
  • Pemindaian latar belakang memerlukan bluetooth-central Background Mode dan didukung dengan batasan (penyaringan UUID, kemungkinan penundaan).
  • iOS mendukung hingga 7 koneksi BLE simultan pada perangkat dengan BLE 5.0, state restoration untuk pemulihan setelah restart.
  • Penanganan kesalahan dan koneksi ulang otomatis dengan exponential backoff — dasar aplikasi BLE yang andal di iOS.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga