iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Mobile Development

我將成為Swift之強者系列 第 26

Day26 - iOS 藍芽開發實作:建立藍芽服務與掃描連接

  • 分享至 

  • xImage
  •  

Day26 - iOS 藍芽開發實作:建立藍芽服務與掃描連接

在 iOS 上進行藍芽 (Bluetooth) 開發,第一步當然就是先把環境準備好。
今天就帶大家一步一步完成專案初始化,並建立一個可以掃描、連接藍芽裝置的 Service。
未來我們還會逐步擴充更多功能,包含資料傳輸與 BLE 特徵值操作!


前置作業:設定 Info.plist

因為我們要使用藍芽,必須在 Info.plist 裡加入權限描述,不然 App 一開就會閃退。

請在專案的 Info.plist 新增以下 Key:

Privacy - Bluetooth Always Usage Description

並填入一段說明文字,例如:

允許使用藍芽功能來連接周邊裝置。

這樣 App 才能在啟動時正常要求藍芽權限。


建立 BluetoothServices.swift

接著,我們來建立一個 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)
}

這裡實作了四個常見方法:

  • startScan():開始掃描藍芽裝置
  • stopScan():停止掃描
  • connectPeripheral():嘗試連接指定裝置
  • disconnectPeripheral():中斷與裝置的連線

結語

今天我們完成了藍芽開發的第一步,建立了整個 藍芽核心服務架構,內容包含:

  • 在 Info.plist 設定藍芽權限
  • 建立 BluetoothServices 類別並使用 Singleton 設計
  • 初始化 CBCentralManager 並放入背景執行緒
  • 完成掃描、連線與斷線的基本操作

明天(Day27)我們將繼續實作 藍芽事件回呼與掃描結果顯示
讓我們的 App 真正能夠看到附近的藍芽裝置清單!



上一篇
Day25- 天氣 API 實作:XIB及程式碼展示(下)
下一篇
Day27 - iOS 藍芽開發實作:掃描裝置、連線與接收資料
系列文
我將成為Swift之強者30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言