检测信标何时是IN / OUT范围被多次调用

时间:2016-01-24 23:20:22

标签: ios swift ibeacon

我有一个viewController,用于检测信标是否在范围内或超出范围,并发送本地通知并将一些数据保存在数据库中

class FirstViewController: UIViewController, CLLocationManagerDelegate {
    var locationManager: CLLocationManager!
    .
    .
    .
    override func viewDidLoad() {
    super.viewDidLoad()

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
    locationManager.requestAlwaysAuthorization()
}
   func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == .AuthorizedWhenInUse || status == .AuthorizedAlways{
        if CLLocationManager.isMonitoringAvailableForClass(CLBeaconRegion.self) {
            if CLLocationManager.isRangingAvailable() {
                startScanning()
            }
        }
    }
}

func startScanning() {

    for var i=0; i<deviceObjectArray.count; i++ {
        let uuid = NSUUID(UUIDString: deviceObjectArray[i].uuid)!
        let major = UInt16(deviceObjectArray[i].major)
        let minor = UInt16(deviceObjectArray[i].minor)
        beaconRegionsArray.append(CLBeaconRegion(proximityUUID: uuid, major: major!, minor: minor!, identifier: deviceObjectArray[i].deviceName))
    }
    for var i=0; i<beaconRegionsArray.count; i++ {
        locationManager.startMonitoringForRegion(beaconRegionsArray[i])

    }
}
    func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
    print("Entering region")
    myTitle = "Entering the range"
    var alertView = UIAlertController(title: myTitle, message: "Press OK to continue", preferredStyle: UIAlertControllerStyle.Alert)
    alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: yesHandler))
    presentViewController(alertView, animated: true, completion: nil)
    alertBody1 = "Entering beacon range"
    LocalNotification()


}

func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {
    print("Exiting region")
    myTitle = "Exiting the range"
    var alertView = UIAlertController(title: myTitle, message: "Press OK to continue", preferredStyle: UIAlertControllerStyle.Alert)
    alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: yesHandler))
    presentViewController(alertView, animated: true, completion: nil)
    alertBody1 = "Exiting beacon range"
    LocalNotification()
    setMyLocation(region.identifier)
}

代码或多或少有效。当信标超出范围时,我会收到本地通知,并在

时将数据保存到数据库 setMyLocation(region.identifier)被调用。

然而我遇到的问题是,如果我离开这个视图并再次回到它,下次函数

func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {

接听电话几次,突然我得到10或15条消息

“退出信标范围”

并且相同的数据也会保存10或15次。 我该如何解决这个问题?

我应该自己创建一个类并将其与ViewController隔离吗?

不确定我是否足够清楚但是对此有任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

为什么你得到额外的退出事件并不明显,但可能是因为你试图注册超过20个允许的监控区域。当你超过限制时,当CoreLocation卸载较旧的区域时,你可能会得到退出事件。

超出限制的问题发生是因为您在ViewController加载时调用startMonitoringForRegion,但在ViewController变为非活动状态时从不在每个区域调用stopMonitoringFirRegion

我会改变这一点,也许它会解决你的问题。只是一个猜测 - 如果这不起作用,可能是时候根据你的建议将信标代码与ViewController分离。