2015-12-28 41 views
1

我的iOS应用程序仍然与iBeacon监控屏幕关闭模式搏斗。如何在屏幕关闭时检测iOS应用程序中的iBeacon?

在我的实验中,当屏幕关闭时,委托方法“locationManager:didRangeBeacons:inRegion:”仍然被持续触发,但是一旦屏幕关闭,信号就会相应消失(RSSI = 0, beacon.accuracy = -1.0),然后在10秒钟后,根本找不到信标。

我发现this后一些重要的信息说,“iOS版会使用两种不同的方式标:。区域监测和灯塔为后者没有在后台工作...,或当应用程序被终止

CLLocationManager将只火了进入的区域,当一个委托调用。如果你开始,而该区域的内部监控的区域,该条目代表将不会被调用。您的应用程序将不得不手动调用CLLocationManager的requestStateForRegion方法。一旦您退出监控区域,CLLocationManager将在约30-45秒后调用didExitRegion。“

现在我试图在屏幕关闭时连续调用“requestStateForRegion:”方法。其结果是:

  1. 如果我的iPhone已经在iBeacon显示区域,委托方法 “didDetermineState”给出“CLRegionStateInside”不断;
  2. 当我认为我的iPhone,然后步行iBeacon显示区域外,或者只是 关闭iBeacon显示的广告,30-45秒钟后, 委托方法“didDetermineState”变为“CLRegionStateOutside” 和“外部”的状态持续;
  3. 当我认为我的iPhone和走iBeacon显示区域内,或重新打开 的iBeacon显示的广告,委托方法 “didDetermineState”仍然给“外部”连续NEVER BACK变为“内部”。

我需要的是,当屏幕关闭时,只要我的iOS设备进入iBeacon区域,我就可以检测到。寻求帮助...提前致谢。

回答

2

有你在info.plist添加NSLocationAlwaysUsageDescription?我真的可以推荐你去关注this这个教程。

+0

是的,我确实添加了info.plist中的密钥。 – kuang

+0

我也试过并阅读了教程。它还没有解决我的问题。 – kuang

+0

我试了一下教程,发现它有同样的问题:只有退出事件可以被捕获,但输入事件永远保持沉默。 – kuang

0

当您开始监控时,始终会有一个初始呼叫给didDetermineState委托人。这就是你如何确定你是否已经在灯塔区。从此,您可以继续依靠didEnter/didExitdidDetermineState也被称为旁边这些)。唯一的问题是,如果用户关闭蓝牙然后重新打开 - 您将失去通常在此期间发生的任何状态转换 - 因此,在检测到蓝牙重新打开后,拨打requestState是个好主意,赶上目前的状态。

总而言之,没有必要不断地打电话requestState,你通常无法即使这样做,当屏幕被锁定 -iOS会把你的应用的睡眠,每my answer to your other question。除非您使用后台模式将应用程序保持在后台运行,但在提交应用程序进行审阅时必须能够保护它,因为后台模式仅用于特定用例。如果蓝牙关闭和打开,您应该依靠自动拨打电话didEnter/didExit/didDetermineStaterequestState

当我认为我的iPhone和走iBeacon显示区域内,或再次打开iBeacon显示的广告,委托方法“didDetermineState”仍然给“外部”连续永不退缩变为“内部”。

请即根据您的iOS设备的硬件功能(你没有提到你与测试哪一个)的头脑中,“输入”事件可能需要一段时间才能触发。 Radius did some testing long time ago的玩家,iOS 7.1上iPhone 4S的玩家达15分钟。这是B/C iPhone 4S不支持将BLE扫描卸载到蓝牙芯片,与新款iPhone机型不同。但即使在这些较新的型号上,有多少扫描可以卸载到芯片上也是有限的,其中Radius also measured to be 30(在iOS 8.3和3个不同的iOS设备上)。

+0

非常感谢。我的设备是iPhone 5s。现在我删除了连续的“requestState”并转而捕获“didEnter”/“didExit”委托方法。结果都是一样的,在屏幕关闭模式下,“didExit”可以被捕获,但“didEnter”从不被触发,而后者是我真正需要的。 (假设大多数用例是iPhone在用户口袋里关掉屏幕,当接近iBeacon时,应该点燃推送通知,这依赖于“didEnter”被及时捕获)。 – kuang

相关问题