如何在屏幕关闭时检测iOS应用中的iBeacon?

时间:2015-12-28 05:24:38

标签: ios swift cllocationmanager ibeacon screen-off

我的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地区时,或者只是 在30-45秒后关闭iBeacon的广告 委托方法" didDetermineState"转向" CLRegionStateOutside" 并留在"外面"状态;
  3. 当我拿着我的iPhone并走进iBeacon地区时,或打开 再次宣传iBeacon的广告,代表方法 " didDetermineState"仍然给出"外面"持续不断 转回"内部"。
  4. 我需要的是,当屏幕关闭时,我可以在iOS设备进入iBeacon区域后立即检测到。寻求帮助......提前致谢。

2 个答案:

答案 0 :(得分:2)

您是否在NSLocationAlwaysUsageDescription添加了info.plist?我真的可以建议你按照this教程进行操作。

答案 1 :(得分:0)

当您开始监控时,始终会对didDetermineState代表进行初始调用。这就是你如何知道你是否已经在信标区域的方法。从那时起,您可以继续依赖didEnter / didExitdidDetermineState也可以与其一起调用)。唯一的问题是,如果用户关闭蓝牙然后重新打开 - 你将失去通常在那段时间内发生的任何状态转换 - 所以调用requestState是个好主意在您检测到蓝牙重新开启后,您将了解当前状态。

总而言之,没有必要连续拨打requestState,而且当屏幕被锁定时,您通常也不会这样做 -iOS会放你的应用程序要按照my answer to your other question进入睡眠状态。除非您使用后台模式让应用程序在后台运行,但是当您提交应用程序进行审核时,您必须能够为其辩护,因为后台模式是针对特定用例保留的。 您应该依赖didEnter / didExit / didDetermineState的自动通话,如果蓝牙已关闭,则需requestState

  

当我拿着我的iPhone并走进iBeacon地区,或者再次打开iBeacon的广告时,委托方法" didDetermineState"仍然给出"外面"持续不断地回到"内部"。

请注意,根据您的iOS设备的硬件功能(您还没有提到您正在测试哪一个),"输入"事件可能需要一段时间才能触发。 Radius did some testing long time ago的人,iOS 7.1上的iPhone 4S长达15分钟。与较新的iPhone型号不同,那款b / c iPhone 4S不支持将BLE扫描卸载到蓝牙芯片。但即使在这些较新的型号上,也可以将多少次扫描卸载到芯片上进行限制,Radius also measured to be 30(在iOS 8.3和3种不同的iOS设备上)。