ios司乘同显sdk | 百度地图api sdk-凯发k8官方旗舰厅

凯发k8官方旗舰厅-凯发app官方网站
全部服务产品
开发者频道
服务升级
登录
订单管理
下载开发文档
创建订单信息
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初始化

下一篇

路线规划

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

网站地图