编程

当前位置:永利皇宫463登录 > 编程 > CoreLocation的简单介绍,CoreLocation框架的简单实用

CoreLocation的简单介绍,CoreLocation框架的简单实用

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-15 08:53
 if([UIDevice currentDevice].systemVersion.floatValue >= 9.0){ //临时开启后台定位 一定要设置plist文件 locationManager.allowsBackgroundLocationUpdates = true; }

往南边(下边)走,是南纬(S)

使用须知

图片 1

image.png

  • 使用定位功能由于牵涉到用户的隐私所以要在info.plist文件中设置
    Privacy - Location Usage Description 使用定位的描述

使用步骤1.导入framework2.创建manager

3.赤道:零度维度

区域监听

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

    // 区域监听
    //设置经纬度
    CLLocationCoordinate2D center = {21.13, 123.456};
    CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:1000 identifier:@"北京"];

    // 请求区域状态
    [self.lM requestStateForRegion:region];

}

#pragma mark - CLLocationManagerDelegate
// 进入区域
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"进入区域--%@", region.identifier);
}

// 离开区域
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    NSLog(@"离开区域--%@", region.identifier);
}


-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    NSLog(@"%zd", state);


}

(设置info.plist)//ios8以后设置需要的key 我这里也给贴出来 方便使用 请对应好在使用//key:

(1)导入框架

请求到的定位信息在代理方法里面

#pragma mark - CLLocationManagerDelegate
/**
 *  更新到位置之后调用
 *
 *  @param manager   位置管理者
 *  @param locations 位置数组
 */
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"定位到了");

    // 拿到位置,做一些业务逻辑操作
    /**
     *  CLLocation 详解
     *  coordinate : 经纬度
     *  altitude : 海拔
     *  course : 航向
     *  speed ; 速度
     */
    //拿到对象后你可以对里面的属性进行使用
   //CLLocation的这个方法 distanceFromLocation 是计算当前位置和之前位置的距离
    CLLocation *location = [locations lastObject];

    // 停止更新
//    [manager stopUpdatingLocation];



}

// 定位失败
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"定位失败");
}

#pragma mark - CLLocationManagerDelegate
/**
 *  获取到手机朝向时调用
 *
 *  @param manager    位置管理者
 *  @param newHeading 朝向对象
 */
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    /**
     *  CLHeading 
     *  magneticHeading : 磁北角度
     *  trueHeading : 真北角度
     */

    NSLog(@"%f", newHeading.magneticHeading);

    CGFloat angle = newHeading.magneticHeading;

    // 把角度转弧度
    CGFloat angleR = angle / 180.0 * M_PI;
    //利用角度的转换可以实现指南针效果

    // 旋转图片
    [UIView animateWithDuration:0.25 animations:^{
        self.compassView.transform = CGAffineTransformMakeRotation(-angleR);
    }];


}

点击按钮方法

往西边(左边)走,是西经(W)

简单的定位

#pragma mark - 懒加载
- (CLLocationManager *)lM
{
    if (!_lM) {
        // 1. 创建位置管理者
        _lM = [[CLLocationManager alloc] init];
        _lM.delegate = self;//设置代理

        // 每隔多米定位一次
//        _lM.distanceFilter = 100;
        /**
           kCLLocationAccuracyBestForNavigation // 最适合导航
           kCLLocationAccuracyBest; // 最好的
           kCLLocationAccuracyNearestTenMeters; // 10m
           kCLLocationAccuracyHundredMeters; // 100m
           kCLLocationAccuracyKilometer; // 1000m
           kCLLocationAccuracyThreeKilometers; // 3000m
         */
        // 精确度越高, 越耗电, 定位时间越长
        _lM.desiredAccuracy = kCLLocationAccuracyBest;

        //iOS 7.0之前可以按照上面这种方法去设置
        //iOS 8.0以后的就要多做一件事情就是请求授权
    if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
        {
            // [_lM requestWhenInUseAuthorization];  当使用的时候请求授权
            // 当前的授权状态为前台授权时,此方法也会有效
            [_lM requestAlwaysAuthorization];//一直请求授权

        }
 // 允许后台获取用户位置(iOS9.0)
         if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)
         {
             // 一定要勾选后台模式 location updates
             _lM.allowsBackgroundLocationUpdates = YES;
         }
    }
    return _lM;
}

###然后再使用定位的方法中调用就
[self.lM startUpdatingLocation];//就可以请求定位了

