Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当用户手动打开蓝牙时,不会触发iBeacon未进入区域_Ios_Bluetooth_Ibeacon - Fatal编程技术网

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

Ios 当用户手动打开蓝牙时,不会触发iBeacon未进入区域,ios,bluetooth,ibeacon,Ios,Bluetooth,Ibeacon,我正在测试iBeacon区域监控,并执行以下步骤 1:前提条件:手机中的蓝牙已打开,且应用程序未运行 他说:我打开灯塔 3:应用程序在位置事件后启动(信标区域) 他说:我把灯塔关掉了 5:应用程序仍在运行,并检测到did退出区域事件 6:然后我手动关闭应用程序(这样做是可以的,区域监控仍然有效) 7:我在手机上关闭蓝牙 8:我把灯塔重新打开 9:我在手机上再次打开蓝牙 10:我希望。。。见下文(预期结果) 预期结果进入该区域后,应用程序应该会醒来(我在没有手动切换蓝牙的情况下进行了测试,结果

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

  • 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事件?是的。看起来
不足以将应用程序唤醒到后台。我更新了我的答案来澄清这一点,我还添加了更好的一步一步解释我是如何得出这个结论的,这样你就可以重现。嘿,你设法解决了这个问题吗?当手动关闭应用程序,然后打开蓝牙时,也会出现同样的问题。