我的iOS应用程序仍在使用iBeacon监控屏幕关闭模式。
在我的实验中,当屏幕关闭时,委托方法" locationManager:didRangeBeacons:inRegion:"仍然连续触发,但是,一旦屏幕关闭,信号就会相应消失(RSSI = 0,beacon.accuracy = -1.0),然后,10秒后,根本找不到信标。
我在this帖子中发现了一些重要信息,说明" iOS以两种不同的方式使用信标:区域监控和信标范围。后者不适用于后台......,或者应用程序终止时。
CLLocationManager
只会在输入某个区域时触发一个代表呼叫。如果您在该区域内部开始监视区域,则不会调用条目委托。您的应用必须手动调用CLLocationManager的requestStateForRegion方法。一旦退出受监控的区域,CLLocationManager将在大约30-45秒后调用didExitRegion。"
现在我试着调用" requestStateForRegion:"屏幕关闭时连续的方法。结果是:
我需要的是,当屏幕关闭时,我可以在iOS设备进入iBeacon区域后立即检测到。寻求帮助......提前致谢。
答案 0 :(得分:2)
您是否在NSLocationAlwaysUsageDescription
添加了info.plist
?我真的可以建议你按照this教程进行操作。
答案 1 :(得分:0)
当您开始监控时,始终会对didDetermineState
代表进行初始调用。这就是你如何知道你是否已经在信标区域的方法。从那时起,您可以继续依赖didEnter
/ didExit
(didDetermineState
也可以与其一起调用)。唯一的问题是,如果用户关闭蓝牙然后重新打开 - 你将失去通常在那段时间内发生的任何状态转换 - 所以调用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设备上)。