在我们发微博,发表空间内容,以及在朋友圈发表动态的时候,会发现有一个位置信息的控件。iOS中是如何定位我们的位置信息的呢?基于此写一个小Demo,供大家参考使用。

在iOS中,用于定位时需要我们导入以下框架:

#import <CoreLocation/CoreLocation.h>

该框架中的CLLocationManager类可以实时的获取我们位置的经纬度。CLLocationManager相当于一个位置管家,常用的属性和方法有:

(1)每隔多少米定位一次

@property(assign, nonatomic) CLLocationDistance distanceFilter;

(2)定位的精确度

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

(3)定位信息

@property(readonly, nonatomic, copy) CLLocation *location;

(4)开始定位与关闭定位

- (void)startUpdatingLocation;
- (void)stopUpdatingLocation;

CLLocation类是用来表示某一位置的经纬度,常用属性有和方法:

(1)经纬度

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

(2)海波高度

@property(readonly, nonatomic) CLLocationDistance altitude;

(3)路线,航向 (范围在 0.0°~359.9°,0° 是正北 方向)

@property(readonly, nonatomic) CLLocationDirection course;

(4)行走速度

@property(readonly, nonatomic) CLLocationSpeed speed;

(5)计算两个位置之间的距离

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location;

其中CLLocationCoordinate2D 是一个枚举类型

typedef struct{
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;
typedef double CLLocationDistance;

<Demo如下:>

- (void)viewDidLoad {
[super viewDidLoad]; // 是否打开定位服务
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"开启定位服务");
} else {
NSLog(@"没有开启定位服务");
} // 创建manager
locationManager = [[CLLocationManager alloc] init];
// 设置代理
locationManager.delegate = self; if ([[UIDevice currentDevice].systemVersion floatValue] > 8.0) {
/*
kCLAuthorizationStatusNotDetermined = 0, // 用户还没决定 要不要授权
kCLAuthorizationStatusRestricted, // 应用程序受限制,没有授权
kCLAuthorizationStatusDenied, // 被用户拒绝授权
kCLAuthorizationStatusAuthorizedAlways, // 始终
kCLAuthorizationStatusAuthorizedWhenInUse // 使用应用程序期间
*/ // 如果程序定位设置不是 使用应用程序期间,则设置为 使用应用程序期间
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) {
[locationManager requestWhenInUseAuthorization];
}
} // 设置精确度,精度越高越耗电!
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
[locationManager startUpdatingLocation]; // 定位频率,每隔10米定位一次
CLLocationDistance distance = 10.0;
locationManager.distanceFilter = distance;
}

注意:用户授权APP访问定位服务

1.不允许访问 

2.使用应用程序期间 

3.后台(始终)

 iOS8 app想要获取定位,必须申请授权,在info.plist中添加:

     1、NSLocationAlwaysUsageDescription 始终

     2、NSLocationWhenInUseUsageDescription使用应用程序期间

< Delegate >:

#pragma mark - CLLocationManagerDelegate
/**
* 实时定位,当定位到用户的位置时,就会调用
*/ - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{ // locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置 for (CLLocation *newLocation in locations) { //拿到经纬度
CLLocationCoordinate2D coor2D = newLocation.coordinate;
NSLog(@"纬度为:%f, 经度为:%f", coor2D.latitude, coor2D.longitude); //海拔高度
CLLocationDistance altitude = newLocation.altitude;
NSLog(@"高度为:%f", altitude); //水平精确度, 垂直精确度
CLLocationAccuracy horizontalAcc = newLocation.horizontalAccuracy;
CLLocationAccuracy verticalAcc = newLocation.verticalAccuracy;
NSLog(@"%f, %f", horizontalAcc, verticalAcc); //北京站 经纬度
CLLocation *anyLocation = [[CLLocation alloc] initWithLatitude:39.909843 longitude:116.433015];
CLLocationDistance distance = [newLocation distanceFromLocation:anyLocation];
NSLog(@"当前位置到北京站的距离为:%f米", distance); //位置反编码(根据当前的经纬度获取具体的位置信息)
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { for (CLPlacemark *placeMark in placemarks) {
NSLog(@"位置:%@", placeMark.name);
NSLog(@"街道:%@", placeMark.thoroughfare);
NSLog(@"子街道:%@", placeMark.subThoroughfare);
NSLog(@"市:%@", placeMark.locality);
NSLog(@"区\\县:%@", placeMark.subLocality);
NSLog(@"行政区:%@", placeMark.administrativeArea);
NSLog(@"国家:%@", placeMark.country);
}
}]; //停止定位,定位是一个很耗能的功能,在不需要时应当停止定位
[manager stopUpdatingLocation];
}
}

注意:在调用CLLocationManagerDelegate的时候,很多人会出现程序运行时,并没有进入到Delegate方法里。   

