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;
上一篇
下一篇
本篇文章对您是否有帮助?