2

我已经按照 Kontakt SDK 示例代码进行了信标搜索代码,如下所示。但是我的信标计数始终为 0,而我的 iPhone 附近有 11 个信标。任何机构都可以帮助我解决这个问题吗?

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

并且一直使用信标计数 = 0 调用 didRangeBeacons。不确定到底是什么问题。它与他们的示例代码中的代码相同。

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."
    }
}
}
4

2 回答 2

1

我认为常见的问题是您忘记设置

Kontakt.setAPIKey("yourSuperSecretAPIKey")

以及这两个权限之一

 NSLocationWhenInUseUsageDescription
 NSLocationAlwaysUsageDescription

如果不是这种情况,那么您的信标的电池可能会耗尽。

于 2016-10-20T06:13:26.710 回答
0

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

于 2016-10-21T15:34:08.653 回答