2016-04-23 1 views
2

Je suis novice dans la programmation de Swift et Mac/iOs en général. Je cours cet exemple sur un Macbook Pro avec le soutien de BLE et avec le Bluetooth activé, utilisant Xcode 7.3.Core Bluetooth CBCentralManager signale toujours l'état Inconnu sur Mac

import Foundation 
import CoreBluetooth 

func printState(state: CBCentralManagerState) { 
    switch state { 
    case CBCentralManagerState.PoweredOn: 
     print("Powered on") 
    case CBCentralManagerState.PoweredOff: 
     print("Powered off") 
    case CBCentralManagerState.Resetting: 
     print("Resetting") 
    case CBCentralManagerState.Unauthorized: 
     print("Unauthorized") 
    case CBCentralManagerState.Unknown: 
     print("Unknown") 
    default: 
     print ("Unsupported") 
    } 

} 

var myCentralManager = CBCentralManager(delegate:nil, queue:nil) 
while true { 
    printState(myCentralManager.state) 
    sleep(1) 
} 

Le code imprime "Inconnu" encore et encore, même après plusieurs minutes. J'ai également essayé de mettre en place un délégué mais le rappel de didUpdateState n'est pas appelé. J'ai aussi essayé de lancer ceci à partir de la ligne de commande et de l'interpréteur Swift pour obtenir le même résultat.

Il me manque quelque chose de très basique. Comment puis-je l'obtenir pour signaler que CBCentralManager est sous tension?

Répondre

2

près que je peux dire, si vous n'utilisez pas l'un des deux initialiseurs figurant dans la documentation, ceci est le résultat - vous voulez utiliser:

init(delegate:queue:) 

ou:

init(delegate:queue:options:) 

Xcode ne se plaint pas si vous appelez simplement:

CBCentralManager() 

mais si vous le faites, il semble que vous resterez dans CBCentralManagerState.Unknown indéfiniment.

Si vous voulez expérimenter, faire une aire de jeux et coller ce code, et d'essayer avec les deux variantes de initialiseur que j'ai énumérés:

import Cocoa 
import CoreBluetooth 
import XCPlayground 

@objc 
public class BluetoothWatcher: NSObject, CBCentralManagerDelegate { 
    var cbcm: CBCentralManager!; 
    var timer: NSTimer!; 

    override init() { 
     super.init(); 

     /*: 
      When you initialize a central manager, the delegate seems important. If you comment out the initializer with the delegate and uncomment the other one, it'll stay in state unknown indefinitely. 
     */ 
     //cbcm = CBCentralManager(delegate: self, queue:nil); 
     cbcm = CBCentralManager(); 

     checkStateInOneSecond(); 
    } 

    public func centralManagerDidUpdateState(central: CBCentralManager) { 
     print("State updated: \(stateString())"); 
    } 

    func checkStateInOneSecond() { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { 
      self.checkState(); 
     }); 
    } 

    public func checkState() { 
     print("Timer fired, state: \(stateString())"); 
     checkStateInOneSecond(); 
    } 

    func stateString() -> String { 
     switch(cbcm.state) { 
     case .Resetting: 
      return "resetting" 
     case .PoweredOn: 
      return "powered on"; 
     case .PoweredOff: 
      return "powered off"; 
     case .Unknown: 
      return "unknown"; 
     case .Unsupported: 
      return "unsupported"; 
     case .Unauthorized: 
      return "unauthorized"; 
     } 
    } 
} 


XCPlaygroundPage.currentPage.needsIndefiniteExecution = true; 
var watcher = BluetoothWatcher(); 

Vous verrez avec le délégué, il commence à Unknown , et presque immédiatement le délégué est appelé avec un changement d'état à PoweredOn, et chaque tir de minuterie suivant montre PoweredOn. Faites la même chose sans le délégué, avec l'initialiseur vide, et la méthode déléguée ne sera jamais appelée (pas de surprise) et les déclenchements de minuterie continueront à afficher Unknown.

+0

Vous avez travaillé avec le délégué. J'avais déjà essayé cela mais ça ne marchait pas parce que je n'ai pas appelé call_main – NNS

+1

Ceci est tout à fait correct. Merci de m'avoir épargné des heures de plus à me cogner la tête contre le bureau. – davidgyoung