ios定位sdk | 百度地图api sdk-凯发k8官方旗舰厅

浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。
地理围栏
下载开发文档
简介

百度ios定位sdk提供的地理围栏能力,除了基本的圆形围栏外,还扩展了多边形围栏,帮助开发者实现更多灵活的地理围栏应用。以多边形围栏为例,实现的步骤如下:

1. 引入头文件

在调用定位功能的类中引入 bmklocationcomponent.h 这个头文件

#import<baidumapapi_location/bmklocationcomponent.h>
2. 配置ak

在调用定位时,需要添加ak,需要注意的是请在 sdk 任何类的初始化以及方法调用之前设置正确的 ak。设置ak的方式如下:

[[bmklocationauth sharedinstance] checkpermisionwithkey:@"输入ak"authdelegate:self];
3. 创建地理围栏

地理围栏没有最大个数限制,您可以无限制的创建围栏。但请您根据业务需求合理的创建围栏,控制围栏个数可以有效的保证程序执行效率。定位 sdk 提供根据自定义圆形、自定义多边形两种方式创建地理围栏。

初始化地理围栏管理manager:

self.geofencemanager=[[bmkgeofencemanager alloc] init];
self.geofencemanager.delegate= self;
self.geofencemanager.activeaction=bmkgeofenceactiveactioninside|bmkgeofenceactiveactionoutside|bmkgeofenceactiveactionstayed;
//设置希望侦测的围栏触发行为,默认是侦测用户进入围栏的行为,即bmkgeofenceactiveactioninside,这边设置为进入,离开,停留(在围栏内10分钟以上),都触发回调
self.geofencemanager.allowsbackgroundlocationupdates=yes;//允许后台定位

创建多边形地理围栏:

int size =(int)[_geofencepoints count];
cllocationcoordinate2d*coorarr =malloc(sizeof(cllocationcoordinate2d)* size);
for(int i =0; i < size; i)
{
struct cllocationcoordinate2d p;
[[_geofencepoints objectatindex:i] getvalue:&p];
coorarr[i]=cllocationcoordinate2dmake(p.latitude, p.longitude);
}
[_geofencemanager addpolygonregionformonitoringwithcoordinates:coorarr count:size coortype:bmklocationcoordinatetypebmk09ll customid:@"poly_1"];
4. 开始定位

当围栏创建完毕,且围栏创建成功时会启动定位,这部分无需您来设置,sdk内部执行。 定位机制:通过“远离围栏时逐渐降低定位频率”来降低电量消耗,“离近围栏时逐渐提高定位频率”来保证有足够的定位精度从而完成围栏位置检测。 需要注意,在ios9及之后版本的系统中,如果您希望程序在后台持续检测围栏触发行为,需要保证manager的allowsbackgroundlocationupdates为yes,设置为yes的时候必须保证 background modes 中的 location updates 处于选中状态,否则会抛出异常。

5. 获取围栏创建后的回调和围栏状态改变时的回调

创建围栏后的信息和围栏状态改变时的信息均会通过bmkgeofencemanagerdelegate进行回调,设置内容如下:

self.geofencemanager.delegate= self;

创建围栏后的回调:

在如下回调中知道创建的围栏是否成功,以及查看所创建围栏的具体内容。

/**
* @brief 添加地理围栏完成后的回调,成功与失败都会调用
* @param manager 地理围栏管理类
* @param regions 成功添加的一个或多个地理围栏构成的数组
* @param customid 用户执行添加围栏函数时传入的customid
* @param error 添加失败的错误信息
*/
-(void)bmkgeofencemanager:(bmkgeofencemanager* _nonnull)manager didaddregionformonitoringfinished:(nsarray<bmkgeofenceregion*>* _nullable)regions customid:(nsstring* _nullable)customid error:(nserror* _nullable)error
{
if(error)
{
nslog(@"geofence error = %@", error);
}
else
{
nslog(@"add geofence %@ success", regions.firstobject.customid);
}
}

围栏状态改变时的回调:

在如下回调中知道围栏的状态是否发生改变,或者定位是否失败。围栏的状态表示的就是用户和围栏的关系,有未知、进入围栏、退出围栏、在围栏内停留。回调触发的条件需同时满足:1.围栏的状态从a变成b;2.b符合您在第一步设置的需要侦测的行为的范围内。当然如果self.geofencemanager.activeaction在监听的过程中改变了,所有符合侦测范围的围栏即使状态没有改变也会再次触发回调。

/**
* @brief 地理围栏状态改变时回调,当围栏状态的值发生改变,定位失败都会调用
* @param manager 地理围栏管理类
* @param region 状态改变的地理围栏
* @param customid 用户执行添加围栏函数时传入的customid
* @param error 错误信息,如定位相关的错误
*/
-(void)bmkgeofencemanager:(bmkgeofencemanager* _nonnull)manager didgeofencesstatuschangedforregion:(bmkgeofenceregion* _nullable)region customid:(nsstring* _nullable)customid error:(nserror* _nullable)error
{
if(error)
{
nslog(@"geofence error = %@", error);
}
else
{
nslog(@"geofence %@ status = %ld", region.customid, region.fencestatus);
switch(region.fencestatus)
{
casebmkgeofenceregionstatusinside:
geofencemsg.text= @"地理围栏状态:进入地理围栏";
break;
casebmkgeofenceregionstatusstayed:
geofencemsg.text= @"地理围栏状态:停留在地理围栏";
break;
casebmkgeofenceregionstatusoutside:
geofencemsg.text= @"地理围栏状态:离开地理围栏";
break;
default:
geofencemsg.text= @"地理围栏状态:围栏状态未知";
break;
}
}
}
6. 移除围栏

当不再需要使用围栏时,可以调用以下几个函数对已经设定的围栏进行移除操作。

-(void)removethegeofenceregion:(bmkgeofenceregion*)region;//移除指定围栏
-(void)removegeofenceregionswithcustomid:(nsstring*)customid;//移除指定customid的围栏
-(void)removeallgeofenceregions;//移除所有围栏

上一篇

室内定位

下一篇

移动热点识别

本篇文章对您是否有帮助?

网站地图