iBeacon在iPhone锁屏下有几率扫描不到蓝牙设备以及折中解决方案
前言:
这个问题的确困扰了很久,查了国内外各种论坛、社区,都没找到一个有效的解决办法。
所幸后来用一种折中的办法解决了,但也不是从技术根本上解决的,所以有解决的兄弟还望指导下。
正文如下:
一、需求描述:
1、扫描设备签到,只扫描,不连接
2、签到后,对设备进行区域监听
3、监听过程中,收到离开回调后,立即扫描设备进行确认。
二、问题描述:
当对iBeacon进行Monitor监听后:
- 退到后台模式,收到离开回调,能扫描到。
- 后台锁屏状态,收到离开回调,有几率扫描不到(但实际上,手机离设备距离没变,一进入前台,能立即扫描到)。
所以问题点就在于:iPhone锁屏下,为什么有时明明距离足够,但却有几率扫描不到,而同等距离,在前台能扫描到。
三、资料查询
3、iBeacon events while screen is off
4、智石开发者论坛
6、iBeacon enter and exit region constantly every 1 minute
......
这里列举了几个网站,相关网站大家可以根据关键字搜索,总结下来,有这样几个结论:
1、didEnter 和 didExit 方法并不是完全准确的,很多时候有误报发生,原因就是设备发射会有间隔,如果间隙时候正好导致手机端扫描不到,会产生回调事件(这就是不准确的回调提醒)。
2、后台事件下,只会保证进出回调事件的发送及生命周期,而didRange并不会保证完整的生命周期。就是说,后台模式下甚至杀掉应用进程后,进出回调是不会终止的,每次都能保证发出来,但扫描设备的方法,不一定会是存在的,系统可能会因为内存问题,禁止这部分的功能。(这可能也正是我所遇到的问题)
3、我本来的应用,是没有勾选后台模式蓝牙选项的,因为关于这点,我已经测试过,勾选后,我的问题还是存在的,所以这个方法也是不行的。

