2014-08-30 60 views
14

我無法讓Core Bluetooth發現iOS 8上的外圍設備。相同的代碼在iOS 7設備上工作正常。起初,我認爲這將是一個權限問題,因爲我一直在做一些iBeacon工作,並且iOS 8上的核心位置權限發生了一些變化。然而,我找不到任何在線幫助。這裏是爲我在iOS 7,但不是在iOS 8正常工作的示例項目鏈接:iOS 8核心藍牙無法發現外圍設備

https://github.com/elgreco84/PeripheralScanning

如果我在iOS 7設備上運行這個項目它會記錄廣告數據的數量的我周圍的設備。在iOS 8上,我看到的唯一輸出是中央管理器狀態爲「已打開」。

+0

[CBCentralManager的狀態何時會啓動但仍然給我一個「未通電」的警告?](http://stackoverflow.com/questions/17118534/when-would-cbcentralmanagers-state-ever-被啓動,但仍然給我不) – 2014-09-01 19:58:35

回答

30

直到處於'開機'狀態時纔開始掃描外設。也許在你的iOS7設備上你很幸運,但是代碼仍然不正確。你centralManagerDidUpdateState:應該

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 
{ 
    switch (central.state) 
    { 
     case CBCentralManagerStateUnsupported: 
     { 
      NSLog(@"State: Unsupported"); 
     } break; 

     case CBCentralManagerStateUnauthorized: 
     { 
      NSLog(@"State: Unauthorized"); 
     } break; 

     case CBCentralManagerStatePoweredOff: 
     { 
      NSLog(@"State: Powered Off"); 
     } break; 

     case CBCentralManagerStatePoweredOn: 
     { 
      NSLog(@"State: Powered On"); 
      [self.manager scanForPeripheralsWithServices:nil options:nil]; 
     } break; 

     case CBCentralManagerStateUnknown: 
     { 
      NSLog(@"State: Unknown"); 
     } break; 

     default: 
     { 
     } 

    } 
} 

而且從didFinishLaunchingWithOptions

+2

非常感謝。你救了我把我的人力資源管理系統從窗口扔出去。 – Craimasjien 2014-10-15 15:41:37

+0

我做到了,但有時候,並非所有的時間,'didDiscoverPeripheral'根本沒有被調用 - - 真的很困惑。 – Zennichimaro 2015-05-20 07:34:09

+0

但對我來說,它調用didDiscoverPeripheral方法很晚,在iOS 8中,如何修理它? – 2015-09-07 12:29:19

4

我碰到了同樣的問題,同時建立一個非常基本的BLE掃描儀應用中移除調用scanForPeripheralsWithServices。添加了所需的方法「centralManagerDidUpdateState」。但沒有任何工作。

我相信問題與queue有關。 把CBCentralManager例如在dispatch_get_main_queue

這段代碼確實是:

 // BLE Stuff 
      let myCentralManager = CBCentralManager() 

     // Put CentralManager in the main queue 
     required init(coder aDecoder: NSCoder) { 
      super.init(coder: aDecoder) 
      myCentralManager = CBCentralManager(delegate: self, queue: dispatch_get_main_queue()) 

      } 

使用默認的單一視圖Xcode中開始應用。你可以把這個到ViewController.swift文件:

import UIKit 
    import CoreBluetooth  

    class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { 


     // BLE Stuff 
     let myCentralManager = CBCentralManager() 
     var peripheralArray = [CBPeripheral]() // create now empty array. 


     // Put CentralManager in the main queue 
     required init(coder aDecoder: NSCoder) { 
      super.init(coder: aDecoder) 
      myCentralManager = CBCentralManager(delegate: self, queue: dispatch_get_main_queue()) 

     } 



     override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 

     } 


     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
     } 

     // Mark CBCentralManager Methods 

     func centralManagerDidUpdateState(central: CBCentralManager!) { 

      updateStatusLabel("centralManagerDidUpdateState") 


      switch central.state{ 
      case .PoweredOn: 
       updateStatusLabel("poweredOn") 


      case .PoweredOff: 
       updateStatusLabel("Central State PoweredOFF") 

      case .Resetting: 
       updateStatusLabel("Central State Resetting") 

      case .Unauthorized: 
       updateStatusLabel("Central State Unauthorized") 

      case .Unknown: 
       updateStatusLabel("Central State Unknown") 

      case .Unsupported: 
       println("Central State Unsupported") 

      default: 
       println("Central State None Of The Above") 

      } 

     } 

     func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) { 
        println("Did Discover Peripheral") 
      } 
     } 
1

我的相關問題從

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) 

解決通過更新CBCentralManagerDelegate方法簽名

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 

注的不同名稱didDiscover\Peripheral參數。

此外,請注意,由於這不是必需的委託方法,因此根本沒有關於第一個版本根本沒有鏈接到委託的事實的警告,因此(當然)永遠不會被調用。有了Core方法的所有語法變更和過時的名稱/版本/文檔/教程,我希望Swift有更好的方法告訴編譯器你試圖使用(有效)委託方法(除了依靠自動思考)