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];
[self.reRoutePlanManager cancelReRoutePlan];
在订单过程中可以变更订单目的地。
司机端发起变更目的地:
/**变更订单目的地接口中会通过orderInfo的endLocation判断是否发起重新算路,如果传入的endLocation与之前的一样则不发起重新算路。可以通过 [BNOrderInfo copy] 方法copy一个新的对象,避免判断成同一个对象。@param orderInfo 订单信息,不能直接传入当前订单,需要copy一份,然后修改endLocation后传入@param params 预留字段*/- (void)updateOrderEndPosition:(BNOrderInfo *)orderInfoextParam:(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*)ordershowMargin:(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;
上一篇
下一篇
本篇文章对您是否有帮助?