百度地图 iOS SDK 2.5.0版的变化

这篇博客 中,介绍了 iOS8 中定位的变化,百度地图等第三方地图 SDK 在 Xcode6 下均出现水土不服。在广大人民群众的热切期待和漫长等待后,百度地图终于释出了新版 iOS SDK,版本号 2.5.0。在官方的 Change Log 中,看到主要增加了对 arm64、iPhone6、iPhone 6P Plus、iOS8 的支持。解决了一些bug。

在工程中替换为新版 SDK 并 Build 后,满眼都是 Error。研究下去,发现变动相当多(之前使用的 SDK 版本号为 2.2.1),完全不管向下兼容性。

地图搜索

(1) BMKSearch 分拆为 BMKRouteSearchBMKGeoCodeSearch

(2) BMKSearchDelegate 分拆为 BMKRouteSearchDelegateBMKGeoCodeSearchDelegate

(3) 新增类 BMKTransitRoutePlanOptionBMKWalkingRoutePlanOptionBMKDrivingRoutePlanOption,且 BMKRouteSearch(原 BMKSearch) 的方法 drivingSearch、transitSearch、walkingSearch 所需的参数变更为一个与之对应的 BMK…RoutePlanOption 类型的对象。

原方法:

1
2
3
4
- (BOOL)transitSearch:(NSString*)city startNode:(BMKPlanNode*)start endNode:(BMKPlanNode*)end;
- (BOOL)drivingSearch:(NSString*)startCity startNode:(BMKPlanNode*)start endCity:(NSString*)endCity endNode:(BMKPlanNode*)end;
- (BOOL)drivingSearch:(NSString*)startCity startNode:(BMKPlanNode*)start endCity:(NSString*)endCity endNode:(BMKPlanNode*)end throughWayPoints:(NSArray*)wayPointsArray;
- (BOOL)walkingSearch:(NSString*)startCity startNode:(BMKPlanNode*)start endCity:(NSString*)endCity endNode:(BMKPlanNode*)end;

新方法:

1
2
3
- (BOOL)transitSearch:(BMKTransitRoutePlanOption*)transitRoutePlanOption;
- (BOOL)drivingSearch:(BMKDrivingRoutePlanOption*)drivingRoutePlanOption;
- (BOOL)walkingSearch:(BMKWalkingRoutePlanOption*)walkingRoutePlanOption;

同时须注意,相比其他两种路径搜索,公交搜索必须指定城市名称,否则会直接不予检索,transitSearch 方法返回 NO。

1
transitRouteSearchOption.city = @"济南市";

(4) BMKPlanResult 分拆为 BMKWalkingRouteResultBMKTransitRouteResultBMKDrivingRouteResult,同时 BMKRouteSearchDelegate(原 BMKSearchDelegate) 的代理方法变更,由:

1
2
3
- (void)onGetWalkingRouteResult:(BMKSearch *)searcher result:(BMKPlanResult *)result errorCode:(int)error;
- (void)onGetTransitRouteResult:(BMKSearch *)searcher result:(BMKPlanResult *)result errorCode:(int)error;
- (void)onGetDrivingRouteResult:(BMKSearch *)searcher result:(BMKPlanResult *)result errorCode:(int)error;

变更为:

1
2
3
- (void)onGetWalkingRouteResult:(BMKRouteSearch*)searcher result:(BMKWalkingRouteResult*)result errorCode:(BMKSearchErrorCode)error;
- (void)onGetTransitRouteResult:(BMKRouteSearch*)searcher result:(BMKTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error;
- (void)onGetDrivingRouteResult:(BMKRouteSearch*)searcher result:(BMKDrivingRouteResult*)result errorCode:(BMKSearchErrorCode)error;

地图定位

(1) 新增类 BMKLocationService 及代理 BMKLocationServiceDelegate。BMKMapView 不再管理定位功能,其属性 location,和代理方法:

1
- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation;

都不再存在,定位功能全部剥离到 BMKLocationService。

(2) 如果地图需要定位,需要单独创建一个 BMKLocationService 对象,并实现代理 BMKLocationServiceDelegate,在代理方法中执行 mapView 新增的 updateLocationData 方法,大致如下:

1
2
3
4
- (void)didUpdateUserLocation:(BMKUserLocation *)userLocation
{
[_bMapView updateLocationData:userLocation];
}

(3) 含有定位的地图界面,pop 回上一层 ViewController ,再 push 到这个界面,会崩溃的问题。
如果你遇到这个问题,请用真机运行,如果依然崩溃,确保以下两条:

  • viewWillDisappear 中写了 [_locService stopUserLocationService];
  • [_locService startUserLocationService];viewWillAppear 中,而不是在 viewDidLoad 中。