关于CoreLocation定位服务的简单使用
在我们发微博,发表空间内容,以及在朋友圈发表动态的时候,会发现有一个位置信息的控件。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定位服务的简单使用的更多相关文章
- iOS开发拓展篇—CoreLocation定位服务
iOS开发拓展篇—CoreLocation定位服务 一.简单说明 1.CLLocationManager CLLocationManager的常用操作和属性 开始用户定位- (void)startUp ...
- ios8 - CoreLocation定位服务的变化
在iOS8开发中,发现一个CoreLocation的使用问题,执行操作之后,不会调用到定位之后的delegate方法中. 根据文档,需要在使用CoreLocation前调用方法: [locationm ...
- 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- iOS定位服务CoreLocation
欢迎訪问我的新博客: 开发人员说 基于LBS的应用开发是当今移动开发中的一大热门, 当中主要涉及到地图和定位两个方面. iOS开发中, 定位服务依赖于CoreLocation框架, CLLocatio ...
随机推荐
- 【Udacity】朴素贝叶斯
机器学习就像酿制葡萄酒--好的葡萄(数据)+好的酿酒方法(机器学习算法) 监督分类 supervised classification Features -->Labels 保留10%的数据作为 ...
- 动态注册broadcast的安全考虑
一.android service通知activity更新方式有1. service 通过广播的形式发送broadcast,向这个activity的内部类发广播的消息来更新界面2. service直接 ...
- PHP 如何实现网址伪静态
Apache的 mod_rewrite是比较强大的,在进行网站建设时,可以通过这个模块来实现伪静态. 主要步骤如下: 1.检测Apache是否开启mod_rewrite功能 可以通过php提供 ...
- GitHub教程(二) 删除已有仓库
通过GitHub教程(一)的阅读,我相信您对GitHub体系框架已经有了模模糊糊的了解.本节教程将继续介绍GitHub的操作---删除仓库. 作为GitHub的入门使用者,我们可能会建一些简单的仓库来 ...
- Hadoop学习---CentOS中hadoop伪分布式集群安装
注意:此次搭建是在ssh无密码配置.jdk环境已经配置好的情况下进行的 可以参考: Hadoop完全分布式安装教程 CentOS环境下搭建hadoop伪分布式集群 1.更改主机名 执行命令:vi / ...
- 批量检查多个网址是否正常(shell编程)
#!/bin/bash #version 1.1 #by zengj #using checking urls . /etc/init.d/functions checkurl() { wget -o ...
- memcached php-memcache 扩展
1.安装 libevent wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz tar ...
- 设计模式:解释器(Interpreter)模式
设计模式:解释器(Interpreter)模式 一.前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词 ...
- ZT 绿茶和枸杞绝不可以同饮
绿茶和枸杞绝不可以同饮 正文 我来说两句(人参与) 速腾试驾招募 预约得iPad Air! 2012年06月28日10:38 来源:中国网 打印 字号 大|中|小 绿茶含有儿茶素与β-胡萝卜素.维生素 ...
- Spring Framework5.0 学习(3)—— spring配置文件的三种形式
Spring Framework 是 IOC (Inversion of Control 控制反转)原则的实践. IoC is also known as dependency injection ...