地图之CLLocationManager的使用 定位功能使用
1.iOS8曾经使用CLLocationManager
- 1.导入头文件
<CoreLocation/CoreLocation.h> - 2.创建位置管理者
CLLocationManager, 并加入到属性。 - 3.设置代理、遵守协议、实现代理方法,在代理方法中获取位置信息
- 4.调用開始更新位置方法
5.设置
每隔多远定位一次和准确度。准确度越高越耗电,定位时间越长// 1.设置位置管理者属性
@property (nonatomic, strong) CLLocationManager *lcManager;
// 2.推断是否打开了位置服务
if ([CLLocationManager locationServicesEnabled]) {
// 创建位置管理者对象
self.lcManager = [[CLLocationManager alloc] init];
self.lcManager.delegate = self; // 设置代理
// 设置定位距离过滤參数 (当本次定位和上次定位之间的距离大于或等于这个值时,调用代理方法)
self.lcManager.distanceFilter = 100;
self.lcManager.desiredAccuracy = kCLLocationAccuracyBest; // 设置定位精度(精度越高越耗电)
[self.lcManager startUpdatingLocation]; // 開始更新位置
}
/** 获取到新的位置信息时调用*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"定位到了");
}
/** 不能获取位置信息时调用*/
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"获取定位失败");
}- 6.请求授权,iOS6之后,苹果開始加强保护用户隐私,在
Info.plist文件里定义Key提醒用户,提高用户同意定位的概率。imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" class="imagebubble-image" alt="">
Info.plist 设置Key - 7.假设要后台定位。须要打开后台模式
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" class="imagebubble-image" alt="">
勾选后台模式
2.iOS8.0之后使用CLLocationManager
- 1.iOS8之后,苹果又进一步加强了隐私保护。不会主动填出对话框。让用户选择
- 2.须要实现两个方法(实现其一就可以),而且
Info.plist中设置相应的key,才会弹框
1.requestWhenInUseAuthorization
- 1.当程序当前的授权状态为未决定时,在前台时请求定位服务许可时使用。须要先在 Info.plist 文件里设置一个Key:
NSLocationWhenInUseUsageDescription, 假设不设置key。系统会忽略定位请求。
Info.plist 设置相应的Key 2.当用户授权
when-in-use时,程序在前台时能够启动大部分定位服务。假设想要后台定位,须要开启后台定位模式。但在状态栏会出现蓝条提示用户程序正在进行定位。[_lcManager requestWhenInUseAuthorization];imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" class="imagebubble-image" alt="">
请求定位的弹框
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" class="imagebubble-image" alt="">
2.requestAlwaysAuthorization
- 1.请求前后台定位服务授权,当授权状态为未决定时请求用户授权。前提是在
Info.plist文件里包括keyNSLocationAlwaysUsageDescription
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" class="imagebubble-image" alt="">
3.注意
- 1.iOS8之后,假设想要定位。必须调用
requestWhenInUseAuthorization或requestAlwaysAuthorization方法。 - 2.假设两个请求授权的方法都运行了,会出现下面情况
- 1.
when-in-use写在前面,第一次打开程序时请求授权,假设勾选了后台模式,进入后台会出现蓝条提示正在定位。当程序退出,第二次打开程序时
Always会再次请求授权。之后进入后台就不会出现蓝条了(前后台都能定位)。 - 2.
Always写在前面,when-in-use写在后面。仅仅会在第一次打开程序时请求授权,由于得到的授权大于
Alwayswhen-in-use的到的授权
- 1.
4.推断是否开启了定位服务
- 在启动更新位置之前要先推断是否开启了定位服务
if ([CLLocationManager locationServicesEnabled]) { // 推断是否打开了位置服务
[self.lcManager startUpdatingLocation]; // 開始更新位置
}
5.适配版本的方法
when-in-use和Always都是iOS8之后出现的方法。假设不进行版本号适配,执行在iOS7上就会crash,此时须要做版本号号推断- 1.推断版本号号
if ([[UIDevice currentDevice].systemVersion floatValue] >=8.0 ) {
[_lcManager requestAlwaysAuthorization];
} - 2.适配版本号的还有一种方法
if ([_lcManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[_lcManager requestWhenInUseAuthorization];
}
6.监听定位服务状态的改变
- 实现代理方法。推断定位服务的状态
/** 定位服务状态改变时调用*/
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户还未决定授权");
break;
}
case kCLAuthorizationStatusRestricted:
{
NSLog(@"訪问受限");
break;
}
case kCLAuthorizationStatusDenied:
{
// 类方法,推断是否开启定位服务
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务开启,被拒绝");
} else {
NSLog(@"定位服务关闭,不可用");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"获得前后台授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"获得前台授权");
break;
}
default:
break;
}
}
7.代理方法返回的 locations 信息
- 当位置管理器。获取到位置后,调用
locationManager:didUpdateLocations:方法,返回的类型为的位置信息数组,下面为数组包括的属性
CLLocation- 1.coordinate : 当前位置的坐标
- latitude : 纬度
- longitude : 经度
- 2.altitude : 海拔。高度
- 3.horizontalAccuracy : 纬度和经度的精度
- 4.verticalAccuracy : 垂直精度(获取不到海拔时为负数)
- 5.course : 行进方向(真北)
- 6.speed : 以米/秒为单位的速度
- 7.description : 位置描写叙述信息
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations firstObject];
NSLog(@"%@", location);
}
- 1.coordinate : 当前位置的坐标
3.iOS9.0之后使用CLLocationManager
- 1.iOS9.0之后有一种新的请求定位的方法
requestLocation - 2.作用:依照定位准确度从低到高进行排序,逐个进行定位。
假设获取到的位置不是准确度最高的那个,也会在定位超时后。通过代理告诉外界。
- 3.注意:
- 1.必须实现
ocationManager:didUpdateLocations:和locationManager:didFailWithError方法,可是仅仅调用一次 - 2.不能与
startUpdatingLocation同一时候使用if ([CLLocationManager locationServicesEnabled]) { // 推断是否打开了位置服务
[self.lcManager requestLocation];
}
- 1.必须实现
4.实现
requestWhenInUseAuthorization或requestAlwaysAuthorization方法,并设置相应的 keyif ([[UIDevice currentDevice].systemVersion floatValue] >=8.0 ) {
// iOS0.0:假设当前的授权状态是使用是授权,那么App退到后台后。将不能获取用户位置,即使勾选后台模式:location
[_lcManager requestWhenInUseAuthorization];
}5.必须勾选后台模式,并设置
allowsBackgroundLocationUpdates属性为YES(默认是NO)- 1.当定位完毕时。设置为NO,而且不再定位跟踪
2.使用
-responsdToSelector:推断// iOS9.0+ 要想继续获取位置。须要使用下面属性进行设置(注意勾选后台模式:location)但会出现蓝条
if ([_lcManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
_lcManager.allowsBackgroundLocationUpdates = YES;
}
if ([CLLocationManager
locationServicesEnabled]) {
switch ([CLLocationManager
authorizationStatus]) {
case
kCLAuthorizationStatusNotDetermined:
case
kCLAuthorizationStatusRestricted:{
[[NWLocationManager
sharedInstance].locationManager
requestWhenInUseAuthorization];//IOS8以后必需要调用此方法才干够定位
}
break;
case
kCLAuthorizationStatusDenied:{
[[SCLocationManager
sharedInstance] showSettingAlertView];
}
break;
case
kCLAuthorizationStatusAuthorizedAlways:
case
kCLAuthorizationStatusAuthorizedWhenInUse:{
}
default:
break;
}
[[NWLocationManager
sharedInstance].locationManager
startUpdatingLocation];//開始定位
}else{
NWLog(@"Alert:
定位服务不可用");
}
地图之CLLocationManager的使用 定位功能使用的更多相关文章
- 【第三方SDK】百度地图实现最简单的定位功能(无地图界面)
在近期的项目中,须要实现无地图界面的定位功能,定位用户所在的城市.因此,本篇文章,主要介绍怎样使用百度地图SDK实现无导航界面的定位功能. 1.申请百度开发人员账户 2.创建应用,获取key 例如以下 ...
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...
- iOS 设备定位功能可用的判断
if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] ...
- (十八)WebGIS中清空功能和地图定位功能的设计以及实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最 ...
- ionic 添加地图定位功能
由于项目需求,需要一个定位功能,通过google或百度,搜到一个cordova-plugin-geolocation的插件,在ios上可以用,但是在android就呵呵了,原因就不说了,大家都知道.所 ...
- android 百度地图定位功能实现
历经几天时间,终于把定位功能给实现了,可谓是费劲千辛万苦啊,有定位知识还有图层知识,在这里我把代码给大家贴出来,一起分享一下下啦. package com.example.foreveross.off ...
- 【MUI】百度地图定位功能
博主最近进行一款APP开发,需要用到定位功能,经过一番折腾,终于搞定,不废话,代码如下 mui.plusReady(function() { var longitude, latitude; //va ...
- AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能
在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...
- Android定位&地图&导航——基于百度地图实现的定位功能
一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册 ...
随机推荐
- 【bzoj1316】树上的询问 树的点分治+STL-set
题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...
- 【bzoj3555】[Ctsc2014]企鹅QQ 字符串hash
题目描述 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体 ...
- 【Luogu】P2824排序(二分答案+线段树排序)
题目链接 震惊!两个线段树和一个线段树竟是50分的差距! 本题可以使用二分答案,二分那个位置上最后是什么数.怎么验证呢? 把原序列改变,大于等于mid的全部变成1,小于mid的全部变成0,之后线段树排 ...
- noip2018 pre——Dp
Dp专题 1011: KC的瓷器 (porcelain) 题目描述 KC来到了一个盛产瓷器的国度.他来到了一位商人的店铺.在这个店铺中,KC看到了一个有n(1<=n<=100)排的柜子,每 ...
- Mysql 数据库备份工具 xtrabackup
1.安装测试数据库mysql5.7 详细步骤 yum install -y gcc gcc-c++ cmake bison ncurses-devel .tar.gz cd mysql-/ cmake ...
- 【02】react 之 jsx
React与ReactDOM是react中核心对象,React为核心功能,ReactDOM提供对DOM的操作,以前的老版本中只有React没有ReactDOM,新版本中分离出ReactDOM提供两种渲 ...
- 洛谷P1279 字串距离
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...
- 怎样让enum枚举支持string
原文发布时间为:2011-03-02 -- 来源于本人的百度文章 [由搬家工具导入] 大家都知道enum是以下两种情况,不能支持string 1,enum类型是静态 2,enum类型仅限于long、i ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---53
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- AI创投的冰与火之歌:泡沫、跟风、短板和有钱花不出去的沮丧【转】
转自:http://36kr.com/p/5071386.html 国内的AI行业仍处于野蛮生长阶段.热钱不少,优质项目却不多.创业者拿钱难,投资者有钱却花不出去. 编者按:本文来自微信公众号“刺猬公 ...