CoreLocation 的基本使用 以及定位 指南针的实现 (附加: 系统版本适配的方法,和后台更新用户位置的方法及注意)

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()<CLLocationManagerDelegate>

@property(nonatomic ,strong)CLLocationManager * manager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //设置定位管理者
    CLLocationManager * manager = [[CLLocationManager  alloc]init];

    self.manager = manager;

    //设置代理
    manager.delegate = self;

    /*
      kCLLocationAccuracyBestForNavigation (适合导航)
      kCLLocationAccuracyBest; (最好的)
      kCLLocationAccuracyNearestTenMeters; 附近10m
      kCLLocationAccuracyHundredMeters;  100m
      kCLLocationAccuracyKilometer;  1000m
      kCLLocationAccuracyThreeKilometers;  3000m
     */

    //设置定位精度  越进准, 越耗电,定位时间越长
    self.manager.desiredAccuracy = kCLLocationAccuracyBest;

    //每个多少米定位一次

//    self.manager.distanceFilter = 100;

    //获取当前设备的系统等级
    //第一种进行系统版本适配的方法
     if( [[UIDevice currentDevice].systemVersion floatValue] >= 8.0){

        //iOS8.0 之后 需要请求用户授权, 并在info 里配置对应的key

        //前后台定位授权
        [manager requestAlwaysAuthorization];

        //前台定位授权
//            [manager requestWhenInUseAuthorization];

    }

    //在iOS9.0 提供的下面的方法, 前提是一定要后台模式下勾选允许更新位置,否则报错

    //第二种进行系统版本适配的方法
    if ([self.manager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {

        self.manager.allowsBackgroundLocationUpdates = YES;

    }

    [self test];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //manager默认只在前台允许更新位置,如果需要后台更新位置, 需要在后台模式中勾选 location updates
    [self.manager startUpdatingLocation];

    /*
     kCLLocationAccuracyBestForNavigation (适合导航)
     kCLLocationAccuracyBest; (最好的)
     kCLLocationAccuracyNearestTenMeters; 附近10m
     kCLLocationAccuracyHundredMeters;  100m
     kCLLocationAccuracyKilometer;  1000m
     kCLLocationAccuracyThreeKilometers;  3000m
     */
    //该方法的它会根据精确度由低到高去定位, 如果定位超时,就会直接通过代理返回当前精度的位置
//    [self.manager requestLocation];
    //这个方法需要代理实现locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

    //并且这个方法不能与startUpdatingLocation 和 allowDeferredLocationUpdates 同时使用

}

//当定位成功后,更新位置就会调用
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{

    CLLocation * loc = [locations firstObject];

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

}

//当授权状态发生改变是调用
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{

}

//定位失败时执行
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{

}

//计算两个地点的距离 两个点的直线距离.(不是真实距离)
-(void)test {

    //创建两个地点
    CLLocation * loc1 = [[CLLocation alloc]initWithLatitude:10 longitude:119];

    CLLocation * loc2 = [[CLLocation alloc]initWithLatitude:10 longitude:120];

    //计算两个地点的距离
       CLLocationDistance dis = [loc1 distanceFromLocation:loc2];
    NSLog(@"%f" , dis);

}

//指南针的实现
-(void)test2 {

     CLLocationManager * manager = [[CLLocationManager alloc]init];

    manager.delegate = self;

    //开始更新指向
    [manager startUpdatingHeading];

}

//当指向发生改变时调用  (注意 更新指向,不用获取用户授权, 因为只是更新手机的方向,不涉及用户隐私)
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{

    //磁北方向
    CLLocationDirection magneticHeading = newHeading.magneticHeading;

     //将角度装换为弧度
    CGFloat angel = magneticHeading/180 * M_PI ;

    //然后根据弧度 更改指南针图片的transform 注意是取弧度的负值,因为得到的磁北角度是相对磁北的角度,然后需要指南针旋转到磁北,所以是负值

}
时间: 2024-10-20 06:25:12

CoreLocation 的基本使用 以及定位 指南针的实现 (附加: 系统版本适配的方法,和后台更新用户位置的方法及注意)的相关文章

iOS 9适配系列教程:后台定位

http://www.cocoachina.com/ios/20150624/12200.html Demo:GitHub地址 [iOS9在定位的问题上,有一个坏消息一个好消息]坏消息:如果不适配iOS9,就不能偷偷在后台定位(不带蓝条,见图)!好消息:将允许出现这种场景:同一App中的多个location manager:一些只能在前台定位,另一些可在后台定位,并可随时开启或者关闭特定location manager的后台定位. 如果没有请求后台定位的权限,也是可以在后台定位的,不过会带蓝条:

[iOS 利用MapKit和CoreLocation框架打造精简的定位和导航]

运行效果:            一.利用<CoreLocation/CoreLocation.h>定位 创建变量 CLLocationManager *locationManager ,并加入<CLLocationManagerDelegate>协议 以下是Viewdidload里需要初始化的参数: self.locationManager = [[CLLocationManager alloc]init]; [self.locationManager setDelegate:s

IOS_地图与定位

知识点介绍 一. 定位 实现一次定位 CLLocation对象介绍 实现持续定位 请求用户授权 二. 地理编码 正地理编码 反地理编码 三. 地图的基本使用 显示用户位置 设置地图显示类型 根据用户位置显示对应的大头针信息 设置以用户所在位置为中心点 监听地图显示区域改变 iOS9新特性-显示交通状况 / 显示比例 / 显示指南针 四. 大头针的使用 添加大头针 自定义大头针1, 更改颜色, 设置掉落效果 自定义大头针2-更改大头针的图像 自定义大头针的代码封装 一. CoreLocation实

iOS开发 定位服务与地图

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

iOS8定位与地图

iOS开发系列--地图与定位 转载:http://www.cnblogs.com/kenshincui/ 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看

ios之定位与地图

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒 店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开 发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要 实现地图.导航功能,往往需要先熟悉定位功能

iOS开发--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒 店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开 发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要 实现地图.导航功能,往往需要先熟悉定位功能

iOS开发系列--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

转-iOS开发系列--地图与定位

来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用