4.开启用户授权//当使用的时候就定位

经度范围:E 73°33′ ~ E 135°05′

请求授权的时候会调用下面方法

/**
 *  授权状态发生改变时调用
 *
 *  @param manager 位置管理者
 *  @param status  状态
 */
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
            // 用户还未决定
        case kCLAuthorizationStatusNotDetermined:
        {
            NSLog(@"用户还未决定");
            break;
        }
            // 问受限
        case kCLAuthorizationStatusRestricted:
        {
            NSLog(@"访问受限");
            break;
        }
            // 定位关闭时和对此APP授权为never时调用
        case kCLAuthorizationStatusDenied:
        {
            // 定位是否可用(是否支持定位或者定位是否开启)
            if([CLLocationManager locationServicesEnabled])
            {
                NSLog(@"定位开启,但被拒");
            }else
            {
                NSLog(@"定位关闭,不可用");
            }
//            NSLog(@"被拒");
            break;
        }
            // 获取前后台定位授权
        case kCLAuthorizationStatusAuthorizedAlways:
            //        case kCLAuthorizationStatusAuthorized: // 失效,不建议使用
        {
            NSLog(@"获取前后台定位授权");
            break;
        }
            // 获得前台定位授权
        case kCLAuthorizationStatusAuthorizedWhenInUse:
        {
            NSLog(@"获得前台定位授权");
            break;
        }
        default:
            break;
    }



}

//第二种:只要app不死,就一直定位,除了导航一般别用 天朝流量太贵

CoreLocation框架中所有数据类型的前缀都是CL