4、关于勾选后台定位,这一点这里我详细说一下:
勾选了Location updates之后,你在代码里开启了 start updateLocation 之后,手机的确是可以一直保持后台的,但Apple对这点特别严格,你的应用必须有相关的功能体现,比如地图轨迹等,并且最好有开关的提示,供用户开启关闭,而且开启这个,手机的耗电量会急剧上升,考虑到我们产品的需求和用户体验,这种方案被排除了。
四、折中解决办法
既然这种问题,可能是系统的一种内存机制导致的,所以每次离开,立即扫描设备的方案有这种缺陷,我们想了一种折中办法来处理这种情况。
经过我们的数据测试,以500人为例,发生这种情况的比例,大概为30人左右,也就是靠近10%的比例。由于我们做的学生签到方案,这种不稳定比例是万万超过预期值的。
所以我们的折中方案就是:
定位测距,原理如下:
1、学生教室签到时,记录下本节课签到的初始位置。
2、当系统锁屏下遇到离开回调,首先记录此时位置,再去立即扫描设备,如果扫描不到,根据两次经纬度算出距离,跟我们的后台定义临界距离比较,超过则认为是真的离开教室。
- 这里有点细节,第一个,每次离开事件后,立即定位,会触发多次,我们要找的一个最小值,并且比较出每次小于临界值的次数(这些是为了提升定位准确率,毕竟定位还是有误差的)
3、第三点比较重要,就是利用到极光的自定义推送(每小节课之前,后台会推出一条消息过来),经过多次测试,发现后台模式下,自定义推送都是能够收到的,此时,如果2中的处理,依然有学生状态的误判(毕竟我们的临界值不能太大,不然会过滤掉真正的逃课),这里会再此校验一次,而且这次的临界值距离可以适当放大,重新定位,测距将2中遗漏的错误弥补掉。
当然这里也会有一些细节,比如每小节课签到后,需要重新定位记录初始位置(可能会有换教室情形发生)等等。
这种方案算是一种折中解决学生状态不准确的处理,不过对于最本质的问题:锁屏扫描有几率失败,如果有更好的解决办法,还望有解决的兄弟能够留言下~~
iBeacon在iPhone锁屏下有几率扫描不到蓝牙设备以及折中解决方案的更多相关文章
- iOS微信自动抢红包插件(支持后台和锁屏下抢红包)
前言:本文主要讲述使用hook方式实现红包插件,涉及到tweak相关知识,如果你不想了解具体实现细节可直接到我的Github地址参考安装(包含越狱和非越狱两种方法) 转眼间2017即将过去,又到了 ...
- android开发技巧——仿新版QQ锁屏下弹窗
新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...
- Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法
Android-服务中监听电源键和Home键的广播 http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...
- android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动
android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动 1.先简单设置一个闹钟提醒事件: //设置闹钟 mSetting.setOnClickListener ...
- 移动端 iphone锁屏文字效果
简易的仿照iphone 效果 笔记备份 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Conten ...
- OC-音乐播放器-锁屏处理
QQ音乐播放的过程中,锁屏状态下的效果如下: 也就是说,QQ音乐播放过程中,添加锁屏远程事件的监听. 本文只记录本人知道的小知识点,不提供完整的代码. 实现的原理: (1)获取锁屏歌曲信息中心:MPN ...
- swift锁屏播放,音乐进度更新,专辑,歌手名显示
我自己用的音乐播放器是自带的AVPlayer 导入头文件#import <MediaPlayer/MediaPlayer.h> 远程控制事件接收与处理- (void)viewWillApp ...
- 360wifi: 手机锁屏360wifi掉线的解决方法
如遇到iphone锁屏断网的情况,按照以下操作步骤可以解决一部分用户的问题 (该问题并不是360WifFi问题,与苹果机制有关)如有安卓手机掉线,请确保手机连接其他Wifi并不会掉线,然后尝试粉色字体 ...
- Android LockScreen (锁屏弹窗)
在要弹窗的Activity需要进行以下设置,才可以在锁屏状态下弹窗 @Override protected void onCreate(Bundle savedInstanceState) { fin ...
随机推荐
- c#多选下拉框(ComboBox)
代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawi ...
- jQuery选择表格中的列
以选择table中的第一列为例: 方式1: $("table tr").find("td:first").html("first column&quo ...
- IE6的那些css常见bug(汇总)
IE6的那些css常见bug(汇总) 我的微博终于在前几天建立了 虽说很早之前就知道博客园这个地方 但怕自己不能坚持去写一些东西一直没有建.这几天 我做了这个决定 把我的博客建起来 每周发一些看到的, ...
- python打包成window可执行程序
python程序可以通过python hello.py执行,但是需要安装python的解释器,并配置环境变量,打包成exe程序之后可以直接执行. 使用setup工具和py2exe可以做到这一点. 最简 ...
- 读取的XML节点中带有冒号怎么办?
读取的XML节点中带有冒号怎么办? 昨天,编程读取XML的时候,遇上了类似下面的一段XML <a:root xmlns:a="http://ww.abc.com/"> ...
- C#基础原理拾遗——引用类型的值传递和引用传递
C#基础原理拾遗——引用类型的值传递和引用传递 以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看.这个毛病得改,就从这一篇开始… 最近准备面试,深感基础之重要,奈何我不是计算机科 ...
- 快速构建C++项目工具Scons,结合Editplus搭建开发环境
Windows下C++开发工具用的最多的非VS莫属了(当然也有很多比如eclipse,Qt等等),便捷的项目构建向导,再加上强大的VC助手,使得开发和调试得心应手.并不是说vc就没有缺点,相反缺点也不 ...
- tag标签记录
看到项目代码中有一个自定义的tag标签,想起以前自己写过的标签,竟然忘记的差不多了,手一痒,自己写个简单的tag标签,回顾一下历史知识 首先建一个servlet工程,然后写个index.jsp,项目跑 ...
- Wireshark抓包介绍和TCP三次握手分析
wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...
- JavaScript 中 if 条件判断
在JS中,If 除了能够判断bool的真假外,还能够判断一个变量是否有值. 下面的例子说明了JS中If的判断逻辑: 变量值 true '1' 1 '0' 'null' 2 '2' false 0 n ...