前言:
这个问题的确困扰了很久,查了国内外各种论坛、社区,都没找到一个有效的解决办法。
所幸后来用一种折中的办法解决了,但也不是从技术根本上解决的,所以有解决的兄弟还望指导下。
正文如下:
一、需求描述:
1、扫描设备签到,只扫描,不连接
2、签到后,对设备进行区域监听
3、监听过程中,收到离开回调后,立即扫描设备进行确认。
二、问题描述:
当对iBeacon进行Monitor监听后:
- 退到后台模式,收到离开回调,能扫描到。
- 后台锁屏状态,收到离开回调,有几率扫描不到(但实际上,手机离设备距离没变,一进入前台,能立即扫描到)。
所以问题点就在于:iPhone锁屏下,为什么有时明明距离足够,但却有几率扫描不到,而同等距离,在前台能扫描到。
三、资料查询
1、
2、
3、
4、
5、
6、
7、
......
这里列举了几个网站,相关网站大家可以根据关键字搜索,总结下来,有这样几个结论:
1、didEnter 和 didExit 方法并不是完全准确的,很多时候有误报发生,原因就是设备发射会有间隔,如果间隙时候正好导致手机端扫描不到,会产生回调事件(这就是不准确的回调提醒)。
2、后台事件下,只会保证进出回调事件的发送及生命周期,而didRange并不会保证完整的生命周期。就是说,后台模式下甚至杀掉应用进程后,进出回调是不会终止的,每次都能保证发出来,但扫描设备的方法,不一定会是存在的,系统可能会因为内存问题,禁止这部分的功能。(这可能也正是我所遇到的问题)
3、我本来的应用,是没有勾选后台模式蓝牙选项的,因为关于这点,我已经测试过,勾选后,我的问题还是存在的,所以这个方法也是不行的。
4、关于勾选后台定位,这一点这里我详细说一下:
勾选了Location updates之后,你在代码里开启了 start updateLocation 之后,手机的确是可以一直保持后台的,但Apple对这点特别严格,你的应用必须有相关的功能体现,比如地图轨迹等,并且最好有开关的提示,供用户开启关闭,而且开启这个,手机的耗电量会急剧上升,考虑到我们产品的需求和用户体验,这种方案被排除了。
四、折中解决办法
既然这种问题,可能是系统的一种内存机制导致的,所以每次离开,立即扫描设备的方案有这种缺陷,我们想了一种折中办法来处理这种情况。
经过我们的数据测试,以500人为例,发生这种情况的比例,大概为30人左右,也就是靠近10%的比例。由于我们做的学生签到方案,这种不稳定比例是万万超过预期值的。
所以我们的折中方案就是:
定位测距,原理如下:
1、学生教室签到时,记录下本节课签到的初始位置。
2、当系统锁屏下遇到离开回调,首先记录此时位置,再去立即扫描设备,如果扫描不到,根据两次经纬度算出距离,跟我们的后台定义临界距离比较,超过则认为是真的离开教室。
- 这里有点细节,第一个,每次离开事件后,立即定位,会触发多次,我们要找的一个最小值,并且比较出每次小于临界值的次数(这些是为了提升定位准确率,毕竟定位还是有误差的)
3、第三点比较重要,就是利用到极光的自定义推送(每小节课之前,后台会推出一条消息过来),经过多次测试,发现后台模式下,自定义推送都是能够收到的,此时,如果2中的处理,依然有学生状态的误判(毕竟我们的临界值不能太大,不然会过滤掉真正的逃课),这里会再此校验一次,而且这次的临界值距离可以适当放大,重新定位,测距将2中遗漏的错误弥补掉。
当然这里也会有一些细节,比如每小节课签到后,需要重新定位记录初始位置(可能会有换教室情形发生)等等。
这种方案算是一种折中解决学生状态不准确的处理,不过对于最本质的问题:锁屏扫描有几率失败,如果有更好的解决办法,还望有解决的兄弟能够留言下~~