2

在我的 iOS 应用程序中,仍在与 iBeacon 监控屏幕关闭模式作斗争。

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

我在这篇文章中发现了一些重要信息,说“iOS 以两种不同的方式使用信标:区域监控和信标测距。后者在后台不起作用......或者当应用程序终止时。

CLLocationManager进入区域时,只会触发一次委托调用。如果您在该区域内开始监视该区域,则不会调用入口委托。您的应用必须手动调用 CLLocationManager 的 requestStateForRegion 方法。退出受监控区域后,CLLocationManager 将在大约 30-45 秒后调用 didExitRegion。”

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

  1. 如果我的 iPhone 已经在 iBeacon 区域,委托方法“didDetermineState”连续给出“CLRegionStateInside”;
  2. 当我拿着 iPhone 走出 iBeacon 区域,或者只是关闭 iBeacon 的广告时,30-45 秒后,委托方法“didDetermineState”变为“CLRegionStateOutside”并保持“outside”状态;
  3. 当我拿着我的 iPhone 走进 iBeacon 区域,或者再次打开 iBeacon 的广告时,委托方法“didDetermineState”仍然连续给出“outside”,并且永远不会返回“inside”。

我需要的是,当屏幕关闭时,我可以在我的 iOS 设备进入 iBeacon 区域时立即检测到。寻求帮助...在此先感谢。

4

2 回答 2

2

你有没有NSLocationAlwaysUsageDescription在你的info.plist? 我真的可以推荐你按照这个教程来完成所有这些。

于 2015-12-28T05:34:09.720 回答
0

didDetermineState当您开始监控时,总会有一个对委托的初始调用。这就是您可以确定您是否已经在信标区域的方法。从那时起,您可以继续依赖didEnter/ didExitdidDetermineState与这些一起也称为)。唯一的问题是,如果用户关闭蓝牙然后重新打开 - 您将失去在此期间通常会发生的任何状态转换 - 所以最好requestState在检测到蓝牙重新打开后调用,以获取赶上了当前的状态。

总而言之,没有必要requestState连续调用,而且通常在屏幕锁定时你也不能这样做——根据我对你其他问题的回答, iOS 会让你的应用进入睡眠状态。除非您使用后台模式来保持应用程序在后台运行,但是当您提交应用程序以供审核时,您必须能够保护它,因为后台模式是为非常特定的用例保留的。您应该依靠对didEnter/ didExit/的自动调用didDetermineState,并requestState在蓝牙关闭和打开时提供帮助。

当我拿着我的 iPhone 走进 iBeacon 区域,或者再次打开 iBeacon 的广告时,委托方法“didDetermineState”仍然连续给出“outside”,并且永远不会返回“inside”。

请记住,根据您的 iOS 设备的硬件功能(您没有提到您正在测试哪个设备),“进入”事件可能需要一段时间才能触发。Radius 的人很久以前就做过一些测试,iOS 7.1 上的 iPhone 4S 最多需要 15 分钟。那是 b/c iPhone 4S 不支持将 BLE 扫描卸载到蓝牙芯片,这与较新的 iPhone 型号不同。但即使在这些较新的型号上,可以将多少扫描卸载到芯片上也是有限制的,Radius 也测量为 30(在 iOS 8.3 和 3 种不同的 iOS 设备上)。

于 2015-12-28T09:10:17.950 回答