AI
产品服务
解决方案
文档与支持
定价
更新时间: 2026/04/20 15:00
iOS端步骑行无UI导航


无UI导航的场景适用于不需要进入专业导航的场景,开发者可以初始化引擎后可以获取到当前导航MapView,添加到任何父视图上使用,开始导航后路线及相关导航元素会绘制到当前这个导航MapView上。
使用步骤:

1、初始化导航引擎及算路

无UI导航初始化时可以不传入controller参数。

BMKCycleNavigationManager *manager = [BMKCycleNavigationManager sharedManager];
manager.routeGuidanceDelegate = self;
manager.ttsPlayerDelegate = self;
manager.managerDelegate = self;
manager.calcRouteDelegate = self;
manager.locationAuthorizationDelegate = self;
///初始化步骑行导航引擎
BOOL inited = [[BMKCycleNavigationManager sharedManager] initNaviEngine:nil options:nil];
//发起算路
//引擎初始化成功之后,发起导航算路,其中BMKCycleNaviLaunchParam的参数naviType用于指定是普通骑行导航或是电动车骑行导航。
BMKCycleNaviLaunchParam *param = [[BMKCycleNaviLaunchParam alloc] init];
param.naviType = BMK_WALK_CYCLE_NAVIGATION_TYPE_NORMAL_CYCLE;
BMKCycleNaviRouteNodeInfo *startNode = [[BMKCycleNaviRouteNodeInfo alloc] init];
startNode.location = _startAnnotation.coordinate; // 设置起点
BMKCycleNaviRouteNodeInfo *endNode = [[BMKCycleNaviRouteNodeInfo alloc] init];
endNode.location = _endAnnotation.coordinate; // 设置终点
param.startNode = startNode;
param.endNode = endNode;
// 设置算路方式
param.startNode.type = BMKWalkNavigationRouteNodeLocation;
param.endNode.type = BMKWalkNavigationRouteNodeLocation;
[[BMKCycleNavigationManager sharedManager] routePlanWithParams:param];

2.导航引擎算路代理回调实现

在算路回调成功过后,开始导航,无UI导航场景,开始导航的ParentController参数可以为nil,通过getNaviMap拿到当前导航的MapView使用。

#pragma mark - <BMKWalkNaviCalcRouteDelegate>
/// 引擎算路结果
- (void)onNaviCalcRouteResult:(BMKWalkCycleRoutePlanErrorCode)errorCode naviType:(BMKWalkCycleNavigationType)naviType {
if (errorCode == BMK_WALK_CYCLE_ROUTEPLAN_RESULT_SUCCESS) {
if (naviType == BMK_WALK_CYCLE_NAVIGATION_TYPE_WALK) {
NSLog(@"startWalkNaviWithParentController");
// ParentController可以为nil,可以获取到当前导航MapView,添加到任何父视图上使用
[[BMKWalkNavigationManager sharedManager] startWalkNaviWithParentController:nil isPush:YES];
BMKMapView *mapview = [[BMKWalkNavigationManager sharedManager] getNaviMap];
mapview.frame = CGRectMake(0, 100, 200, 200);
/// mapPadding用于设置地图的上左下右预留空间,避免地图logo或绘制元素被其他UI布局遮挡
/// 必要时配合导航路线全览zoomToSpanInsets和小车偏移carPositionOffset接口使用
mapview.mapPadding = UIEdgeInsetsMake(0,0,0,0);
[self.view addSubview:mapview];
} else {
NSLog(@"startCycleNaviWithParentController");
[[BMKCycleNavigationManager sharedManager] startCycleNaviWithParentController:nil isPush:YES];
// ParentController可以为nil,可以获取到当前导航MapView,添加到任何父视图上使用
BMKMapView *mapview = [[BMKCycleNavigationManager sharedManager] getNaviMap];
mapview.frame = CGRectMake(0, 100, 200, 200);
/// mapPadding用于设置地图的上左下右预留空间,避免地图logo或绘制元素被其他UI布局遮挡
/// 必要时配合导航路线全览zoomToSpanInsets和小车偏移carPositionOffset接口使用
mapview.mapPadding = UIEdgeInsetsMake(0,0,0,0);
[self.view addSubview:mapview];
}
} else {
NSLog(@"SDK-引擎算路失败 %ld", errorCode);
}
}

需要多路线的可以设置manager.enableMultiRoute = YES;或参考步骑行多路线算路文档。

3.导航流程控制

无UI导航场景因为没有专业导航页面UI,就需要开发者通过接口控制导航引擎的整体流程及生命周期。
步骑行导航SDK提供以下接口,初始化引擎-算路-开始导航-暂停导航-恢复导航-结束导航-销毁单例;

