全部服务产品
开发者频道
服务升级
登录
订单管理
下载开发文档
创建订单信息
BNOrderInfo* order = [[BNOrderInfo alloc] init];
order.orderId = @"订单号";
order.companyServerId = @"厂商服务唯一标识";
order.driverId = @"司机标识";
order.orderState = BNOrderState_Invalid;
// 起点
BNRoutePlanNode* startLocation = [[BNRoutePlanNode alloc] init];
BNPosition* pos = [[BNPosition alloc] init];
CLLocationCoordinate2D coor = CLLocationCoordinate2DMake(39.92144, 116.43370);
pos.x = coor.longitude;
pos.y = coor.latitude;
pos.eType = BNCoordinate_BaiduMapSDK;
startLocation.pos = pos;
order.startLocation = startLocation;
//接乘客点
BNRoutePlanNode* pickupLocation = [[BNRoutePlanNode alloc] init];
pos = [[BNPosition alloc] init];
coor = CLLocationCoordinate2DMake(39.92144, 116.53370);
pos.x = coor.longitude;
pos.y = coor.latitude;
pos.eType = BNCoordinate_BaiduMapSDK;
pickupLocation.pos = pos;
order.pickUpLocation = pickupLocation;
// 司机当前位置
BNRoutePlanNode* driverCurLocation = [[BNRoutePlanNode alloc] init];
pos = [[BNPosition alloc] init];
coor = CLLocationCoordinate2DMake(39.91885, 116.45932);
pos.x = coor.longitude;
pos.y = coor.latitude;
pos.eType = BNCoordinate_BaiduMapSDK;
driverCurLocation.pos = pos;
order.driverCurLocation = driverCurLocation;
// 终点
BNRoutePlanNode* endLocation = [[BNRoutePlanNode alloc] init];
pos = [[BNPosition alloc] init];
coor = CLLocationCoordinate2DMake(39.947226, 116.403211);
pos.x = coor.longitude;
pos.y = coor.latitude;
endLocation.uid = @"d52831f9bf33f4be2ffaa790";
pos.eType = BNCoordinate_BaiduMapSDK;
endLocation.pos = pos;
order.endLocation = endLocation;
添加订单
/**
添加订单
@param orderInfo 订单信息
@return 是否添加成功
*/
[BNaviService_ShareLocation addOrder:order];
更新订单状态

添加订单后,首先添加导航SDK ShareLocation 事件回调监听器,同时更新订单为待服务状态,当订单状态为待服务状态时,导航SDK内部会发起算路,算路完成后开始轻导航。

/**
* @brief 订单状态
- BNOrderState_Invalid: 无效
- BNOrderState_WaittingForService: 待服务
- BNOrderState_PickUpPassenger: 接乘客
- BNOrderState_WaitingForPassenger: 等待乘客上车
- BNOrderState_SendPassenger: 送乘客
- BNOrderState_Finish: 结束
*/
typedef NS_ENUM(NSInteger, BNOrderState) {
BNOrderState_Invalid = 0,
BNOrderState_WaittingForService = 1,
BNOrderState_PickUpPassenger = 2,
BNOrderState_WaitingForPassenger = 3,
BNOrderState_SendPassenger = 4,
BNOrderState_Finish = 5
} ;
/**
添加位置共享监听
@param listener 监听者
*/
[BNaviService_ShareLocation addShareLocationListener:self];
// 更新订单的状态
[self updateOrderState:BNOrderState_WaittingForService];
- (void)updateOrderState:(BNOrderState)state {
self.order.orderState = state;
/**
更新订单状态
@param orderInfo 订单信息
*/
[BNaviService_ShareLocation updateOrder:self.order.orderId orderState:state];
}

司乘同显相关回调接口:

(1)剩余时间,剩余距离回调

/**
剩余时间和距离变化的消息
@param remainInfo @{@"remaindist":@(remaindist),@"remaintime":@(remaintime)}
*/
- (void)onHandleRemainInfo:(NSDictionary *)remainInfo {
if (!remainInfo) return;
NSInteger remainDist = [remainInfo[@"remaindist"] integerValue];
NSInteger remainTime = [remainInfo[@"remaintime"] integerValue];
if (remainTime > 0 && remainDist > 0){
self.remainInfoLabel.text = [NSString stringWithFormat:@"剩余%ld米,%ld秒",(long)remainDist,(long)remainTime];
} else {
self.remainInfoLabel.text = nil;
}
}

(2)到达终点

- (void)onHandleArriveDestination {
self.remainInfoLabel.text = nil;
}

(3)算路失败回调

