已终止的应用程序未使用 iBeacon 数据包唤醒

Posted

技术标签:

【中文标题】已终止的应用程序未使用 iBeacon 数据包唤醒【英文标题】:Terminated App not wakeup with iBeacon packet 【发布时间】:2018-08-12 17:38:29 【问题描述】:

ios可以在睡眠状态下接收iBeacon数据包并唤醒应用吗?

我杀死了一个应用程序并重新启动,然后让手机处于睡眠模式。设备重新启动时设备处于信标区域,并且我在重新启动后保持设备屏幕关闭。 我的iOS 应用程序没有唤醒,所以我怀疑它没有收到iBeacon 数据包。

我检查了系统日志,发现didEnterRegion 过程没有被调用。

如果应用程序被强制终止,应用程序唤醒是否有效,iOS 是否在重启和立即睡眠状态下接收 iBeacon 数据包?

如果我打开屏幕,它会立即开始工作,但如果屏幕在重启后关闭,它不会收到iBeacon 数据包。

【问题讨论】:

您好,您需要提供更多背景信息才能让人们为您提供帮助。请发布您当前的相关代码。谢谢。 【参考方案1】:

是的,iOS CoreLocation 将在进入区域或退出区域时启动您的应用,即使在 iOS 7.1.1 之后强制终止后也能正常工作。如果您在 AppDelegate 的 didFinishLaunchingWithOptions 方法中设置了您的 CLLocationManagerDelegate,您只会得到适当的回调。如果您没有在该方法中进行设置,那么 CoreLocation 将不知道在应用启动后进行回调。

在应用重启期间测试入口事件可能有点棘手,因此这里有一些技巧可以避免陷阱:

    如果您的应用程序在上次运行时认为它在该区域“外部”至关重要。如果上次运行时它在区域“内部”,它不一定会得到另一个入口回调,因为它会认为它从未离开过。测试时,请绝对确保您收到一个 didExit 回调或 didDetermineState 回调,表明它在您杀死应用程序或重新启动之前 超出区域。使用NSLog 语句、本地通知或添加到应用屏幕的一些自定义 UI 指示器来验证这一点。

    如果您重新启动 iOS 设备,CoreLocation 不会立即完全初始化 - 我看到屏幕出现后需要 5 分钟才能收到任何回调。请确保等待足够长的时间。

    CoreLocation 完全初始化后,区域进入事件通常会在信标进入范围后的一秒内发生。但是,如果设备上有限的蓝牙硬件辅助模式插槽已满(通常情况下,如果您有几个其他信标应用程序都使用了它们),那么入口事件会退回到仅每 10 分钟发生一次的软件扫描或更多的。在这种情况下,进入事件可能需要很长时间。确保在假设它不起作用之前等待足够长的时间。

【讨论】:

感谢您的回复,我已经测试了更多,并且几乎在所有情况下都可以正常工作。仅在一种特定情况下,我无法确定强制终止信标的范围->重新启动设备->立即使设备进入睡眠状态。在 os 日志中,ios 根本没有启动我的应用程序。另外,如果我只是按下电源按钮并唤醒 iphone,则应用程序由 ios 启动,之后一切正常。因此,只有在这种特定情况下它不起作用,如果设备在重启后立即进入睡眠状态,iOS 将不会在后台启动定位服务和应用程序。

以上是关于已终止的应用程序未使用 iBeacon 数据包唤醒的主要内容,如果未能解决你的问题,请参考以下文章

OBJ-C 操作方法:在同一设备中使用 BLE 连接和 iBeacon 的应用程序

使用 didEnterRegion 唤醒一个被杀死的应用程序,然后扫描 iBeacon

如果 iOS 注册了 UIBackgroundModes 的位置,iOS 会唤醒已终止的应用程序吗?

iOS 本地推送通知未唤醒设备

当应用程序被用户终止时的 iBeacon 通知(通过在任务视图中向上滑动)

由 iBeacon 触发的 iOS 8 后台位置更新