PositionTool.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. //
  2. // PositionTool.m
  3. // IBOSS
  4. //
  5. // Created by ssl on 2017/12/28.
  6. // Copyright © 2017年 elongtian. All rights reserved.
  7. //
  8. #import "PositionTool.h"
  9. @implementation PositionTool
  10. static PositionTool *_positionTool;
  11. +(PositionTool *)shareInfo {
  12. @synchronized(self) {
  13. if (_positionTool == nil) {
  14. _positionTool=[[PositionTool alloc] init];
  15. _positionTool.positionName=@"没有定位";
  16. }
  17. }
  18. return _positionTool;
  19. }
  20. /*
  21. 释放单例实现
  22. */
  23. -(void)freeInfo {
  24. if (_positionTool) {
  25. _positionTool = nil;
  26. }
  27. }
  28. -(id)init {
  29. self=[super init];
  30. if (self) {
  31. _locationArr=[[NSMutableArray alloc] init];
  32. }
  33. return self;
  34. }
  35. /**
  36. 代理回调添加和删除实现方法
  37. @param delegate 代理
  38. */
  39. -(void)addDelegate:(id<PositionToolDelegate>)delegate {
  40. [_locationArr addObject:delegate];
  41. }
  42. -(void)removeDelegate:(id)delegate {
  43. [_locationArr removeObject:delegate];
  44. }
  45. /**
  46. 获取位置信息
  47. */
  48. -(CLLocationCoordinate2D)getCenter {
  49. return [_locationManager location].coordinate;
  50. }
  51. -(void)updateLocation {
  52. [_locationManager startUpdatingLocation];
  53. }
  54. #pragma mark ========= 获取位置 ==========
  55. -(void)getLocation {
  56. if ([CLLocationManager locationServicesEnabled]) {
  57. _locationManager=[[CLLocationManager alloc] init];
  58. [_locationManager requestAlwaysAuthorization];
  59. //定位授权状态(始终定位、当使用时定位)
  60. CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
  61. if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
  62. {
  63. NSLog(@"授权通过");
  64. }
  65. else
  66. {
  67. NSLog(@"授权不通过");
  68. }
  69. _locationManager.delegate=self;
  70. //精度最高,耗电最大
  71. _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
  72. _locationManager.distanceFilter = 10;
  73. [_locationManager startUpdatingLocation];
  74. if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
  75. _locationManager.allowsBackgroundLocationUpdates =NO;
  76. }
  77. }
  78. }
  79. #pragma mark - 调用地图代理方法
  80. -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
  81. NSLog(@"%@",error);
  82. }
  83. -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  84. switch (status) {
  85. case kCLAuthorizationStatusNotDetermined:
  86. if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
  87. [_locationManager requestAlwaysAuthorization];
  88. }
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. //获取经纬度
  95. -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
  96. CLLocation *newLocation= [locations firstObject];;
  97. //CLLocationCoordinate2D oldCoordinate=newLocation.coordinate;
  98. //NSLog(@"旧的经度:%f,旧的纬度:%f",oldCoordinate.longitude,oldCoordinate.latitude);
  99. //NSLog(@"新的经度:%f,新的纬度:%f",newLocation.coordinate.longitude,newLocation.coordinate.latitude);
  100. _latitude=newLocation.coordinate.latitude;
  101. _longtitude=newLocation.coordinate.longitude;
  102. [manager stopUpdatingLocation];
  103. CLGeocoder *geocoder=[[CLGeocoder alloc] init];
  104. [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
  105. for (CLPlacemark *place in placemarks) {
  106. if(place.name == nil || [place.name isEqualToString:@""]){
  107. self.street = @"";
  108. }else{
  109. self.street = place.name;
  110. }
  111. if(place.locality == nil || [place.locality isEqualToString:@""]){
  112. self.city = @"";
  113. }else{
  114. self.city = place.locality;
  115. }
  116. if(place.subLocality == nil || [place.subLocality isEqualToString:@""]){
  117. self.area = @"";
  118. }else{
  119. self.area = place.subLocality;
  120. }
  121. if(place.administrativeArea == nil || [place.administrativeArea isEqualToString:@""]){
  122. self.province = @"";
  123. }else{
  124. self.province = place.administrativeArea;
  125. }
  126. }
  127. for (id<PositionToolDelegate>delegate in _locationArr) {
  128. if (delegate && [delegate respondsToSelector:@selector(noticePositionChanged)]) {
  129. [delegate noticePositionChanged];
  130. }
  131. }
  132. }];
  133. for (id<PositionToolDelegate> delegate in _locationArr) {
  134. if (delegate && [delegate respondsToSelector:@selector(noticePositionChanged)]) {
  135. [delegate noticePositionChanged];
  136. }
  137. }
  138. }
  139. @end