2015-05-20 18 views
7

Tôi đang cố gắng nghe tất cả các sự kiện kết nối/ngắt kết nối Bluetooth. Mặc dù chức năng centralManagerDidUpdateState của đại biểu được gọi, không có gì xảy ra khi tôi kết nối hoặc ngắt kết nối thiết bị Bluetooth.Chức năng kết nối đại biểu iOS Bluetooth không được gọi là

Tôi đang nhầm lẫn về những gì đang xảy ra. Tôi khởi sự Trung ương quản lý/đại biểu như thế này:

var btDelegate: CBCentralManagerDelegate = BluetoothDelegate() 
var btManager = CBCentralManager(delegate: btDelegate, queue: nil) 

BluetoothDelegate được định nghĩa như sau:

import Foundation 
import CoreBluetooth 

class BluetoothDelegate : NSObject, CBCentralManagerDelegate { 

    func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) { 
     println("connect") //this line is not called 
    } 
    func centralManager(central: CBCentralManager!, didDisconnectPeripheral peripheral: CBPeripheral!, error: NSError!) { 
     println("disconnect") //this line is not called 
    } 

    func centralManagerDidUpdateState(central: CBCentralManager!) { 
     println("state update") //this line is called 
    } 
} 

Lưu ý: Tôi có thể liên tục nhận được nhiều sự kiện cập nhật trạng thái như khi tôi chuyển đổi Bluetooth, mặc dù kết nối và ngắt kết nối không được gọi.

+0

tôi đã không quen bản thân mình nhưng với cách cư xử Swift khi bạn có một tham chiếu đến một lớp cơ sở nhưng gán một đối tượng lớp được thừa kế hay - vì thế nếu btDelegate nên có loại BluttoothDelegate thay vì CBCentralManagerDelegate hay không tôi không thể nói. Nhưng nếu bạn không nhận được câu trả lời nào khác thì đó là một cái gì đó để thử. – Gruntcakes

+0

Tôi vừa thử sử dụng BluetoothDelegate thay vì CBCentralManagerDelegate, nhưng hành vi không khác nhau. Nó là giá trị một thử mặc dù. Cảm ơn đã giúp đỡ! – lakantu

+0

Đó là một trường trong lớp chúng tôi sử dụng; Tôi không nghĩ nó đã vượt quá phạm vi. Tôi không biết đó là một tài liệu tham khảo yếu - đó là điều tốt để biết. – lakantu

Trả lời

1

Từ mã của bạn có vẻ như bạn chưa bắt đầu quét tìm thiết bị ngoại vi. Một khi bạn đã xác nhận rằng trung tâm của bạn được hỗ trợ trên trạng thái từ phương pháp centralManagerDidUpdateState, bạn nên bắt đầu quét cho các thiết bị ngoại vi của bạn.

(Thiết bị bluetooth bạn kết nối từ bảng cài đặt bluetooth không liên quan. Bạn không thể có quyền truy cập vào chúng. (theo như tôi biết) Trong trường hợp bạn muốn quét và tìm thiết bị của mình dưới mã của riêng bạn sẽ giúp)

func centralManagerDidUpdateState(central: CBCentralManager!) { 
    switch (central.state) { 
    case CBCentralManagerState.PoweredOff: 
    break 
    case CBCentralManagerState.PoweredOn: 
    startScan() // start scanning once the bluetooth is On 
    break 
    default: 
    break 
    } 
} 

Và phương pháp startScan của bạn sẽ được (bạn có thể cung cấp dịch vụ UUID, sử dụng nil nếu bạn muốn tất cả)

func startScan(){ 
    if let central = btManager { 
    central.scanForPeripheralsWithServices(nil, options: nil) 
    println("started Scanning") 
    } 
} 

Sau đó bất cứ khi nào bạn phát hiện ra mộtngoại vi Phương phápsẽ được gọi trước.

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) { 
    println(peripheral) 
    // btManager.connectPeripheral(peripheral, options: nil) 
} 

Từ đó bạn thu thập các thiết bị ngoại vi và sau đó gọi connectPeripheral phương pháp CBCentralManager. Nếu kết nối thành công, phương pháp didConnectPeripheral sẽ được gọi.

Bạn nên đi qua this documentation để biết chi tiết hoàn chỉnh

Các vấn đề liên quan