-compareDistance{ //北京位置 CLLocation *bjLocation = [[CLLocation alloc]initWithLatitude:39 longitude:115]; //上海位置 CLLocation *shLocation = [[CLLocation alloc]initWithLatitude:30 longitude:120]; //比较 返回值是 米 需要我们手动换算成公里CLLocationDistance distance = [bjLocation distanceFromLocation:shLocation]; //换算公里 NSLog(@"%f",distance * 0.001);}

(2)SoLoMo :Social Local Mobile(索罗门)

5.设置代理

(1)导航:去任意陌生的地方

[locationManager requestWhenInUseAuthorization];

(1)Map Kit :用于地图展示

本文不针对任何学术性研究,单纯为了娱乐.看不惯我就直说,反正我不改.

1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如

宝剑锋从磨砺出,梅花香自苦寒来.

(2)Core Location :用于地理定位

点击项目->capabilities->backgroundModes->点开 查找所需要的key 前面打上对勾

2.CoreLocation框架使用须知

需求:给一个地址,你告诉我经纬度,和街道详细信息storyBoard版本属性连线如下:

(2)周边:找餐馆、找酒店、找银行、找电影院

//反编码按钮- revGeocoder:sender { //1.创建编码对象 CLGeocoder *geocoder = [CLGeocoder new]; //2.反地理编码->向苹果请求数据 //2.1 创建位置 CLLocation *location = [[CLLocation alloc]initWithLatitude:[self.latitudeLabel.text doubleValue] longitude:[self.longitudeTxt.text doubleValue]]; [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { //防错 if{ return ; } //获取地标 CLPlacemark *placemark = placemarks[0]; self.descLabel.text = placemark.name; }];}

纬度范围:N 3°51′ ~ N 53°33′

对地理编码和反编码 主要是方法的差别,编码是geocodeAddressString反编码是reverseGeocodeLocation 多用几次就可以了.

说明:在Xcode5以后,不再需要我们手动导入

locationManager.desiredAccuracy = kCLLocationAccuracyBest;

南北纬各90°,总共180°

写完这个以后一定要立马配置plist文件,不然,世界的和平就容易崩塌设置plist文件找到key:Required background modes 里面有个数组 点开,右边添加描述:App registers for location updates

四、模拟位置

// [locationManager startUpdatingHeading];

3.两个热门专业术语

//经度txt@property (weak, nonatomic) IBOutlet UITextField *longitudeTxt;//纬度txt@property (weak, nonatomic) IBOutlet UITextField *latitudeLabel;//详细信息@property (weak, nonatomic) IBOutlet UILabel *descLabel;

提示:横跨经度纬度越大(1° ≈ 111km),表示的范围就越大,在地图上看到的东西就越小

 locationManager.distanceFilter = 200;

(1)中国的经纬度范围

[locationManager startUpdatingLocation];

往东边(右边)走,是东经(E)

CoreLocation是用来定位的,大家都用过导航或者查看自己的外卖到什么地方了,用的就是核心定位.有了核心定位才能实现地图的那些定位功能.下面的介绍,只是让大家简单的理解一下CoreLocation干嘛用,怎么用.

CoreLocation中使用CLLocationManager对象来做用户定位

同样用storyBoard实现连线属性:

2.本初子午线:穿过英国伦敦格林文治天文台

-locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{//打印定位信息 NSLog(@"%@",locations);//如果要停止[manager stopUpdatingLocation];//方法中的manager参数 就是我们定义的locationManager 也可以直接用全局的locationManager 结束定位//为啥locations是一个数组//万一你哪天一只脚在北京,一只脚在河北呢.这时候就得给你返回两个位置一个河北,一个北京.为了以防万一.//有兴趣的可以看一下CLLocation的头文件 }

(2)导入主头文件

通过一个地方名字匹配的时候,有可能会出现很多相同名字的地方(比如,你打北京大学会有两个校区出现),可以打印一下placemark.locality 来看一下 但是返回来 你给我一个坐标,那只能有一个地方

一、简介

//[locationManager requestAlwaysAuthorization];

三、经纬度等地理信息扫盲

- gecoder { //创建地理编码对象 CLGeocoder *gecoder = [CLGeocoder new]; //地理编码 if(self.addresTxt.text.length > 0){ [gecoder geocodeAddressString:self.addresTxt.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { if  { return; } //查看CLPlacemark //获取地标 for (CLPlacemark *placemark in placemarks) { //赋值 self.latitudeLabel.text = [NSString stringWithFormat:@"%f",placemark.location.coordinate.latitude]; self.longitudeLabel.text = [NSString stringWithFormat:@"%f",placemark.location.coordinate.longitude]; self.detailLabel.text = [NSString stringWithFormat:@"%@+%@",placemark.name,placemark.locality]; } }]; }else{ return; }}

4.我国的经纬度:

当我们用了如上的属性设置定位的时候,又想在后台的时候让手机进行定位,那我们就得用locationManager的另一个属性了allowsBackgroundLocationUpdates这个属性 只有在NSLocationWhenInUseUsageDescription的情况下才有意义的, NSLocationAlwaysUsageDescription这个属性 一直在定位,除非干掉App.因为是9.0以后的产物,所以我们要判断当前的适配状况//临时开启定位

1.CoreLocation框架使用前提

//地址text@property (weak, nonatomic) IBOutlet UITextField *addresTxt;//经度label@property (weak, nonatomic) IBOutlet UILabel *longitudeLabel;//纬度label@property (weak, nonatomic) IBOutlet UILabel *latitudeLabel;//详情label@property (weak, nonatomic) IBOutlet UILabel *detailLabel;

二、CoreLocation框架的使用

3.开启定位

往北边(上边)走,是北纬(N)

这个属性叫做位置筛选器 顾名思义就是查看你的位置的,工作原理是 看你的距离是否有200,有200就定位一下. 单位是米 苹果的定位距离基本都是米,而且操作类型都是double的别名.//新需求 定位精度 要很高很高locationManager的另一个属性//期望精度

说明:在对程序进行测试的时候,设置手机模拟器的模拟位置(经纬度)

CLLocationManager *locationManager = [CLLocationManager new];

2.在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发

点击按钮:

东西经各180°,总共360°

代理方法:(方法会一直走 必须手动停止)

#import <CoreLocation/CoreLocation.h>

错误1:如果用户权限一闪而过,将locationManager定义为全局变量,这里是作用域错误.

(2)部分城市的经纬度

locationManager.delegate = self;

(1)LBS :Location Based Service(基于定位的服务)

需求:根据用户距离 进行灵活定位定位原理和一次性定位一样 只不过用了locationManager的一个属性//距离属性 单位:米

1.示意图

//第二种//汽车导航的时候是会有箭头方向的 head:方向

给一下操作流程防止以后需要cmd 点 desiredAccuracy -> 看属性上面的倒数第三行 -> 找到 kCLLocationAccuracyBestForNavigation for navigation -> cmd 点kCLLocationAccuracyBestForNavigation 你需要的都在这里

//NSLocationAlwaysUsageDescription //NSLocationWhenInUseUsageDescription

本文由永利皇宫463登录发布于编程,转载请注明出处:CoreLocation的简单介绍,CoreLocation框架的简单实用

关键词:

上一篇:线程的境况,线程状态

下一篇:没有了