应用程序在后台接收来自信标的信号

我有一个与信号灯交互的iOS应用程序。 也有一个function来检测来自信标的信号,如果信号超出范围,我想存储的东西在数据库中(在这种情况下,核心数据)

func updateDistance(distance: CLProximity) { UIView.animateWithDuration(1.0) { [unowned self] in switch distance { case .Unknown: self.view.backgroundColor = UIColor.grayColor() self.distanceReading.text = "No Beacon Signal Detected" updateDatabaseWithLocation() } } } 

所以只要应用程序在前台运行,应用程序就可以正常工作。 我的理解是,我也可以在后台的应用程序,当用户不积极使用应用程序,仍然从信标获得信号。 如果是这样,我该如何完成这个任务?
我添加了以下内容到info.plist,仍然没有工作。
也有可能更新数据库以及? 在这里输入图像说明

在应用程序运行时,您只能使用信标 (这是您可以访问距离近似值的范围)。 只要你离开应用程序(按主页button,导航到另一个应用程序等),iOS将暂停应用程序,范围将停止工作。 在后台连续使用蓝牙无线电会快速消耗智能手机的电池。

但是,您可以在智能手机进入和退出信标范围(或一组信标)时将应用程序订阅唤醒。 这就是所谓的区域监控 ,和地理围栏使用的机制是一样的。

现在,“进入”和“退出”事件本身并不会使您获得距离近似值。 但是,由于iOS会将您的应用程序唤醒几秒钟以处理这些事件,所以在iOS将应用程序恢复到睡眠状态之前, 范围实际上会持续一段时间(假设您在应用程序暂停之前还没有停止它)再次。

您甚至可以使用后台执行任务将“几秒”延长到几分钟。

以上所有内容都不需要使用后台模式 – 只有“始终”授权才能使用定位服务。

您通常无法使应用程序无限期地在信号灯下运行。 后台支持受到苹果公司的严格pipe制,只允许用于导航应用程序或音乐应用程序。 人们有时会尝试使用“位置”背景模式来让应用程序保持在后台(因此能够测距信标),甚至有人报告能够通过审查过程,但似乎更多的是一个例外而不是一个规则。

如果您决定试一试,您需要:

  • 启用“位置”后台模式,
  • 在你的CLLocationManager实例上设置allowBackgroundLocationUpdates为true
  • 开始定期更新位置: startUpdatingLocation 。

这应该保持应用程序在后台运行,即使你离开它。