定位

1. 导入框架 <CoreLocation.framework>, 引入头文件 import <CoreLocation/CoreLocation.h>;

2. 创建管理者对象 (strong)

#import "ViewController.h"

@interface ViewController ()<CLLocationManagerDelegate>

 /**  定位管理者 ***/

@property (nonatomic, strong) CLLocationManager *mgr;

@end

@implementation ViewController 

 /**  懒加载 ***/

- (CLLocationManager *)mgr{

    if (!_mgr) {

        _mgr = [[CLLocationManager alloc] init];

    }

    return _mgr;

}

 - (void)viewDidLoad {

    [super viewDidLoad];

    // 1. 创建CoreLocation管理者

    

    // 2. 成为CoreLocaltion管理者的代理, 监听获取的位置

    self.mgr.delegate = self;

    

    // 3. 设置属性

    // 设置多久 获取一次位置

//    self.mgr.distanceFilter = 500;

    

    /**

       kCLLocationAccuracyBestForNavigation -- 最佳导航

       kCLLocationAccuracyBest;             -- 最精准

       kCLLocationAccuracyNearestTenMeters; -- 十米

       kCLLocationAccuracyHundredMeters;    -- 百米

       kCLLocationAccuracyKilometer;        -- 千米

       kCLLocationAccuracyThreeKilometers;  -- 三千米

     */

    // 设置定位精确度

    self.mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

    

    /**

     *  ios7 , 只要开始定位, 系统就会自动要求用户对你的应用程序授权. 但是从ios8开始, 想要定位自己必须主动要求用户授权,而且必须再info.plist文件中配置一项属性, 才能弹出授权窗口.

         NSLocationWhenInUseDescription,允许在前台获取GPS的描述

         NSLocationAlwaysUsageDescription,允许在后台获取GPS的描述

     */

    

    

    // 4. 请求授权定位

    if(IOS8){

        LogRed(@"ios 8");

        

        // 主动要求用户授权, 授权成功以后会调用对应的代理方法.

        [self.mgr requestAlwaysAuthorization]; // 请求前台和后台定位权限

//        [self.mgr requestWhenInUseAuthorization]; // 请求前台定位权限

        

        

    }else{

        LogMagenta(@"ios 7");

        

        // 3. 开始监听

        [self.mgr startUpdatingLocation];

    }

}

/**

 *  当授权状态改变时, 调用此方法

 *

 *  @param manager 触发事件的对象

 *  @param status  授权状态

 */

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

{

//

//    kCLAuthorizationStatusNotDetermined   ---- 等待授权

//    kCLAuthorizationStatusRestricted,     ---- 受限 -- 未授权

//    kCLAuthorizationStatusDenied          ---- 拒绝授权

//    kCLAuthorizationStatusAuthorizedAlways --- 前台 后台都授权

//    kCLAuthorizationStatusAuthorizedWhenInUse - 前台授权

    

    if (status == kCLAuthorizationStatusNotDetermined) {

        LogWhite(@"等待用户授权");

    }else if (status == kCLAuthorizationStatusAuthorizedAlways ||

              status == kCLAuthorizationStatusAuthorizedWhenInUse)

    {

        LogRed(@"授权成功");

        // 开始定位

        [self.mgr startUpdatingLocation];

        

    }else

    {

        LogGreen(@"授权失败");

    }

}

#pragma mark - CLLocationManagerDelegate

/**

 *  获取到位置信息后就会调用

 *

 *  @param manager   触发事件的对象

 *  @param locations 获取到的位置

 */

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{

    

/**

     *  // CLLocation

     location.coordinate; 坐标, 包含经纬度

     location.altitude; 设备海拔高度 单位是米

     location.course; 设置前进方向 0表示北 90东 180南 270西

     location.horizontalAccuracy; 水平精准度

     location.verticalAccuracy; 垂直精准度

     location.timestamp; 定位信息返回的时间

     location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行

     */

    

    LogRed(@"%@",locations);

    // 1. 获取最后一次定位的位置信息

    CLLocation *location = [locations lastObject];

    

    LogYellow(@"%f --- %f ---%f",location.coordinate.latitude,location.coordinate.longitude,location.speed);

    

//    [self.mgr stopUpdatingLocation];

}

原文地址:https://www.cnblogs.com/guangleijia/p/4825755.html