开发 出行解决方案接入规范 行程中-相关服务 司乘同显 司乘同显-司机端-iOS

司乘同显-司机端-iOS 最后更新时间: 2021年01月22日

概述

司乘同显iOS端服务接入和重要功能介绍, 相关具体接入文档请查看参考手册.

 

入门指南

1.获取Key

1.创建新应用

进入控制台,创建一个新应用。如果您之前已经创建过应用,可直接跳过这个步骤。 

 

2.添加新key

在创建的应用上点击"添加新Key"按钮,在弹出的对话框中,依次输入应用名名称,选择绑定的服务为“iOS平台SDK”,输入您的key名称Bundle ID,如下图所示:

需要注意的是: 1个KEY只能用于一个应用,1个Key在多个应用上使用会出现服务调用失败。

 在阅读完高德地图API服务条款后,勾选此选项,点击“提交”,完成 Key 的申请,此时您可以在所创建的应用下面看到刚申请的 Key 了。


如何获取 Bundle Identifier?

以下为您提供两种获取 Bundle Identifier 的方法。 

  • 方法一

通过代码获取,代码如下所示:

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
  • 方法二

Xcode 切换到 General 标签,查看 Bundle Identifier,如下图所示: 

3.开通权限

需要联系高德对应接口人开通司乘同显权限。

4.配置key

引入基础SDK头文件#import <AMapFoundationKit/AMapFoundationKit.h>并添加如下示例代码,配置之前在官申请的高德Key。

[AMapServices sharedServices].apiKey = @"您的Key";

 

2.集成SDK包

1.CocoaPods配置

配置podfile, 在里面添加如下配置:

1)司机端:

platform :ios, '8.0'
target '您的工程名' do
pod 'AMap3DMap'
pod 'AMapNavi'
pod 'AMapSearch'
end

2)乘客端:  

platform :ios, '8.0'
target '您的工程名' do
pod 'AMap3DMap'
pod 'AMapSearch'
end

 

2.手动配置

参考http://lbs.amap.com/api/ios-sdk/guide/create-project/manual-configuration

快速接入

1、创建MADriverRouteManager

1) 初始化MADriverRouteManager

_driverManger = [[MADriverRouteManager alloc] init];
  //是否自动调整地图显示区域
    _driverManger.automaticAdjustMapRegion = YES;
  //是否显示走过的路线
    _driverManger.showsPassedTrace = YES;
  //  调整地图显示区域时间间隔,默认10s 
    _driverManger.autoAdjustMapTimeInterval = 10;
    _driverManger.traceSID = [[SCTXAppSettings sharedInstance] sid];
    _driverManger.delegate = self;
    _driverManger.mapView = _mapView;
  //是否开启log输出
    _driverManger.enableDebugLog = NO;
    _driverManger.carImage = [UIImage imageNamed:@"taxi_car"];
    _driverManger.startImage = [UIImage imageNamed:@"startPoint"];
    _driverManger.endImage = [UIImage imageNamed:@"endPoint"];
    //是否允许后台定位
    _driverManger.driveManager.allowsBackgroundLocationUpdates = YES;
  //指定定位是否会被系统自动暂停
    _driverManger.driveManager.pausesLocationUpdatesAutomatically = NO;


2、设置订单信息

[_driverManger setOrderInfoWith:[self getOrderIdText] 
                  beginPosition:_selectedStartPoint.coordinate 
                    endPosition:_selectedEndPoint.coordinate];


3、切换订单状态

1)订单状态类型

///行程状态
typedef NS_ENUM(NSInteger, MASCTXDRouteStatus)
{
    MASCTXDRouteStatusUnspecified = 0, ///<未指定状态
    MASCTXDRouteStatusPickupPassenger = 1, ///<去接乘客
    MASCTXDRouteStatusWaitPassenger = 2, ///<等待乘客上车
    MASCTXDRouteStatusPassengerOnBoard = 3, ///<乘客已上车
    MASCTXDRouteStatusOrderComplete = 4, ///<订单已结束
};

2)订单状态切换

_driverManger.status = MASCTXDRouteStatusXXX;


4、调起导航组件

在接乘客和送乘客阶段可以调起高德导航组件进行导航:

/**
 * @brief 调起导航组件。内部默认添加设置:setStartNaviDirectly:YES、
                     setNeedCalculateRouteWhenPresent:NO、
                           setNeedDestoryDriveManagerInstanceWhenDismiss:NO
 * @param compositeManager 导航组件manager
 * @param compositeUserConfig config
 * @since 3.1.0
 */
- (void)startNaviWithCompositeManager:(AMapNaviCompositeManager *)compositeManager 
                compositeUserConfig:(AMapNaviCompositeUserConfig *)compositeUserConfig;
AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
[_sctxDriverManager startNaviWithCompositeManager:_naviCompositeManager compositeUserConfig:config];

