iOS 延长信标监控后台时间

iOS Extending background time for beacon monitoring

我正在开发一个 iOS swift 旅行应用程序,该应用程序的概念是在与用户验证旅行之后,在旅行中,该应用程序会保持蓝牙信标的范围,我正在使用此库来执行此操作 https://github.com/AltBeacon/ios-beacon-tools

正如我所见,这个库使用了 CoreBluetooth,它在后台运行良好。问题是,既然去旅行,旅行甚至可以持续1到2个小时,而我需要在这段时间内扫描信标(例如每15秒一次)以注册用户走过的路线。

现在,每当我使用我的应用程序进入后台时,我只有 30 秒的时间进行信标测距,然后 iOS 终止了我的应用程序(可能是因为我没有过期处理程序,这就是我的原因)在论坛上阅读)但我仍然需要让信标保持无限期的测距,可以持续 10 分钟到 2 小时。

我怎样才能做到这一点?我在 iOS 方面经验不足,所以请帮助我。

你想做的都有可能。但这很棘手。

几点:

  1. 在后台,您永远检测到 AltBeacon 或其他使用 CoreBluetooth 的制造商广告,因为 iOS 阻止制造商广告在后台传送. (当您使用 CoreLocation 时,iBeacon 广告在后台遵循不同的规则。)

  2. 后台可以检测到Eddystone等服务广告

  3. 一般你的应用在被发送到后台后只能运行几秒钟,然后检测就会停止。但是,您可以根据要求使用 here 中描述的技术将此时间延长最多 180 秒。虽然我的博客 post 是关于 CoreLocation 的,但同样的技术也适用于 CoreBluetooth。

  4. 正如上面文章提到的,也可以通过执行以下操作将 180 秒延长到永远:

  • 在 Info.plist 中设置 BackgroundModes 以包括位置。
  • 除蓝牙权限外,还获取位置始终权限。
  • 使用 CoreLocation 启动主要位置更新。 (您不必使用由此产生的位置结果,但需要它来使应用程序在后台保持活动状态。)
  • 按照上面链接的博客 post 中所述启动后台任务。

这将使您的应用程序永远在后台扫描 Eddystone 等蓝牙服务信标,但存在三个问题:

  1. 如果您想让您的应用获得 App Store 批准,您必须让 Apple 审阅者相信您的应用为用户提供了对用户来说显而易见的特定于位置的好处。
  2. iOS 将每 3 天左右向您的用户显示一个可怕的对话框,警告他们该应用程序正在后台使用您的位置,并显示一张地图,其中包含应用程序运行时用户所在的所有地点 运行宁。该对话框将允许用户禁用后台位置权限,如果用户这样做,后台信标更新将停止。有关详细信息,请参阅我的博客 post here
  3. 当您的应用程序持续扫描蓝牙时,电池电量会大量消耗。