浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。

文档全面上新

更科技的视觉体验,更高效的页面结构,快前往体验吧!

体验新版
简介

百度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)
        {
            case BMKGeoFenceRegionStatusInside:
            geofenceMsg.text = @"地理围栏状态:进入地理围栏";
            break;

            case BMKGeoFenceRegionStatusStayed:
            geofenceMsg.text = @"地理围栏状态:停留在地理围栏";
            break;

            case BMKGeoFenceRegionStatusOutside:
            geofenceMsg.text = @"地理围栏状态:离开地理围栏";
            break;

            default:
            geofenceMsg.text = @"地理围栏状态:围栏状态未知";
            break;
        }
    }
}
6移除围栏
当不再需要使用围栏时,可以调用以下几个函数对已经设定的围栏进行移除操作。
- (void)removeTheGeoFenceRegion:(BMKGeoFenceRegion *)region; //移除指定围栏
- (void)removeGeoFenceRegionsWithCustomID:(NSString *)customID; //移除指定customID的围栏
- (void)removeAllGeoFenceRegions;  //移除所有围栏
  • 文档根本没法用

  • 文档水平很差

  • 文档水平一般

  • 文档不错

  • 文档写的很好

如发现文档错误,或对此文档有更好的建议,请在下方反馈。问题咨询请前往反馈平台提交工单咨询。

提交反馈

拖动标注工具

添加矩形标注

添加箭头标注

完成

取消