司乘同显-司机端-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 | 当前模式无法切换到导航模式 | 使用司乘导航一体化时才有可能出现此错误吗,当前没有路线,不是接驾、送驾状态时无法切换到导航模式 | 如果需要切换到导航模式,需要设置正确的参数之后,再切换 |