在 这篇博客 中,介绍了 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
分拆为 BMKRouteSearch
和 BMKGeoCodeSearch
。
(2) BMKSearchDelegate
分拆为 BMKRouteSearchDelegate
和 BMKGeoCodeSearchDelegate
。
(3) 新增类 BMKTransitRoutePlanOption
、BMKWalkingRoutePlanOption
、BMKDrivingRoutePlanOption
,且 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
分拆为 BMKWalkingRouteResult
、BMKTransitRouteResult
、BMKDrivingRouteResult
,同时 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
中。