我有一个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隔离吗?
不确定我是否足够清楚但是对此有任何帮助表示赞赏。
答案 0 :(得分:0)
为什么你得到额外的退出事件并不明显,但可能是因为你试图注册超过20个允许的监控区域。当你超过限制时,当CoreLocation卸载较旧的区域时,你可能会得到退出事件。
超出限制的问题发生是因为您在ViewController加载时调用startMonitoringForRegion
,但在ViewController变为非活动状态时从不在每个区域调用stopMonitoringFirRegion
。
我会改变这一点,也许它会解决你的问题。只是一个猜测 - 如果这不起作用,可能是时候根据你的建议将信标代码与ViewController分离。