2015-06-04 54 views
4

即时通讯建立一个简单的ios应用程序与IBeacon,我监测一个地区,但我有一些问题进入和退出事件。didExitRegion没有关闭蓝牙时触发

如果我进入一个区域,回拨didEnterRegion被触发,但在区域内,关闭蓝牙并不会触发didExitRegion回拨。这是预期的行为?

这是一个问题,因为我必须能够检测用户何时退出该区域。任何想法?

谢谢

+0

您是否尝试过执行'didDetermineState'以及didEnter/Exit?后者只有在状态从“外部”变为“内部”时才会发生,反之亦然。可能是因为禁用蓝牙将状态推入“未知”状态,所以稍后您在区域外启用蓝牙时,它不会触发退出。但是,它应该触发一个状态变化,并且一个调用会执行'didDetermineState'。 – heypiotr

回答

3

出于测试目的,您必须关闭信标或移出范围以获取didExitRegion事件。

一旦CoreLocation决定了它是一个内部CLBeaconRegion它将只改变状态到成为区域外它有机会做蓝牙扫描3秒后,在此期间不匹配的信标被检测CLBeaconRegion。如果蓝牙未打开,则无法扫描以进行此确定。

如果您想在此情况下强制退出应用程序,请考虑监听CoreBluetooth生命周期事件。在关闭电源时,您可以注销每个CLBeaconRegion,手动激活您的didExitRegion逻辑,然后用CoreLocation取消其注册。

+0

如果我启用“使用蓝牙LE配件”的后台功能,“centralManagerDidUpdateState:”是否会在后台唤醒应用程序? – vegather

+1

我不这么认为,不。这是一个只有回调的前景。 – davidgyoung

+0

@davidgyound是的,这就是我的想法。无论如何,它总是有一个镜头,它似乎在工作(当我得到回调时呈现一个UILocalNotification)。至少在足够长时间等待应用程序终止之后,而不是在用户在多任务窗口中明确终止应用程序之后。我似乎记得,如果用户明确杀死了应用程序,iOS会阻止某些BLE活动。那仍然是这样吗?如果是这样,你知道一种方法来“优雅地”终止一个应用程序,以便我可以测试它吗?谢谢! – vegather

1

这听起来像合理的行为给我。用户没有离开该地区,因此发送didExitRegion通知不正确。

你可以detect if the bluetooth has been disabled,所以你可以采取适当的行动的基础上。

+0

但是如果稍后在区域外打开蓝牙,回调didExitRegion也不会触发。我可以检测bluettoh是否已经手动激活,但不能在您关闭蓝牙时启动一个事件来执行某些操作。 –

+2

我不认为这是一种合理的行为。如果您在蓝牙断开连接的情况下离开该区域,则不会从ios的角度退出该区域。我认为它应该确定不管是否因为你实际上离开了该区域或者因为你已经停用了蓝牙而没有检测到信标。 – Eylen