iOS开发笔记之五十六——Geofencing地理围栏技术介绍

来源:互联网 发布:淘宝网官方网站登入 编辑:程序博客网 时间:2024/04/30 00:59

我们业务有这样的一个需求场景,当用户走进某一商户附近时,我们可以给用户发送和此商户相关的推送消息,从而为业务引流。针对这种需求,我们启动了这个技术调研,android的方案大致是不断获取用户当前位置经纬度,并上报到后端,后端经过计算判断用户是否已经进入提前划好的区域,如果进入,则发送远程通知给用户即可。由于iOS和android的后台能力不同,所以实现此功能的方案也不同。如果App一直处于Active状态时还好,但是一旦App处于Backgroud后台,就复杂了。经过调研,发现Core Location提供了Region Monitoring这种功能。

一、使用Region Monitoring需要满足的条件

根据苹果官方文档中介绍,需要满足以下几个条件,才可以使用Region Monitoring:


翻译过来就是:

1、用户的手机没有区域监控所需的硬件;

2、用户拒绝了App使用区域监控功能;

3、在设置里面用户关闭了App的定位服务;

4、用户关闭了后台应用刷新;

5、设备处于飞行模式状态;

当然我们可以通过调用CLLocationManager的isMonitoringAvailableForClass:类方法和authorizationStatus(kCLAuthorizationStatusAuthorizedAlways)来判断Region Monitoring功能的可用性。

二、CLCircularRegion监控区域

我们可以使用CLCircularRegion定义被监控的区域,看下这个类的定义就可以发现,有个center和radius,说明我们监控的区域都是圆形的。通过以下方法来进行初始化被检测的区域:


identifier是region的唯一标识,如果添加的region的identifier相同,新的region将会替换掉旧的region。

三、启动使用

调用CLLocationManager的startMonitoringForRegion:方法进行区域监测。区域监测结束时,可调用stopMonitoringForRegion:方法结束区域监测。

但是注册了区域之后就立刻开始监控了,但不会收到事件,这是因为事件触发的条件必须是“boundary crossings”,也就是必须穿进或者穿出一个区域才能触发回调方法:

可以使用CLLocationManagerrequestStateForRegion:方法检查用户是否已经处于某个区域。当使用者进入、离开监测区域时,如果app没有在执行,这个app会在Backgroud被relaunched,处理所触发的进入、离开动作。如果app在后台处于suspended状态,这个app会被wokenup一小段时间(大概10秒,必要时可以要求更多背景执行时间)。细心的人一定会想,如果有用户在边界处不停地“徘徊”,难道会一直出发回调,对于这种情况,苹果也有对应的解决方案,如下:


四、Region limit

苹果的官方文档中指出,每个App最多可以monitor 20个区域,监测的region是共享的系统资源,而整个系统所提供的监测数量是有限的。对于这个限制,苹果给出的一个策略是,根据用户当前所在位置设置不同的区域,用户改变位置后,移除远离的区域,设置新的区域。如果你超出了20继续添加的话,会执行fail回调给你,如下:


通过下面stop方法即可停止monitor一个区域:

- (void)stopMonitoringForRegion:(CLRegion *)region

五、注意事项

1、如果用户远离了注册的region,建议有对应的remove策略,毕竟定位相关的服务是比较耗电的;

2、请慎重地按需选择定位accuracy精度和monitor的radius,它们的值都不宜设置的太大或太小;

3、经过测试,region monitor会将处于not running或suspend状态下的app唤起到backgroud状态,期间会执行appdelegate中的方法,

例如,application:didFinishLaunchingWithOptions:,如果你的app在这里有比较大的性耗操作,建议优化下。


六、demo演示操作

下面我们来看一下一个演示demo,这个demo是代码地址已在下面备注,可以自行下载:

1、我们在陆家嘴区域register一个center为31.239394,121.499781,半径为1000米的区域,如下:


2、改变一下模拟定位的位置为:31.259394,121.499781,如下:


3、此时我们再次改变当前位置经纬度为:31.240394,121.499781,已经进入被检测区域,如下:


同样的,如果我们把App切到后台或者杀掉,改变当前位置,依然可以收到本地local的通知,如下:


七、参考资料:

1、苹果Region Monitoring文档

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html#//apple_ref/doc/uid/TP40009497-CH9-SW11

2、https://www.raywenderlich.com/136165/core-location-geofencing-tutorial

3、运行demo:

https://github.com/942v/Geotify-RW

1 0
原创粉丝点击