用于Beacon检测的Swift2.3代码

时间:2016-09-22 11:43:05

标签: ibeacon ios10 swift2.3

我们正处于开发Swift2.2应用程序的高级阶段,因此决定在此期间迁移到2.3并稍后进行完整的Swift 3迁移。但是我们无法在转换到Swift 2.3后获得信标检测工作。方法" didRangeBeacons"不断返回一个空数组。相同的代码在Swift 2.2中工作,因此我们知道我们拥有所有权限等。

此外,如果我们打开"定位"应用程序在同一个ipad上,然后我们的应用程序也开始在" didRangeBeacons"中返回数据。尝试了各种版本的应用程序,所有Swift2.3应用程序的行为方式都相同。无法弄清楚Locate应用程序正在做什么......同一条船上的任何人?

这是我们正在使用的代码。我不确定这应该写在这里或评论中,但不能以某种方式将代码放在评论中......

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

let locationManager = CLLocationManager()
let region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "9735BF2A-0BD1-4877-9A4E-103127349E1D")!, identifier: "testing")
// Note: make sure you replace the keys here with your own beacons' Minor Values


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.locationManager.delegate = self
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.startMonitoringForRegion(self.region)
}

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

func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
    print("didStartMonitoringForRegion")
    self.locationManager.requestStateForRegion(region)
}

func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
    print("monitoringDidFailForRegion")
}

func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {
    print("didDetermineState")
    if state == .Inside {
        //Start Ranging
        self.locationManager.startRangingBeaconsInRegion(self.region)
        self.locationManager.startUpdatingLocation()
    }
    else {
        //Stop Ranging here
        self.locationManager.stopUpdatingLocation()
        self.locationManager.stopRangingBeaconsInRegion(self.region)
    }
}

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    print(beacons.count)
}

}

[更新发布更多尝试以使其正常工作] 如果我们删除self.locationManager.startMonitoringForRegion(self.region),应用程序在前台模式下工作 并调用self.locationManager.startRangingBeaconsInRegion(self.region) 直接在self.locationManager.requestAlwaysAuthorization()

之后

这是次优的,因为我们没有获得进入和退出事件或状态,但至少我们得到了信标数。

3 个答案:

答案 0 :(得分:2)

iOS 10上有许多关于信标检测问题的轶事报道。症状包括:

  • 不正确的区域退出事件,尤其是当应用程序在后台时,如果按下肩部按钮,则会显示输入事件。
  • 远程信标检测中的周期性丢失,当信标在附近时,回调提供空信标列表。
  • 当针对iOS 9.x运行不同的信标测距或检测应用程序时,远程信标回调会返回正确的结果。

这可能是一个将在iOS更新中修复的错误。在此之前,一些用户报告将XCode中的应用部署目标设置为9.x将解决此问题。

答案 1 :(得分:0)

在视图加载后尝试构建您的位置管理器。换句话说,改变:

let locationManager = CLLocationManager()

let locationManager : CLLocationManager!

然后将其添加到viewDidLoad

locationManager = CLLocationManager()

我看到LocationManager的初始化构建了UIViewController的奇怪行为。

答案 2 :(得分:0)

当我测试信标测距时,我下载了多个我忘记卸载的应用程序。在我卸载所有与信标相关的应用程序并重新安装所需的应用程序之后,我能够使用范围信标工作。