2

I had did beacon searching code as per Kontakt SDK Sample code as below. But I am getting beacon count always 0, while I am having 11 beacons near by my iPhone. Can any body help me over this?

I have initialise KTKBeaconManager in viewDidLoad method and then create region object and stopped any previous ranging service and then started new monitoring and ranging services.

And all time it calls didRangeBeacons with beacons count = 0. Not sure what exactly the issue. Its same code from their example code.

import UIKit
import KontaktSDK

class ViewController: UIViewController {

var beaconManager: KTKBeaconManager!
@IBOutlet var statusLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    // Initiate Beacon Manager
    beaconManager = KTKBeaconManager(delegate: self)
    beaconManager.requestLocationAlwaysAuthorization()

    // Region
    let proximityUUID = NSUUID(uuidString: "f7826da6-4fa2-4e98-8024-bc5b71e0893e")
    let region = KTKBeaconRegion(proximityUUID: proximityUUID! as UUID, identifier: "com.weenggs.KontaktDemo")

    // Region Properties
    region.notifyEntryStateOnDisplay = true

    beaconManager.stopMonitoringForAllRegions()

    // Start Ranging
    beaconManager.startMonitoring(for: region)
    beaconManager.startRangingBeacons(in: region)
    beaconManager.requestState(for: region)

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


}
extension ViewController: KTKBeaconManagerDelegate {

func beaconManager(_ manager: KTKBeaconManager, didDetermineState state: CLRegionState, for region: KTKBeaconRegion) {
    print("Did determine state \"\(state.rawValue)\" for region: \(region)")
    statusLabel.text = "Did determine state \"\(state.rawValue)\" for region: \(region)"
}

func beaconManager(_ manager: KTKBeaconManager, didChangeLocationAuthorizationStatus status: CLAuthorizationStatus) {
    print("Did change location authorization status to: \(status.rawValue)")
    statusLabel.text = "Did change location authorization status to: \(status.rawValue)"
    if status == .authorizedAlways{

        // Region
        let proximityUUID = NSUUID(uuidString: "f7826da6-4fa2-4e98-8024-bc5b71e0893e")
        let region = KTKBeaconRegion(proximityUUID: proximityUUID! as UUID, identifier: "com.weenggs.KontaktDemo")

        // Region Properties
        region.notifyEntryStateOnDisplay = true

        beaconManager.startMonitoring(for: region)
        beaconManager.startRangingBeacons(in: region)
        beaconManager.requestState(for: region)
    }
}

func beaconManager(_ manager: KTKBeaconManager, monitoringDidFailFor region: KTKBeaconRegion?, withError error: Error?) {
    print("Monitoring did fail for region: \(region)")
    print("Error: \(error)")
    statusLabel.text = "Monitoring did fail for region: \(region)"
}

func beaconManager(_ manager: KTKBeaconManager, didStartMonitoringFor region: KTKBeaconRegion) {
    print("Did start monitoring for region: \(region)")
    statusLabel.text = "Did start monitoring for region: \(region)"
}

func beaconManager(_ manager: KTKBeaconManager, didEnter region: KTKBeaconRegion) {
    print("Did enter region: \(region)")
    statusLabel.text = "Did enter region: \(region)"
}

func beaconManager(_ manager: KTKBeaconManager, didExitRegion region: KTKBeaconRegion) {
    print("Did exit region \(region)")
    statusLabel.text = "Did exit region \(region)"
}

func beaconManager(_ manager: KTKBeaconManager, didRangeBeacons beacons: [CLBeacon], in region: KTKBeaconRegion) {
    print("Did ranged \"\(beacons.count)\" beacons inside region: \(region)")
    statusLabel.text = "Did ranged \"\(beacons.count)\" beacons inside region: \(region)"
    if let closestBeacon = beacons.sorted(by: { $0.0.accuracy < $0.1.accuracy }).first , closestBeacon.accuracy > 0 {
        print("Closest Beacon is M: \(closestBeacon.major), m: \(closestBeacon.minor) ~ \(closestBeacon.accuracy) meters away.")
        statusLabel.text = "\(statusLabel.text) Closest Beacon is M: \(closestBeacon.major), m: \(closestBeacon.minor) ~ \(closestBeacon.accuracy) meters away."
    }
}
}

2 Answers2

1

I reckon the common issue is that you forgot to set

Kontakt.setAPIKey("yourSuperSecretAPIKey")

and either one of those two permissions

 NSLocationWhenInUseUsageDescription
 NSLocationAlwaysUsageDescription

If it's not the case then your beacons' batteries could be drained out.

Tim
  • 606
  • 1
  • 8
  • 19
0

Finally I was able to detect beacons using CBPeripheral class and identify uniquely based on received UUID with instance id( last 12 characters are instance id which are unique)