在 iOS 上進行藍芽 (Bluetooth) 開發,第一步當然就是先把環境準備好。
今天就帶大家一步一步完成專案初始化,並建立一個可以掃描、連接藍芽裝置的 Service。
未來我們還會逐步擴充更多功能,包含資料傳輸與 BLE 特徵值操作!
因為我們要使用藍芽,必須在 Info.plist 裡加入權限描述,不然 App 一開就會閃退。
請在專案的 Info.plist 新增以下 Key:
Privacy - Bluetooth Always Usage Description
並填入一段說明文字,例如:
允許使用藍芽功能來連接周邊裝置。
這樣 App 才能在啟動時正常要求藍芽權限。
接著,我們來建立一個 BluetoothServices.swift 檔案,這個檔案會專門負責藍芽相關操作。
先匯入核心框架:
import CoreBluetooth
接著建立 BluetoothServices 類別,並設計成 單例模式 (Singleton),方便在任何地方呼叫同一個藍芽管理實例:
class BluetoothServices: NSObject {
    
    static let shared = BluetoothServices()
    
    var central: CBCentralManager?
    var peripheral: CBPeripheralManager?
    var connectedPeripheral: CBPeripheral?
    var rxtxCharacteristic: CBCharacteristic?
    
    private var bluePeripherals: [CBPeripheral] = []
}
CBCentralManager:掃描與連接外部藍芽設備CBPeripheralManager:管理本地藍芽(例如讓手機作為外設)connectedPeripheral:目前已連線的裝置rxtxCharacteristic:負責資料傳輸的特徵值bluePeripherals:儲存掃描到的藍芽設備列表藍芽掃描屬於耗時操作,因此在初始化時,我們讓它在背景執行緒運行,避免阻塞主執行緒。
private override init() {
    super.init()
    
    let queue = DispatchQueue.global()
    central = CBCentralManager(delegate: self, queue: queue)
}
這邊使用 DispatchQueue.global() 建立背景 Queue,交由 CBCentralManager 處理藍芽事件。
這樣整個掃描與連線過程就能保持順暢,不會卡住畫面。
接著我們來補上幾個基本操作方法:
// 開始掃描藍芽裝置
func startScan() {
    central?.scanForPeripherals(withServices: nil, options: nil)
}
// 停止掃描
func stopScan() {
    central?.stopScan()
}
// 嘗試連線指定的藍芽裝置
func connectPeripheral(peripheral: CBPeripheral) {
    self.connectedPeripheral = peripheral
    central?.connect(peripheral, options: nil)
}
// 中斷與指定藍芽裝置的連線
func disconnectPeripheral(peripheral: CBPeripheral) {
    central?.cancelPeripheralConnection(peripheral)
}
這裡實作了四個常見方法:
今天我們完成了藍芽開發的第一步,建立了整個 藍芽核心服務架構,內容包含:
BluetoothServices 類別並使用 Singleton 設計CBCentralManager 並放入背景執行緒明天(Day27)我們將繼續實作 藍芽事件回呼與掃描結果顯示,
讓我們的 App 真正能夠看到附近的藍芽裝置清單!