(1)确定在程序第一次运行时弹出的提示框,你是否选择了允许,如果没有此时,你应当去查看你的模拟器设置->隐私->位置->当前程序->是否允许位置信息(建议选中『使用应用程序期间』)

(2)方法(1)确认过后,还是没解决,此时查看你的程序的Supporting Files->info.plist 文件,是否添加了:

       NSLocationWhenInUseUsageDescription

或者 NSLocationAlwaysUsageDescription

(3)若以上方法都试过了,还是没有进入到Delegate方法里,那么你该检查一下你的程序了

检查没问题?!好吧,下面来看看小编犯的错误:

#pragma mark - startUpdatingHeading 和 startUpdatingLocation 及其类似啊,别写错了

//    [locationManager startUpdatingHeading];
[locationManager startUpdatingLocation];

如果此时你发现错得和小编一样的话,请下次一定要提防着Xcode的了,因为你稍不留神 敲出 startupdat, 然后潇洒的按下TAB键或者回车的时候,错误就已经产生了,若不一个字母一个字母的检查,你还真找不出问题所在!

- (void)startUpdatingLocation; // 是开始定位

这两个方法的作用截然不同

- (void)startUpdatingHeading; // 是更新方向

开发路上与君共勉,编程一定要严谨

关于CoreLocation定位服务的简单使用的更多相关文章

  1. iOS开发拓展篇—CoreLocation定位服务

    iOS开发拓展篇—CoreLocation定位服务 一.简单说明 1.CLLocationManager CLLocationManager的常用操作和属性 开始用户定位- (void)startUp ...

  2. ios8 - CoreLocation定位服务的变化

    在iOS8开发中,发现一个CoreLocation的使用问题,执行操作之后,不会调用到定位之后的delegate方法中. 根据文档,需要在使用CoreLocation前调用方法: [locationm ...

  3. 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  4. 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  5. 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  7. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  8. 【iOS】7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  9. iOS定位服务CoreLocation

    欢迎訪问我的新博客: 开发人员说 基于LBS的应用开发是当今移动开发中的一大热门, 当中主要涉及到地图和定位两个方面. iOS开发中, 定位服务依赖于CoreLocation框架, CLLocatio ...

随机推荐

  1. nginx 两台机器 出现退款失败问题

    今天早上来公司后,测试人员告诉我 退款失败了.上周五还好好的,怎么这周三就出问题了,赶快让测试发来订单号,查询数据库,查询日志,发现还是以前的问题: search hit TOP, continuin ...

  2. c# js日期工具

    c#获取日期当年最后一天:model.StartDate.AddYears(1).AddSeconds(-1) js日期工具: var dateToolObj = { methods: { //url ...

  3. Linux->ZooKeeper集群搭建

    人,总免不了有心结,限制着自己,难以前行.对于ZooKeeper的理解,以及实践也拖了很久,今天用零散时间学习一下,补点干货. 一.简述 Zookeeper是Google的Chubby一个开源的实现, ...

  4. Web API 2 入门——创建ASP.NET Web API的帮助页面(谷歌翻译)

    在这篇文章中 创建API帮助页面 将帮助页面添加到现有项目 添加API文档 在敞篷下 下一步 作者:Mike Wasson 创建Web API时,创建帮助页面通常很有用,以便其他开发人员知道如何调用A ...

  5. 浅析tnsping

    首先,先弄清楚tnsping是什么: Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,测试数据库服务的命令,用来决定是否一个Oracle Net 网络服务(service) ...

  6. xtrabackup在线迁移mysql并搭建为主主同步

    一.背景 工作中有需求数据库需要迁移,但是不能停服,不能锁库锁表影响业务的正常运行,所以使用XtraBackup 二.环境: 操作系统:CentOS Linux release 7.4.1708 (C ...

  7. java virtualVM远程配置方法

    在/etc/hosts中设置主机名和ip的对应关系   ip为用java virtualVM链接服务器的ip 如:      10.175.0.191 host-ai #rmiregistry不知道干 ...

  8. 深入理解PHP传参原理(PHP5.2)

    首先说下今天想到的一个问题.在编写php扩展的时候,似乎参数(即传给zend_parse_parameters的变量)是不需要free的.举例: PHP_FUNCTION(test) { char* ...

  9. isset() 与 array_key_exists() 比较

    1.对于数组值的判断不同,对于值为null或''或false,isset返回false,array_key_exists返回true: 2. 执行效率不同,isset是内建运算符,array_key_ ...

  10. 4springboot:日志(下)

    1.指定配置  位置: 给类路径下放上每个日志框架自己的配置文件即可: SpringBoot就不使用他默认配置的了 使用什么日志则配置什么文件以及注意文件名 自定义: <?xml version ...