无法在我的iOS应用中检测到Kontakt.io信标

时间:2016-10-13 10:06:55

标签: ios swift bluetooth-lowenergy beacon kontakt.io

我根据Kontakt SDK示例代码执行了信标搜索代码,如下所示。但我的信标数始终为0,而​​我的iPhone附近有11个信标。任何人都能帮助我吗?

我在viewDidLoad方法中初始化KTKBeaconManager,然后创建区域对象并停止任何先前的测距服务,然后启动新的监视和测距服务。

并且它一直调用带有信标的didRangeBeacons计数= 0.不确定究竟是什么问题。它们的示例代码中的代码相同。

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 个答案:

答案 0 :(得分:1)

我认为常见的问题是你忘了设置

Kontakt.setAPIKey("yourSuperSecretAPIKey")

以及这两个权限中的任何一个

 NSLocationWhenInUseUsageDescription
 NSLocationAlwaysUsageDescription

如果情况并非如此,那么您的信标就是&#39;电池可以耗尽。

答案 1 :(得分:0)

最后,我能够使用CBPeripheral类检测信标,并根据收到的具有实例ID的UUID进行唯一识别(最后12个字符是唯一的实例ID)