zoukankan      html  css  js  c++  java
  • 获取定位信息

    先导入

    然后在 info.plist 文件中添加 Privacy - Location Always and When In Use Usage Description 和 Privacy - Location When In Use Usage Description 两个就可以了。

    LocationManager.h

    #import <Foundation/Foundation.h>
    
    typedef void(^LocationBlock)(NSString *lat, NSString *lon);
    
    @interface LocationManager : NSObject
    
    + (instancetype)shareManager;
    
    - (void)getGps:(LocationBlock)block;
    
    @property (nonatomic, copy) NSString *lat;
    @property (nonatomic, copy) NSString *lon;
    
    @end

    LocationManager.m

    #import "LocationManager.h"
    #import <CoreLocation/CoreLocation.h>
    
    @interface LocationManager ()<CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locManager;
    
    @property (nonatomic, copy) LocationBlock block;
    
    @end
    
    @implementation LocationManager
    
    + (instancetype)shareManager {
        
        static LocationManager *_manager;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            _manager = [[LocationManager alloc] init];
        });
        return _manager;
    }
    
    - (instancetype)init {
        
        if (self = [super init]) {
            
            _locManager = [[CLLocationManager alloc] init];
            // 精确度
            [_locManager setDesiredAccuracy:kCLLocationAccuracyBest];
            // 精确到米
            _locManager.distanceFilter = 100;
            _locManager.delegate = self;
            
            if (![CLLocationManager locationServicesEnabled]) { // 判断当前服务是否开启
                
                NSLog(@"开启定位服务");
            } else {
                // 当前状态
                CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
                if (status == kCLAuthorizationStatusNotDetermined) { // 未选中状态时候
                    
                    [_locManager requestWhenInUseAuthorization];
                }
            }
        }
        return self;
    }
    
    

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {

    
    

        CLLocation *newLocation = locations[0];

    
    

        // 获取当前所在的城市名

        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    
    

        // 根据经纬度反向地理编译出地址信息

        [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error){

    
    

            if (array.count > 0){

    
    

                CLPlacemark *placemark = [array objectAtIndex:0];

                // 获取城市

                NSString *city = placemark.locality;

    
    

                if (!city) {

    
    

                    // 四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)

                    city = placemark.administrativeArea;

                }

    
    

                NSLog(@"city = %@", city); // 广州市

                NSLog(@"--%@",placemark.name);// 黄埔大道西447-5号

                NSLog(@"++++%@",placemark.subLocality); // 天河区

                NSLog(@"country == %@",placemark.country);// 中国

                NSLog(@"administrativeArea == %@",placemark.administrativeArea); // 广东省

            }

            else if (error == nil && [array count] == 0)

            {

                NSLog(@"No results were returned.");

            }

            else if (error != nil)

            {

                NSLog(@"An error occurred = %@", error);

            }

        }];

    
    

        CLLocationCoordinate2D coor = newLocation.coordinate;

        NSString *lat = [NSString stringWithFormat:@"%@", @(coor.latitude)];

        NSString *lon = [NSString stringWithFormat:@"%@", @(coor.longitude)];

    
    

        [LocationManager shareManager].lat = lat;

        [LocationManager shareManager].lon = lon;

        self.block(lat, lon);

    
    

        // 系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新

        [self.locManager stopUpdatingLocation];

    }

    - (void)getGps:(LocationBlock)block {
        
        self.block = block;
        // 开始定位
        [self.locManager startUpdatingLocation];
    }
    
    @end

    调用方法:

    [[LocationManager shareManager] getGps:^(NSString *lat, NSString *lon) {
            
            NSLog(@"%@, %@", lat, lon);
        }];
  • 相关阅读:
    php微信支付v3版签名生成,代金券、微信支付分、支付即服务等
    docker基本命令及搭建php环境
    Nginx 负载均衡搭建
    laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案
    抓取腾讯视频弹幕
    laravel4.2 Redis 使用
    201771010106-东文财 实验一 软件工程准备-<构建之法与博客首秀>
    东文财201771010106《面向对象程序设计(java)》.18
    东文财201771010106《面向对象程序设计(java)》17
    201771010106东文财《面向对象程序设计(java)》实验16
  • 原文地址:https://www.cnblogs.com/xuzb/p/8883820.html
Copyright © 2011-2022 走看看