功能使用

功能1:设置订单号

//司机端起始点初始化
_driverViewController = [[SCTXDriverViewController alloc]init];
_driverViewController.selectedBeginPoint = self.selectedBeginPoint;
_driverViewController.selectedBeginPOIID = self.selectedBeginPOIID;
_driverViewController.selectedEndPoint = self.selectedEndPoint;
_driverViewController.selectedEndPOIID = self.selectedEndPOIID;

//乘客端起始点初始化
_clientViewController = [[SCTXClientViewController alloc]init];
_clientViewController.selectedBeginPoint = self.selectedBeginPoint;
_clientViewController.selectedBeginPOIID = self.selectedBeginPOIID;
_clientViewController.selectedEndPoint = self.selectedEndPoint;
_clientViewController.selectedEndPOIID = self.selectedEndPOIID;

//把司机端的id赋值给乘客端,使两端orderId一致
self.clientViewController.orderId = self.driverViewController.orderId;




//司机端订单初始化
[_sctxDriverManager setOrderInfoWith:self.orderId viaPoints:nil beginPosition:self.selectedBeginPoint.coordinate endPosition:self.selectedEndPoint.coordinate];


功能2:使用网约车路线规划模式

**
 * @brief 设置是否开启网约车模式,默认为YES
 * 接驾状态: 用户选择起点(导航终点)不能在高架上面
 * 送驾状态: 导航起点惩罚掉高架
 * @since 3.1.0
 */
@property(nonatomic, assign) BOOL onlineCarHailingPlanRouteEnable;


功能3:  POi算路 

1、背景

在出行的业务场景中,乘客设置的终点是否合理,比如乘客可能通过拖动地图选取的终点,这样会导致终点坐标会有很大误差,导致路线规划不合理,可能无法正常到达,建议使用Poiid算路接口,这样能确保导航规划的路线终点是一个可到达的点。

 

2、具体实现

//上车点信息,经纬度必须填,否则起点图标不显示
AMapNaviPOIInfo *beginInfo = [[AMapNaviPOIInfo alloc]init];
beginInfo.locPoint =  [AMapNaviPoint locationWithLatitude:self.selectedBeginPoint.coordinate.latitude
    longitude:self.selectedBeginPoint.coordinate.longitude];
beginInfo.mid = self.selectedBeginPOIID;

//目的地信息,经纬度必须填,否则终点图标不显示
AMapNaviPOIInfo *endInfo = [[AMapNaviPOIInfo alloc]init];
endInfo.locPoint =  [AMapNaviPoint locationWithLatitude:self.selectedEndPoint.coordinate.latitude longitude:self.selectedEndPoint.coordinate.longitude];
endInfo.mid = self.selectedEndPOIID;

//初始化订单信息
[_sctxDriverManager setOrderInfoWith:[self getOrderIdText] viaPOIInfos:nil beginPOIInfo:beginInfo endPOIInfo:endInfo];

 

3、效果对比

                               使用PoiId 

                             未使用PoiId 


功能4: 司机端实时展示备选路线

/**
 * @brief 设置多路线导航模式(GPS导航中拥有若干条备选路线供用户选择), 或单路线导航模式(默认模式). 注意: 1、设置的导航模式会在下一次主动路径规划时生效, 导航中设置无效, 建议在 AMapNaviDriveManager 单例初始化时就进行设置. 2、多路线导航模式还需同时满足以下4个条件才能够生效:a.路径规划时 AMapNaviDrivingStrategy 需选用多路径策略; b.起终点的直线距离需<=80KM; c.不能有途径点; d.车辆不能是货车类型.
 * @param multipleRouteNaviMode YES:多路线导航模式, NO:单路线导航模式(默认)
 * @return 是否设置成功,如开始导航后调用就会返回NO
 * @since 3.1.0
 */
- (BOOL)setMultipleRouteNaviMode:(BOOL)multipleRouteNaviMode;


功能5: 司机端调用导航组件

/**
 * @brief 调起导航组件。内部默认添加设置:setStartNaviDirectly:YES、
                     setNeedCalculateRouteWhenPresent:NO、
                           setNeedDestoryDriveManagerInstanceWhenDismiss:NO
 * @param compositeManager 导航组件manager
 * @param compositeUserConfig config
 * @since 3.1.0
 */
- (void)startNaviWithCompositeManager:(AMapNaviCompositeManager *)compositeManager 
                compositeUserConfig:(AMapNaviCompositeUserConfig *)compositeUserConfig;
AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
[_sctxDriverManager startNaviWithCompositeManager:_naviCompositeManager compositeUserConfig:config];


ios导航组件支持自定义区域 

1.设置左边的自定义区域

/**
 * @brief 设置驾车导航界面左侧自定义view,该view宽度为63,高度为53,将显示在界面左侧靠边垂直中心区域
 * @param customView 将被显示的自定义view
 */
