iOS系统不允许使用第三方定位,定位功能是对iOS系统定位的二次封装。通过封装,可将原始的定位点无偏差的显示在高德地图上。

注意:

1)2.3.0(含)之前版本的SDK,在iOS8中无法定位,请参考:iOS8无法定位的解决方案。

2)2.4.0(含)以后版本需在info.plist中追加NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription字段.其中:

  • NSLocationWhenInUseUsageDescription表示应用在前台的时候可以搜到更新的位置信息。
  • NSLocationAlwaysUsageDescription表示应用在前台和后台(suspend或terminated)都可以获取到更新的位置数据。

目前,有两种获取位置当前位置信息的方法:

方法一:使用iOS定位SDK

方法二:使用地图SDK中的定位功能,提供定位图层的显示,并且支持自定义定位图标和精度圈的样式。

只要开启定位开关(MAMapView的showsUserLocation属性)就可以开始定位。代码如下所示:



- (         void         )viewDidLoad         


         {        


                  [super viewDidLoad];        


                  _mapView.showsUserLocation = YES;             //YES 为打开定位,NO为关闭定位        


         }



当位置更新时,会进定位回调,通过回调函数,能获取到定位点的经纬度坐标,示例代码如下:



-(         void         )mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation        


         updatingLocation:(         BOOL         )updatingLocation        


         {        


                  if         (updatingLocation)        


                  {        


                  //取出当前位置的坐标        


                  NSLog(@         "latitude : %f,longitude: %f"         ,userLocation.coordinate.latitude,userLocation.coordinate.longitude);        


                  }        


         }



自定义定位图层:

定位图层有3种显示模式,分别为:

  • MAUserTrackingModeNone:不跟随用户位置,仅在地图上显示。
  • MAUserTrackingModeFollow:跟随用户位置移动,并将定位点设置成地图中心点。
  • MAUserTrackingModeFollowWithHeading:跟随用户的位置和角度移动。

通过以下代码可改变定位图层的显示模式:



[_mapView setUserTrackingMode: MAUserTrackingModeFollow animated:YES];          //地图跟着位置移动



自定义定位图层

定位图层由定位点处的标注(MAUserLocation)和精度圈(MACircle)组成。

对于3D矢量地图

  • 通过- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id <MAAnnotation>)annotation方法中自定义定位标注样式;
  • 通过- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id <MAOverlay>)overlay方法自定义定位精度圈的样式。

注意:若想自定义定位经度圈样式,需先将 MAMapView 的customizeUserLocationAccuracyCircleRepresentation 属性设置为 YES。


代码如下:

_mapView.customizeUserLocationAccuracyCircleRepresentation = YES;

 
 
 - (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id <MAOverlay>)overlay 

 
 
 { 

 
 
  
 /* 自定义定位精度对应的MACircleView. */ 

 
 
  
 if 
  (overlay == mapView.userLocationAccuracyCircle) 

 
 
  
 { 

 
 
  
 MACircleView *accuracyCircleView = [[MACircleView alloc] initWithCircle:overlay]; 

 
 
   

 
 
  
 accuracyCircleView.lineWidth    = 2.f; 

 
 
  
 accuracyCircleView.strokeColor  = [UIColor lightGrayColor]; 

 
 
  
 accuracyCircleView.fillColor    = [UIColor colorWithRed:1 green:0 blue:0 alpha:.3]; 

 
 
   

 
 
  
 return 
  accuracyCircleView; 

 
 
  
 } 

 
 
  
 return 
  nil; 

 
 
 } 

 

    

 
 
 - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id <MAAnnotation>)annotation 

 
 
 { 

 
 
  
 /* 自定义userLocation对应的annotationView. */ 

 
 
  
 if 
  ([annotation isKindOfClass:[MAUserLocation  
 class 
 ]]) 

 
 
  
 { 

 
 
  
 static 
  NSString *userLocationStyleReuseIndetifier = @ 
 "userLocationStyleReuseIndetifier" 
 ; 

 
 
  
 MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:userLocationStyleReuseIndetifier]; 

 
 
  
 if 
  (annotationView == nil) 

 
 
  
 { 

 
 
  
 annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation 

 
 
  
 reuseIdentifier:userLocationStyleReuseIndetifier]; 

 
 
  
 } 

 
 
  
 annotationView.image = [UIImage imageNamed:@ 
 "userPosition" 
 ];// 
 这里的名字填写你要显示的图标 

 
 
   

 
 
  
 return 
  annotationView; 

 
 
  
 } 

 
 
  
 return 
  nil; 

 
 
 }




后台定位:

高德地图iOS SDK V2.5.0版本提供后台持续定位的能力,即便你的app退到后台,且位置不变动时,也不会被系统挂起,可持久记录位置信息。该功能适用于记轨迹录或者出行类App司机端。

只需要您的做以下几步操作:

1.添加代码。


_mapView.pausesLocationUpdatesAutomatically = NO;        


                  


         _mapView.allowsBackgroundLocationUpdates = YES;         //iOS9以上系统必须配置



2.工程配置。

a)左侧目录中选中工程名,开启 TARGETS->Capabilities->Background Modes

b)在 Background Modes中勾选 Location updates,如下图所示:


ios 高德地图获取当前定位城市 ios 地图 高德_高德地图

注意:后台定位必须将info.plist的字段改成NSLocationAlwaysUsageDescription字段。