2

I am trying to discover the ibeacon. i am running app on iPhone 4s. device bluetooth is turned on. beacon is also discovering in other iOS apps. When i am searching for services following delegate "centralManagerDidUpdateState" gets called and State is "On" after this nothing happens. It is expected that "didDiscoverPeripheral" should get called but nothing happens. What wrong i am doing here?

Hi,

import UIKit
import FBSDKLoginKit
import SwiftQRCode
import CoreBluetooth

@objc
 class DashboardViewController: UIViewController {

var myCentralManager:CBCentralManager!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    myCentralManager = CBCentralManager(delegate: self, queue: nil)
   //        let options = [CBCentralManagerScanOptionAllowDuplicatesKey:true]
    myCentralManager.scanForPeripheralsWithServices(nil, options: nil)


 }

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.hidden = true

 }


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/
   }


  // MARK: CBCentralManagerDelegate
  extension DashboardViewController: CBCentralManagerDelegate {

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

    peripheral.delegate = self

    //        if peripheral.state ==  CBPeripheralState.Disconnected {
    //        
   //           central.connectPeripheral(peripheral, options: nil)
   //        }

    }

func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {

    peripheral.delegate = self
    peripheral.discoverServices(nil)

}



func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) {

}

func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {

}
 }

  // MARK: CBCentralManagerDelegate
  extension DashboardViewController: CBPeripheralDelegate {

func centralManagerDidUpdateState(central: CBCentralManager) {

    switch central.state{
    case CBCentralManagerState.PoweredOn:
        print("On.")
        break
    case CBCentralManagerState.PoweredOff:
        print("Off.")
        break
    case CBCentralManagerState.Resetting:
        print("Resetting.")
        break
    case CBCentralManagerState.Unauthorized:
        print("Unauthorized.")
        break
    case CBCentralManagerState.Unknown:
        print("Unknown.")
        break
    case CBCentralManagerState.Unsupported:
        print("Unsupported.")
        break
    }
  }

func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {

    for service in peripheral.services!{
        peripheral.discoverCharacteristics(nil, forService: service)
    }
}

func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) {

    for charactristics in service.characteristics!{
        peripheral.setNotifyValue(true, forCharacteristic: charactristics)
    }

}

func peripheral(peripheral: CBPeripheral, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic, error: NSError?) {

    if characteristic.isNotifying {
        print("Notifying...")
    }
}

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
    print(characteristic.value)
}
}
Dattatray Deokar
  • 1,923
  • 2
  • 21
  • 31

1 Answers1

4

It is not possible to detect iBeacons with CoreBluetooth APIs and the CBCentralManager class as shown in the code. While iBeacons are bluetooth LE devices, Apple has security blocks that prevent iOS devices from reading the raw advertisement data with the didConnectPeripheral callback.

If you want to detect iBeacons on iOS, you must use the CoreLocation APIs. You can read more about how to do this here.

davidgyoung
  • 63,876
  • 14
  • 121
  • 204