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 ...
随机推荐
- LevelDB架构
LevelDB系列之整体架构 LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口.为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动 ...
- 分布式搜索ElasticSearch构建集群与简单搜索实例应用
分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...
- 4月13号的web标准化交流化-开端
这是实习工作的开始,也是正式踏入北京之后去参加的第一个活动.也算是想着法的去融入这个圈子. 这两个分享都是基于nodejs的.nodejs从11年开始就开始红火.但是真正nodejs能用来干什么? 我 ...
- PHP实现一个简单url路由功能
如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的 ...
- 关于 HttpModule配置问题
在经典模式下,配置到System.web节点 在IIS7以上的集成模式下,要配置到<system.webServer>节点 否则会出现类似一下的错误: 具体配置如下: <config ...
- WCF小实例以及三种宿主
WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...
- linux memcached 安装
下载并安装Memcache服务器端服务器端主要是安装memcache服务器端.下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz ...
- day7 面向对象编程
编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...
- java 逆波兰表达式
最近想把这破机 装成WIN7 想想还是算了 ... 反正用的机会也不多. 不过 发现了一些 想念的东西 从前的作业. 从前的记忆. package org.lmz; import java.util ...
- java.lang.ClassNotFoundException: [Ljava.lang.String解决办法
原来jdk5.0的时候不会报这个错,用了jdk6.0就出现了这个错误,因为没有重载java.lang.String这个类 解决方法: 在vm缺省参数里添加-Dsun.lang.ClassLoader. ...