2015-05-20 15 views
7

Ich versuche, alle Bluetooth Verbindung/trennen Ereignisse zu hören. Obwohl die Funktion centralManagerDidUpdateState des Delegierten aufgerufen wird, passiert nichts, wenn ich Bluetooth-Geräte verbinde oder trenne.iOS Bluetooth Delegate Connect-Funktion nicht angerufen

Ich bin verwirrt, was falsch los ist. Ich initialisieren den Central Manager/Delegierten wie folgt aus:

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

BluetoothDelegate wie so definiert:

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

Hinweis: Ich kann kontinuierlich mehr Zustandsaktualisierungsereignisse empfangen, wie wenn ich Bluetooth umschalten, obwohl Verbinden und Trennen werden nicht aufgerufen.

+0

ich mich nicht vertraut gemacht habe noch mit, wie Swift verhält, wenn Sie einen Verweis auf eine Basisklasse, sondern eine abgeleitete Klasse Objekt zuweisen - also wenn btDelegate sein sollten Typ BluttoothDelegate statt CBCentralManagerDelegate oder nicht kann ich nicht sagen. Aber wenn Sie keine anderen Antworten bekommen, sollten Sie es versuchen. – Gruntcakes

+0

Ich habe gerade versucht, BluetoothDelegate anstelle von CBCentralManagerDelegate zu verwenden, aber das Verhalten war nicht anders. Es war einen Versuch wert. Danke für die Hilfe! – lakantu

+0

Es ist ein Feld in einer Klasse, die wir verwenden; Ich denke nicht, dass es jemals außer Reichweite gerät. Ich wusste nicht, dass das eine schwache Referenz war - das ist gut zu wissen. – lakantu

Antwort

1

aus dem Code sieht es aus wie Sie das Scannen für Peripheriegeräte nicht begonnen haben. Sobald Sie bestätigt haben, dass sich Ihre Zentrale im eingeschalteten Zustand befindet, sollten Sie von centralManagerDidUpdateState aus nach Ihren Peripheriegeräten suchen.

(Die Bluetooth-Geräte, die Sie über die Bluetooth-Einstellungen verbunden haben, sind irrelevant. Sie können nicht darauf zugreifen. (soweit ich weiß) Incase Sie wollen scannen und finden Sie Ihr Gerät unter Ihrem Code Hilfe) wird

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

Und Ihre startScan Methode wird (Sie Dienst UUID zur Verfügung stellen kann, verwenden nil, wenn Sie alle wollen)

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

Danach, wenn Sie eine periphereentdeckenMethode wird zuerst aufgerufen.

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

Von dort sammeln Sie das periphere Gerät und dann connectPeripheral Methode von CBCentralManager aufzurufen. Wenn die Verbindung erfolgreich ist, wird didConnectPeripheral Methode aufgerufen.

Sie sollten für vollständige Details über this documentation gehen

Verwandte Themen