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="">

后台模式下的 blue bar
2.requestAlwaysAuthorization
  • 1.请求前后台定位服务授权,当授权状态为未决定时请求用户授权。前提是在 Info.plist 文件里包括key NSLocationAlwaysUsageDescription

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" class="imagebubble-image" alt="">

Info.plist中 设置相应的Key

请求定位的弹框
3.注意
  • 1.iOS8之后,假设想要定位。必须调用 requestWhenInUseAuthorizationrequestAlwaysAuthorization方法。
  • 2.假设两个请求授权的方法都运行了,会出现下面情况
    • 1.when-in-use写在前面,第一次打开程序时请求授权,假设勾选了后台模式,进入后台会出现蓝条提示正在定位。当程序退出,第二次打开程序时
      Always 会再次请求授权。之后进入后台就不会出现蓝条了(前后台都能定位)。
    • 2.Always写在前面, when-in-use写在后面。仅仅会在第一次打开程序时请求授权,由于
      Always
      得到的授权大于when-in-use的到的授权
4.推断是否开启了定位服务
  • 在启动更新位置之前要先推断是否开启了定位服务

    if ([CLLocationManager locationServicesEnabled]) { // 推断是否打开了位置服务
    [self.lcManager startUpdatingLocation]; // 開始更新位置
    }
5.适配版本的方法
  • when-in-useAlways 都是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);
      }

3.iOS9.0之后使用CLLocationManager

  • 1.iOS9.0之后有一种新的请求定位的方法 requestLocation
  • 2.作用:依照定位准确度从低到高进行排序,逐个进行定位。

    假设获取到的位置不是准确度最高的那个,也会在定位超时后。通过代理告诉外界。

  • 3.注意:
    • 1.必须实现 ocationManager:didUpdateLocations:locationManager:didFailWithError 方法,可是仅仅调用一次
    • 2.不能与startUpdatingLocation同一时候使用
      if ([CLLocationManager locationServicesEnabled]) { // 推断是否打开了位置服务
      [self.lcManager requestLocation];
      }
  • 4.实现 requestWhenInUseAuthorizationrequestAlwaysAuthorization 方法,并设置相应的 key

    if ([[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的使用 定位功能使用的更多相关文章

  1. 【第三方SDK】百度地图实现最简单的定位功能(无地图界面)

    在近期的项目中,须要实现无地图界面的定位功能,定位用户所在的城市.因此,本篇文章,主要介绍怎样使用百度地图SDK实现无导航界面的定位功能. 1.申请百度开发人员账户 2.创建应用,获取key 例如以下 ...

  2. Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...

  3. iOS 设备定位功能可用的判断

    if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] ...

  4. (十八)WebGIS中清空功能和地图定位功能的设计以及实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最 ...

  5. ionic 添加地图定位功能

    由于项目需求,需要一个定位功能,通过google或百度,搜到一个cordova-plugin-geolocation的插件,在ios上可以用,但是在android就呵呵了,原因就不说了,大家都知道.所 ...

  6. android 百度地图定位功能实现

    历经几天时间,终于把定位功能给实现了,可谓是费劲千辛万苦啊,有定位知识还有图层知识,在这里我把代码给大家贴出来,一起分享一下下啦. package com.example.foreveross.off ...

  7. 【MUI】百度地图定位功能

    博主最近进行一款APP开发,需要用到定位功能,经过一番折腾,终于搞定,不废话,代码如下 mui.plusReady(function() { var longitude, latitude; //va ...

  8. AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能

    在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...

  9. Android定位&地图&导航——基于百度地图实现的定位功能

    一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册 ...

随机推荐

  1. 【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

    题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstrin ...

  2. js作用域的理解

    script:自上而下 全局变量.全局函数 函数:由里到外 浏览器: “JS解析器” 1)“找一些东西”: var function 参数 a = undefine 所有的变量,在正式运行代码之前,都 ...

  3. 报错:3 字节的 UTF-8 序列的字节 3 无效。

    错误如下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...

  4. POJ1692 Crossed Matchings

    Time Limit: 1000MS     Memory Limit: 10000K Total Submissions: 2738   Accepted: 1777 Description The ...

  5. 网络上面好用的webserice方法【公开】

    原文发布时间为:2009-07-27 -- 来源于本人的百度文章 [由搬家工具导入] 本帖转自 http://www.webxml.com.cn/zh_cn/web_services.aspx?off ...

  6. GDB 命令详细解释

    Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工具一样,gdb提供了以 ...

  7. wxformbuilder

    1.打开wxFormBuilder,按开始一个空项目.您也可以执行File|New来创建新项目2.从Object Properties(对象属性)面板配置项目的设置A.选择产生什么类型的代码. 现在你 ...

  8. unittest框架及自动化测试

    之前在公司做过自动化测试的知识分享,现在把它记录下来.   •一.如何更好的编写测试用例 •1.模块化:将一些基础的.共有的步骤代码独立为单独的模块,使用时再调用.好处:可以使代码复用,减少代码编写, ...

  9. Guice 4.1教程

    Guice是Google开发的一个开源轻量级的依赖注入框架,运行速度快,使用简单. 项目地址:https://github.com/google/guice/ 最新的版本是4.1,本文基于此版本. 0 ...

  10. LINUX CP命令直接覆盖不提示按Y/N的方法

    refer to: https://blog.csdn.net/qq_36741436/article/details/78732201 cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,当文件比 ...