2015-05-20 10 views
7

Próbuję odsłuchać wszystkie zdarzenia połączenia/rozłączenia Bluetooth. Mimo że funkcja delegata nazywa się centralManagerDidUpdateState, nic się nie dzieje, gdy podłączam lub odłączam urządzenia Bluetooth.Funkcja łączenia delegatów Bluetooth iOS nie jest wywoływana

Jestem zdezorientowany, co się dzieje źle. I zainicjować Centralny kierownik/delegata tak:

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

BluetoothDelegate jest zdefiniowane tak:

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 
    } 
} 

Uwaga: mogę ciągle otrzymać więcej wydarzeń aktualizacji stanów takich jak, kiedy włączyć Bluetooth, choć podłącz i odłącz nie są wywoływane.

+0

I już nie zapoznałem się jeszcze z tym, jak Swift zachowuje się, gdy masz odniesienie do klasy bazowej, ale przypisać obiekt klasy pochodnej do niej - stąd jeśli btDelegate powinny być wpisz BluttoothDelegate zamiast CBCentralManagerDelegate lub nie mogę powiedzieć. Ale jeśli nie otrzymasz innych odpowiedzi, musisz spróbować. – Gruntcakes

+0

Po prostu próbowałem używać BluetoothDelegate zamiast CBCentralManagerDelegate, ale zachowanie nie było inne. Warto było jednak spróbować. Dzięki za pomoc! – lakantu

+0

To pole w klasie, z której korzystamy; Nie sądzę, że kiedykolwiek wykracza poza zakres. Nie wiedziałem, że to słabe odniesienie - to dobrze wiedzieć. – lakantu

Odpowiedz

1

Z Twojego kodu wygląda na to, że nie rozpocząłeś skanowania urządzeń peryferyjnych. Po potwierdzeniu, że centrala jest zasilana przy użyciu metody centralManagerDidUpdateState, należy rozpocząć skanowanie w poszukiwaniu urządzeń peryferyjnych.

(Urządzenia Bluetooth podłączone z panelu ustawień Bluetooth nie mają znaczenia Nie możesz mieć do nich dostępu (o ile mi wiadomo) Jeśli chcesz skanować i znajdować swoje urządzenie we własnym kodzie poniżej pomoże)

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 
    } 
} 

A twój startScan metoda będzie (można podać UUID serwisowym, należy nil jeśli chcesz wszystkie)

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

Po że kiedy odkryjesz obwodowych didDiscoverPeripheral metoda zostanie wywołana jako pierwsza.

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

Stamtąd zebrać obwodowego, a następnie powołać connectPeripheral metodę CBCentralManager. Jeśli połączenie zakończy się powodzeniem, zostanie wywołana metoda didConnectPeripheral.

Należy przejść this documentation dla kompletnych informacji

Powiązane problemy