- (void) addLeftCustomViewToNaviDriveView:(UIView *_Nonnull) customView; 

2.设置底部自定义区域

/**
 * @brief 设置驾车导航界面自定义View,该View将显示在界面的底部区域之下,容器View的宽度为屏幕宽度,
 * 高度最高为200,注意:设置自定义View,导航界面将自动设置为不支持横屏
 * @param customBottomView 将被显示在底部区域之下的自定义view
 * @return 是否设置成功(高度超过200将会返回NO)
 */
    @Override
- (BOOL) addCustomBottomViewToNaviDriveView:(UIView *_Nonnull)customBottomView

 3.设置中部自定义区域

/**
 * @brief 设置驾车导航界面自定义View,该View将显示在界面的底部区域,容器View的宽度为屏幕宽度减去133,
 * 高度为46
 * @param customView 将被显示在底部区域的自定义view
 */
- (void) addCustomViewToNaviDriveView:(UIView *_Nonnull) customView;

4. 效果示意图:


功能6: 司机端展示乘客位置 

第一步,打开乘客端位置上传

 初始化资源,更多设置参考MAPassengerRouteManager的接口说明: 

//创建乘客端
_sctxPassengerManager = [[MAPassengerRouteManager alloc] initWithMapView:self.mapView delegate:self];
//小车图标
_sctxPassengerManager.carImage = [UIImage imageNamed:@"taxi_car"];
//起点图标
_sctxPassengerManager.startImage = [UIImage imageNamed:@"startPoint"];
//终点图标
_sctxPassengerManager.endImage = [UIImage imageNamed:@"endPoint"];
//打开乘客位置上传,默认关闭
_sctxPassengerManager.uploadClientPositionEnable = YES;

第二步,司机端开启乘客位置显示

 初始化资源,更多设置参考MADriverRouteManager的接口说明: 

///创建司机端manager
_sctxDriverManager = [[MADriverRouteManager alloc] init];
//小车图标
_sctxDriverManager.carImage = [UIImage imageNamed:@"taxi_car"];
//起点图标
_sctxDriverManager.startImage = [UIImage imageNamed:@"startPoint"];
//终点图标
_sctxDriverManager.endImage = [UIImage imageNamed:@"endPoint"];
//乘客图标
_sctxDriverManager.passengerImage = [UIImage imageNamed:@"amap_sctx_userlocation32"];
//开启乘客位置显示,默认关闭
_sctxDriverManager.queryClientPositionEnable = YES;

效果展示:

 

功能7:设置新能源/出租车/普通车辆全场景规避限行 

//车牌信息 示例:京ABZ239
@property (nonatomic, strong) NSString *plateNumber;

/**
 * @brief 车辆动力类型
 * 1、MASCTXPowerTypeOil = 0 汽油车
 * 2、MASCTXPowerTypeBattery = 1 电动车
 * 3、MASCTXPowerTypeMix = 2 混合动力
 */
@property (nonatomic, assign) MASCTXPowerType powerType;

/**
 * @brief 设置车辆类型
 * 1、MASCTXVehicleTypeTaxi = 1 出租车
 * 2、MASCTXVehicleTypeElectric = 2 新能源
 * 3、MASCTXVehicleTypeComfort = 3 舒适型
 * 4、MASCTXVehicleTypeLuxury = 4 豪华型
 * 5、MASCTXVehicleTypeBusiness = 5 商务型
 * 6、MASCTXVehicleTypeOther = 6 其他
 */
 @property (nonatomic, assign) MASCTXVehicleType vehicleType;

司机端常量枚举值说明

 枚举值 

 含义 

 备注 

 建议 

 1001 

 司机端算路失败 

 司机端算路失败,一般是在订单切换时和调用司乘的重新算路接口才会出现 

 收到这个错误码之后,需要调用DriverRouteManager的重新算路接口 

 3005 

 切换乘客行前选择的路线成功 


 收集即可,无需做处理 

 3006 

 切换乘客行前选择的路线失败 


 收集即可,无需做处理 

 3007 

 行中,切换乘客选择路线成功 


 收集即可,无需做处理 

 3008 

 行中,切换乘客选择路线失败 


 收集即可,无需做处理 

 3009 

 司机偏航 


 收集即可,无需做处理 

 3010 

 当前路线有途经点,切换路线失败 


 收集即可,无需做处理 

 3012 

 行程目的地变更,司机端切换路线失败 


 收集即可,无需做处理 

 5001 

 当前模式无法切换到导航模式 

 使用司乘导航一体化时才有可能出现此错误吗,当前没有路线,不是接驾、送驾状态时无法切换到导航模式 

 如果需要切换到导航模式,需要设置正确的参数之后,再切换 


返回顶部 示例中心 常见问题 智能客服 公众号
二维码