iOS开发之CoreLocation(一)

简介

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

导航:去任意陌生的地方

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

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

Map Kit :用于地图展示

Core Location :用于地理定位

2个热门专业术语

LBS :Location Based Service

SoLoMo :Social Local Mobile(索罗门)

CoreLocation框架的使用

CoreLocation框架使用前提

导入框架

导入主头文件

#import <CoreLocation/CoreLocation.h>

CoreLocation框架使用须知

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

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

CLLocationManager

CLLocationManager的常用操作

开始用户定位

1 - (void)startUpdatingLocation;

停止用户定位

1 - (void) stopUpdatingLocation;

每隔多少米定位一次

1 @property(assign, nonatomic) CLLocationDistance distanceFilter;

定位精确度(越精确就越耗电)

1 @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法

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

locations参数里面装着CLLocation对象

CLLocation

CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等

经纬度

1 @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

海拔

1 @property(readonly, nonatomic) CLLocationDistance altitude;

路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向)

1 @property(readonly, nonatomic) CLLocationDirection course;

行走速度(单位是m/s)

1 @property(readonly, nonatomic) CLLocationSpeed speed;

用 1 - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 方法可以计算2个位置之间的距离

CLLocationCoordinate2D

CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下

1 typedef struct {
2
3         CLLocationDegrees latitude; // 纬度
4
5         CLLocationDegrees longitude; // 经度
6
7 } CLLocationCoordinate2D;

一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D

经纬度

本初子午线

穿过英国伦敦格林文治天文台

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

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

东西经各180°,总共360°

赤道

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

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

南北纬各90°,总共180°

横跨经度\纬度越大(1° ≈ 111km)

表示的范围就越大

在地图上看到的东西就越小

中国经纬度

天朝的经纬度范围

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

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

中国部分城市的经纬度


城市


经度


纬度


北京


E116°28‘


N39°54‘


广州


E113°15‘


N23°08‘


成都


E104°05‘


N30°39‘


上海


E121°29‘


N31°14‘


深圳


E113°46‘


N22°27‘


武汉


E114°21‘


N30°37‘


郑州


E113°42‘


N34°48‘

模拟位置

如果是模拟器,需要设置模拟位置(经纬度)

天朝帝都的经纬度是:北纬40°,东经119°

用户隐私的保护

从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权

要想获得用户的位置

想访问用户的通讯录、日历、相机、相册等等

当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权

开发者可以在info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)

一旦用户选择了“Don’t Allow”,意味着你的应用以后就无法使用定位功能

为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用

CLLocationManager有个类方法可以判断当前应用的定位功能是否可用

1 + (BOOL)locationServicesEnabled;

CLGeocoder

使用CLGeocoder可以完成“地理编码”和“反地理编码”

地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)

反地理编码:根据给定的经纬度,获得具体的位置信息

地理编码方法

1 - (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

反地理编码方法

1 - (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

CLGeocodeCompletionHandler

当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler

typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error);

这个block传递2个参数

error :当编码出错时(比如编码不出具体的信息)有值

placemarks :里面装着CLPlacemark对象

CLPlacemark

CLPlacemark的字面意思是地标,封装详细的地址位置信息

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

地理位置

1 @property (nonatomic, readonly) CLRegion *region;

区域

1 @property (nonatomic, readonly) NSDictionary *addressDictionary;

详细的地址信息

1 @property (nonatomic, readonly) NSString *name;

地址名称

1 @property (nonatomic, readonly) NSString *locality;

城市

实战

懒加载方法

1 -(CLLocationManager *)lmgr
2 {
3     if (_lmgr==nil) {
4         _lmgr = [[CLLocationManager alloc] init];
5         _lmgr.delegate = self;
6         [_lmgr requestWhenInUseAuthorization];
7     }
8     return _lmgr;
9 }

监听位置

1 - (void)viewDidLoad {
2     [super viewDidLoad];
3     // Do any additional setup after loading the view, typically from a nib.
4     [self.lmgr startUpdatingLocation];
5 }

在代理方法中打印位置信息

1 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
2 {
3     NSLog(@"%@",locations);
4 }

1 "<+39.11754092,+117.12951620> +/- 65.00m (speed -1.00 mps / course -1.00) @ 15/2/25 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f410:19:19"

有经纬度,海拔,速度,航向,时间

注意:iOS8中CoreLocation的使用

在Info.plist中加入两个缺省没有的字段

  • NSLocationAlwaysUsageDescription
  • NSLocationWhenInUseUsageDescription

这两个就是提示框中要显示什么提示语

需要在使用CoreLocation前调用方法

requestWhenInUseAuthorization()

requestAlwaysAuthorization()

顾名思义,一个是使用时偷看用户隐私,一个是一直偷看用户隐私

时间: 2024-10-07 06:29:29

iOS开发之CoreLocation(一)的相关文章

ioS开发之CoreLocation(GPS定位)

1.概述 在iOS开发中,要想加入地图和定位功能这2大功能,必须基于2个框架进行开发 (1)Map Kit :用于地图展示 (2)Core Location :用于地理定位 2个热门专业术语: LBS :Location Based Service SoLoMo :Social Local Mobile(索罗门) 2.CoreLocation框架的使用 CoreLocation框架使用前提: 导入框架: 导入主头文件: #import <CoreLocation/CoreLocation.h>

iOS开发之CoreLocation(二)

CLGeocoder地理编码 使用方法 1 CLGeocoder *clg = [[CLGeocoder alloc] init]; 2 [clg geocodeAddressString:@"北京" completionHandler:^(NSArray *placemarks, NSError *error) { 3 4 }]; placemarks返回一个placemark 1 Printing description of [0]->[0]: 2 Beijing<G

iOS定位开发之CoreLocation

有时候我们并不需要查看地图,而仅仅需要自己的当前位置就可以,这时候就没有必要去使用MapKit可,直接使用定位服务就好了 苹果提供了CoreLocation框架来做定位功能 首先要想项目中导入CoreLocation框架 定位服务开启之前最好查看一下定位服务是否可用,有可能用户已经拒绝或者用户手机定位模块有问题,无法定位 定位服务是由CLLocationManager来管理的 定位成功等信息也是通过代理发送给对象的,另外定位中经常需要用到地理位置的解码和反解码(其实就是经纬度和地名之间的转换)

李洪强IOS开发之-iOS经典面试题

李洪强IOS开发之-iOS经典面试题 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人.所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充.我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {           

iOS开发之UILabel

UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: ? 1 2 3 4 5 6 7 8 9 10 /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 40); /*初始化*/ UILabel *titleLabel = [[UILabel alloc] initWithFrame:labelRect]; /*一些属性的设置*/ titleLabel.font = [UIFont systemFontOf