| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- //
- // PositionTool.m
- // IBOSS
- //
- // Created by ssl on 2017/12/28.
- // Copyright © 2017年 elongtian. All rights reserved.
- //
- #import "PositionTool.h"
- @implementation PositionTool
- static PositionTool *_positionTool;
- +(PositionTool *)shareInfo {
- @synchronized(self) {
- if (_positionTool == nil) {
- _positionTool=[[PositionTool alloc] init];
- _positionTool.positionName=@"没有定位";
- }
- }
- return _positionTool;
- }
- /*
- 释放单例实现
- */
- -(void)freeInfo {
- if (_positionTool) {
- _positionTool = nil;
- }
- }
- -(id)init {
- self=[super init];
- if (self) {
- _locationArr=[[NSMutableArray alloc] init];
- }
- return self;
- }
- /**
- 代理回调添加和删除实现方法
- @param delegate 代理
- */
- -(void)addDelegate:(id<PositionToolDelegate>)delegate {
- [_locationArr addObject:delegate];
- }
- -(void)removeDelegate:(id)delegate {
- [_locationArr removeObject:delegate];
- }
- /**
-
- 获取位置信息
- */
- -(CLLocationCoordinate2D)getCenter {
- return [_locationManager location].coordinate;
- }
- -(void)updateLocation {
- [_locationManager startUpdatingLocation];
- }
- #pragma mark ========= 获取位置 ==========
- -(void)getLocation {
- if ([CLLocationManager locationServicesEnabled]) {
- _locationManager=[[CLLocationManager alloc] init];
- [_locationManager requestAlwaysAuthorization];
-
- //定位授权状态(始终定位、当使用时定位)
- CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
- if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
- {
- NSLog(@"授权通过");
- }
- else
- {
- NSLog(@"授权不通过");
- }
- _locationManager.delegate=self;
- //精度最高,耗电最大
- _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
- _locationManager.distanceFilter = 10;
- [_locationManager startUpdatingLocation];
-
-
- if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
-
- _locationManager.allowsBackgroundLocationUpdates =NO;
-
- }
- }
- }
-
- #pragma mark - 调用地图代理方法
- -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
- NSLog(@"%@",error);
- }
- -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
- switch (status) {
- case kCLAuthorizationStatusNotDetermined:
- if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
- [_locationManager requestAlwaysAuthorization];
- }
- break;
-
- default:
- break;
- }
- }
- //获取经纬度
- -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
- CLLocation *newLocation= [locations firstObject];;
- //CLLocationCoordinate2D oldCoordinate=newLocation.coordinate;
- //NSLog(@"旧的经度:%f,旧的纬度:%f",oldCoordinate.longitude,oldCoordinate.latitude);
- //NSLog(@"新的经度:%f,新的纬度:%f",newLocation.coordinate.longitude,newLocation.coordinate.latitude);
- _latitude=newLocation.coordinate.latitude;
- _longtitude=newLocation.coordinate.longitude;
- [manager stopUpdatingLocation];
-
- CLGeocoder *geocoder=[[CLGeocoder alloc] init];
- [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
- for (CLPlacemark *place in placemarks) {
- if(place.name == nil || [place.name isEqualToString:@""]){
- self.street = @"";
- }else{
- self.street = place.name;
- }
- if(place.locality == nil || [place.locality isEqualToString:@""]){
- self.city = @"";
- }else{
- self.city = place.locality;
- }
- if(place.subLocality == nil || [place.subLocality isEqualToString:@""]){
- self.area = @"";
- }else{
- self.area = place.subLocality;
- }
- if(place.administrativeArea == nil || [place.administrativeArea isEqualToString:@""]){
- self.province = @"";
- }else{
- self.province = place.administrativeArea;
- }
- }
-
- for (id<PositionToolDelegate>delegate in _locationArr) {
- if (delegate && [delegate respondsToSelector:@selector(noticePositionChanged)]) {
- [delegate noticePositionChanged];
- }
- }
- }];
-
- for (id<PositionToolDelegate> delegate in _locationArr) {
- if (delegate && [delegate respondsToSelector:@selector(noticePositionChanged)]) {
- [delegate noticePositionChanged];
- }
- }
- }
- @end
|