- (void)onHandleRoutePlanFail:(NSError *)error {
[self showAlertWithTitle:@"错误" withContent:@"算路失败"];
//重试
[self.reRoutePlanManager reRoutePlan];
}

算路失败后,在开始轻导航前算路失败,导航SDK提供了一个重新发起算路的接口,具体接口如下:

/**
重新发起算路,如果算路失败了,可以调用这个接口重新发起算路。具体算路起终点如下:
(1)订单状态为待服务或者接乘客状态,会以当前司机位置为起点,接乘客点为终点发起算路
(2)订单状态为送乘客状态,会以当前司机位置为起点,乘客目的地为终点发起算路
(3)订单状态为等待乘客或者订单结束或者无效,则不做任何操作
*/
- (void)reRoutePlan:(BNaviRoutePlanCompletionBlock)completionBlock;

开发者可以在收到算路失败回调时,调用该接口重新发起算路。 在demo中,采用的是隔10s后重试,由ReRoutePlanManager类实现,如下:

[self.reRoutePlanManager reRoutePlan];

当用户点击出发按钮,更改状态为待服务状态,代码如下:

[self updateOrderState: BNOrderState_PickUpPassenger];

同时,如果待服务视图控制器不需要接收ShareLocation的消息,可以移除消息监听。

[BNaviService_ShareLocation removeShareLocationListener:self];
注意,如果有采用reRoutePlan,在这里记得要取消算路。(比如已经失败了,10s后会重新发起算路,但是10s内用户点击了出发)。
[self.reRoutePlanManager cancelReRoutePlan];
订单更改目的地

在订单过程中可以变更订单目的地。

司机端发起变更目的地:

/**
变更订单目的地
接口中会通过orderInfo的endLocation判断是否发起重新算路,如果传入的endLocation与之前的一样则不发起重新算路。
可以通过 [BNOrderInfo copy] 方法copy一个新的对象,避免判断成同一个对象。
@param orderInfo 订单信息,不能直接传入当前订单,需要copy一份,然后修改endLocation后传入
@param params 预留字段
*/
- (void)updateOrderEndPosition:(BNOrderInfo *)orderInfo
extParam:(NSDictionary*)params;

司机端可以调用上面接口变更订单目的地,在送乘客状态调用会用新的目的地发起重新算路, 在其它状态下调用不会发起重新算路,会更新订单目的地,在进入送乘客状态时会用新的目的地算路。

预约单

(1)进入预约单

使用场景:从轻导航切换到预约单或者直接进入预约单,使用该api,可以查看demo中ReservationOrderViewController.m这个类,该类中底图的显示也需要调用以下几个api:

[BNaviService_LightNavi viewDidLoad:self.view];

[BNaviService_LightNavi viewWillAppear:self.view];

[BNaviService_LightNavi viewDidAppear:self.view];

/**
进入预约单状态
@param order 订单信息(其中pickUpLocation和endLocation必须有值,用于在底图上显示接乘客点、终点信息)
@param margin 显示区域,接乘客点,订单终点以及司机当前位置需要缩放到该区域,这里需要考虑起终点图标的大小
@return 是否成功
*/
- (BOOL)enterReservationOrderMode:(BNOrderInfo*)order
showMargin:(BNMargin)margin;

(2)离开预约单

使用场景:退出预约单时调用,与进入预约单调用配对使用,可以查看demo中ReservationOrderViewController.m这个类。

/**
离开预约单状态
*/
- (void)leaveReservationOrderMode;

(3)显示或者隐藏路线

使用场景:轻导航中显示或者隐藏路线,参考OrderSimulatorViewController.m中的使用。

/**
轻导航中是否显示路线
@param show 显示或者隐藏
*/
- (void)setRouteShow:(BOOL)show;

(4)设置起点icon

使用场景:设置轻导航隐藏路线时接乘客位置的icon以及预约单中接乘客位置的icon。

/**
设置起点icon(这里显示的是接乘客的位置,在预约单和隐藏路线时生效),不设置使用默认
@param startPositionIcon 起点icon图片
*/
- (void)setStartPositionIcon:(UIImage*)startPositionIcon;

(5)设置终点icon

使用场景:设置轻导航隐藏路线时订单终点位置的icon以及预约单中订单终点位置的icon。

/**
设置终点icon(订单终点的的位置,在预约单和隐藏路线时生效),不设置使用默认
@param endPositionIcon 终点icon图片
*/
- (void)setEndPositionIcon:(UIImage*)endPositionIcon;

上一篇

SDK初始化

下一篇

路线规划

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