当用户手动打开蓝牙时,iBeacon进入区域时不会触发

时间:2015-12-03 09:28:33

标签: ios bluetooth ibeacon

我正在测试iBeacon区域监控并执行以下步骤。

  • 1:前提条件:手机中已启用蓝牙且应用未运行
  • 2:我打开了灯塔
  • 3:应用程序在位置事件(信标区域)
  • 之后启动
  • 4:我关闭了灯塔
  • 5:应用仍在运行并检测到退出区域事件
  • 6:然后我手动终止该应用程序(可以这样做,区域监控仍然有效)
  • 7:我在手机上关闭蓝牙
  • 8:我重新打开灯塔
  • 9:我在手机上再次打开蓝牙
  • 10:我希望...见下文(预期结果)

预期结果:应用程序应在进入该区域后醒来( 我测试了这一点,而无需手动切换蓝牙,但无法正常工作 实际结果:不会发生。

为什么10不会发生?这是iOS中的错误吗?

1 个答案:

答案 0 :(得分:3)

关闭蓝牙通常不是测试监控的好方法。只有当区域的状态(即CLRegionState)从“外部”转换为“内部”(反之亦然)时,才会发生进入和退出事件。如果您关闭蓝牙,状态将变为“未知” [1] (因为如果您禁用蓝牙或禁用蓝牙,设备将如何知道),因此如果您将其重新打开,它转换为“外部”或“内部”,它实际上不会触发设计的事件。

除了didDetermineStatedidEnter之外,您还可以通过实施didExit方法对其进行测试。从信号关闭开始,通过didDetermineState确认状态为“外部”。关闭蓝牙,打开信标,打开蓝牙。您会看到didDetermineState状态为“内部”,但没有didEnter。 (它的工作原理相反,即,如果你开始打开信标,并在iPhone的蓝牙被禁用时将其关闭。你会看到didDetermineState“在外面”,但没有{{1} }。)

注意:此测试仅适用于前台。它看起来像在后台,didExit还不足以让iOS唤醒应用来处理事件 - 它需要didDetermineStatedidEnter

[1] 这里也有一点澄清。当您停用蓝牙时,didExit实际上不会显示didDetermineState CLRegionStateUnknown。这是因为我怀疑当蓝牙关闭时iOS停止提供任何信标事件。我是如何得出结论它真的变为“未知”的呢?我添加了NSTimer,每秒调用requestStateForRegion(反过来强制对didDetermineState进行异步调用)。当我关闭蓝牙时,didDetermineState来电停止。但是一旦打开蓝牙,这些呼叫就会恢复,并且状态是“未知的” - 在它变为“外部”或“内部”之前,取决于信标的当前状态。同样,根据上面的注释,所有这些都是应用程序在前台。

(当您开始在信标范围内进行监控时,实际应用相同的机制。在开始监控之前,状态是“未知”。当您开始监控时,状态转换为“内部”我们的“外部”(取决于信号是否在监控开始时处于范围内),但这不会触发didEnterdidExit。您也可以使用didDetermineState进行验证。)