我正在测试iBeacon区域监控并执行以下步骤。
预期结果:应用程序应在进入该区域后醒来( 我测试了这一点,而无需手动切换蓝牙,但无法正常工作 ) 实际结果:不会发生。
为什么10不会发生?这是iOS中的错误吗?
答案 0 :(得分:3)
关闭蓝牙通常不是测试监控的好方法。只有当区域的状态(即CLRegionState
)从“外部”转换为“内部”(反之亦然)时,才会发生进入和退出事件。如果您关闭蓝牙,状态将变为“未知” [1] (因为如果您禁用蓝牙或禁用蓝牙,设备将如何知道),因此如果您将其重新打开,它转换为“外部”或“内部”,它实际上不会触发设计的事件。
除了didDetermineState
和didEnter
之外,您还可以通过实施didExit
方法对其进行测试。从信号关闭开始,通过didDetermineState
确认状态为“外部”。关闭蓝牙,打开信标,打开蓝牙。您会看到didDetermineState
状态为“内部”,但没有didEnter
。 (它的工作原理相反,即,如果你开始打开信标,并在iPhone的蓝牙被禁用时将其关闭。你会看到didDetermineState
“在外面”,但没有{{1} }。)
注意:此测试仅适用于前台。它看起来像在后台,didExit
还不足以让iOS唤醒应用来处理事件 - 它需要didDetermineState
或didEnter
。
[1] 这里也有一点澄清。当您停用蓝牙时,didExit
实际上不会显示didDetermineState
CLRegionStateUnknown
。这是因为我怀疑当蓝牙关闭时iOS停止提供任何信标事件。我是如何得出结论它真的变为“未知”的呢?我添加了NSTimer
,每秒调用requestStateForRegion
(反过来强制对didDetermineState
进行异步调用)。当我关闭蓝牙时,didDetermineState
来电停止。但是一旦打开蓝牙,这些呼叫就会恢复,并且状态是“未知的” - 在它变为“外部”或“内部”之前,取决于信标的当前状态。同样,根据上面的注释,所有这些都是应用程序在前台。
(当您开始在信标范围内进行监控时,实际应用相同的机制。在开始监控之前,状态是“未知”。当您开始监控时,状态转换为“内部”我们的“外部”(取决于信号是否在监控开始时处于范围内),但这不会触发didEnter
或didExit
。您也可以使用didDetermineState
进行验证。)