/**
单例全局访问点
@return BMKCycleNavigationManager单例对象
*/
+ (instancetype)sharedManager;
/**
初始化引擎
@param controller 目的导航控制器
@param option 设置导航定制化参数。
@return 引擎初始化结果
*/
- (BOOL)initNaviEngine:(UIViewController *)controller option:(BMKWalkCycleNavigationDisplayOption *)option;
/// 初始化引擎 since 6.6.2
/// @param controller 导航页面,由开发者提供。
/// @param options 导航相关可选配置参数。
/// @return 引擎初始化结果。
- (BOOL)initNaviEngine:(UIViewController *)controller
options:(BMKWalkCycleNavigationOptions *)options;
/**
导航过程生命周期函数, 开始导航,since 6.5.2
@controller 父controller,用于push或present
@isPush 是否Push出新页面,YES:push;NO:present
@return 开始导航结果
*/
- (BOOL)startCycleNaviWithParentController:(UIViewController *)controller isPush:(BOOL)isPush;
/// 退出骑行专业导航,等同于点击骑行专业导航退出按钮,since 6.5.8
- (void)exitCycleNomalNavi;
/**
导航过程生命周期函数, 暂停导航
*/
- (void)pause;
/**
导航过程生命周期函数, 恢复导航
*/
- (void)resume;
/**
导航过程生命周期函数, 结束导航
*/
- (void)stop;
/**
销毁单例
*/
+ (void)destroy;

4.导航控制

以下是不同时机可以使用的接口
建议引擎初始化前使用:(包含所有代理回调,都建议初始化引擎前设置)

/// 导航时是否支持手机传感器方向信息,默认YES
@property (nonatomic, assign) BOOL supportHeading;

仅引擎初始化后算路前使用:

/// 设置导航是否显示红路灯倒计时,引擎初始化成功后调用,默认:NO,有高级权限时默认YES,since 6.6.2
@property (nonatomic, assign) BOOL showRedGreenLight;
/// 设置默认比例尺,默认:19,范围:4~22,since 6.6.4
@property (nonatomic, assign) float defaultNaviMapLevel;

支持导航中动态设置的接口:(以下接口算路前也可以设置)

/// 路线全览区域在mapview上的insets,since 6.5.8
@property (nonatomic, assign) UIEdgeInsets zoomToSpanInsets;
/// 设置导航地图旋转模式,默认:BMKNaviMapRotateModeRoute 路线朝上,since 6.6.2
@property (nonatomic, assign) BMKNaviMapRotateMode naviMapRotateMode;
/// 设置导航地图俯仰视角模式,默认:BMKNaviMapOverlookingMode2D 2d视角,since 6.6.2
@property (nonatomic, assign) BMKNaviMapOverlookingMode naviMapOverlookingMode;
/// 设置导航是否全览状态,默认:NO 导航态,,since 6.6.2
@property (nonatomic, assign) BOOL naviMapViewAllStatus;
/// 小车XY偏移量,默认无效值(MAXFLOAT, MAXFLOAT),初始化引擎后设置,since 6.6.4
@property (nonatomic, assign) CGPoint carPositionOffset;
/// 导航设置选项,初始化导航后设置,支持路口放大效果设置
@property (nonatomic, strong) BMKWalkCycleNaviSettingManager *naviSettingManager;

5.自定义导航元素

以下接口支持动态设置导航元素的隐藏显示和自定义

#pragma mark - 导航元素控制
/// 导航元素显示控制,包括:引导红线,红绿灯标签,红绿灯倒计时气泡,路名气泡,交通设施标签,交通设施气泡,里程碑标签等
/// - Parameters:
/// - show: YES:显示;NO:隐藏
/// - elements: 显示/隐藏的元素,可支持元素类型参考:BMKNaviDrawElementType
/// 如:@[@(BMKNaviDrawElementTypeRedLine), @(BMKNaviDrawElementTypeTrafficLight), @(BMKNaviDrawElementTypeTrafficLightPop)]
- (void)setNaviDrawElementsShow:(BOOL)show elements:(NSArray *)elements;
/// 更新导航元素自定义样式
/// 包括罗盘、定位点(小车)、终点图片及图片尺寸缩放;路线未走过和已走过纹理、线宽;路名字体大小、颜色;路名气泡字体大小、颜色及背景色
/// - Parameters:
/// - dispalyOption: 自定义主导航实例元素自定义样式(这里自定义多实例的元素样式不会生效)
- (void)updateNaviDrawItemDisplayOption:(BMKWalkCycleNaviDrawItemDisplayOption *)dispalyOption;

导航元素自定义样式除了动态设置,也支持在引擎初始化时使用引擎初始化接口的options设置:BMKWalkCycleNavigationOptions->BMKWalkCycleNavigationDisplayOption->BMKWalkCycleNaviDrawItemDisplayOption。

/// 初始化引擎 since 6.6.2
/// @param controller 导航页面,由开发者提供。
/// @param options 导航相关可选配置参数。
/// @return 引擎初始化结果。
- (BOOL)initNaviEngine:(UIViewController *)controller
options:(BMKWalkCycleNavigationOptions *)options;

上一篇

骑行行前多路线

下一篇

坐标转换
本篇文章对您是否有帮助?