Ios 当用户手动打开蓝牙时,不会触发iBeacon未进入区域
我正在测试iBeacon区域监控,并执行以下步骤Ios 当用户手动打开蓝牙时,不会触发iBeacon未进入区域,ios,bluetooth,ibeacon,Ios,Bluetooth,Ibeacon,我正在测试iBeacon区域监控,并执行以下步骤 1:前提条件:手机中的蓝牙已打开,且应用程序未运行 他说:我打开灯塔 3:应用程序在位置事件后启动(信标区域) 他说:我把灯塔关掉了 5:应用程序仍在运行,并检测到did退出区域事件 6:然后我手动关闭应用程序(这样做是可以的,区域监控仍然有效) 7:我在手机上关闭蓝牙 8:我把灯塔重新打开 9:我在手机上再次打开蓝牙 10:我希望。。。见下文(预期结果) 预期结果进入该区域后,应用程序应该会醒来(我在没有手动切换蓝牙的情况下进行了测试,结果
- 1:前提条件:手机中的蓝牙已打开,且应用程序未运行
- 他说:我打开灯塔
- 3:应用程序在位置事件后启动(信标区域)
- 他说:我把灯塔关掉了
- 5:应用程序仍在运行,并检测到did退出区域事件
- 6:然后我手动关闭应用程序(这样做是可以的,区域监控仍然有效)
- 7:我在手机上关闭蓝牙
- 8:我把灯塔重新打开
- 9:我在手机上再次打开蓝牙
- 10:我希望。。。见下文(预期结果)
为什么10不发生?这是iOS中的错误吗?关闭蓝牙通常不是测试监控的好方法。只有当区域的状态(即)从“外部”转换为“内部”(反之亦然)时,才会发生进入和退出事件。如果您关闭蓝牙,状态变为“未知”[1](因为设备如何知道您在禁用蓝牙的情况下外出或外出),因此,如果您重新打开蓝牙,并将其转换为“外部”或“内部”,它实际上不会触发事件 除了
dienter
和dideterminate
之外,您还可以通过实现dideterminate
方法来测试这一点。从关闭信标开始,通过确认状态为“外部”。关闭蓝牙,打开信标,打开蓝牙。您将看到状态为“inside”的DidDetermingEstate
,但没有didEnter
。(反过来也是一样,也就是说,如果你先打开信标,然后在iPhone的蓝牙功能被禁用时将其关闭。你会看到didExit
“outside”,但没有didExit
)
注意:此测试仅在前台有效。在后台看起来,didDetermineState
不足以让iOS唤醒应用程序来处理它需要的事件didEnter
或didExit
[1]这里还有一点澄清。禁用蓝牙时,实际上不会使用CLRegionStateUnknown
显式调用dideterministate
。这是因为我怀疑当蓝牙关闭时,iOS会停止发送任何信标事件。我是如何得出结论,它真的变成了“未知”呢?我添加了一个NSTimer
,它每秒调用requestStateForRegion
(这反过来会强制异步调用didDetermineState
)。当我关闭蓝牙时,呼叫停止。但只要我打开蓝牙,这些呼叫就会恢复,状态为“未知”-然后根据信标的当前状态变为“外部”或“内部”。同样,根据上面的说明,所有这些都是应用在前台的
(当您开始监测信标范围内的信号时,同样的机制实际上也适用。开始监测前,状态为“未知”。当您开始监测时,状态转换为“内部”或“外部”(取决于监测开始时信标是否在范围内),但这不会触发didEnter
或didExit
。在这里,您也可以使用DidDetermingEstate
)验证这一点。因此,当蓝牙重新打开时,应用程序不会被唤醒,因为确定的状态为“内部”,并且iOS尚未进入didEnterRegion事件?是的。看起来不足以将应用程序唤醒到后台。我更新了我的答案来澄清这一点,我还添加了更好的一步一步解释我是如何得出这个结论的,这样你就可以重现。嘿,你设法解决了这个问题吗?当手动关闭应用程序,然后打开蓝牙时,也会出现同样的问题。