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. iOS----------设计模式的六大设计原则------>开放-关闭原则(OCP,Open-Close Principle)

    定义 一个软件实体(如类.模块.函数)应当对扩展开放,对修改关闭. 定义解读 在项目开发的时候,都不能指望需求是确定不变化的,大部分情况下,需求是变化的.那么如何应对需求变化的情况?这就是开放-关闭原 ...

  2. 【bzoj3007】拯救小云公主 二分+对偶图+并查集

    题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等 ...

  3. [暑假集训--数论]poj2773 Happy 2006

    Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD ...

  4. 四个简单易用的demo,关于iOS定时器和延时的,非常好用。

    1,延时执行(不可重复) 效果我直接截取控制台的日志了,就不做UI了. 2,用NSTimer执行定时和延时(可重复) [objc] view plain copy /** ** timer 可重复 * ...

  5. ckeditor自己用的配置文件config.js

    原文发布时间为:2011-01-17 -- 来源于本人的百度文章 [由搬家工具导入] CKEDITOR.editorConfig = function(config) {    // Define c ...

  6. 【转】C#获取客户端及服务器端主机信息及其获取IP地址

    原文发布时间为:2009-10-28 -- 来源于本人的百度文章 [由搬家工具导入] 小结: 1、REMOTE_ADDR 不可被修改,但是可能会获得代理服务器的IP,而不是实际客户端的IP。 2、通过 ...

  7. FCKEDITOR配置说明

    原文发布时间为:2009-10-12 -- 来源于本人的百度文章 [由搬家工具导入] fckeditor config.js配置2009-02-13 14:36 FCKConfig.CustomCon ...

  8. [LeetCode] Longest Substring Without Repeating Characters最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  9. sgu 275 To xor or not to xor 线性基 最大异或和

    题目链接 题意 给定\(n\)个数,取其中的一个子集,使得异或和最大,求该最大的异或和. 思路 先求得线性基. 则求原\(n\)个数的所有子集的最大异或和便可转化成求其线性基的子集的最大异或和. 因为 ...

  10. mariadb中执行数据库脚本的方法

    为了项目需求,写如下sql数据库脚本: SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for ...