前段时间,公司开发的App用到了地图和定位,所以记录一下,作为回顾总结。
    对于地图和定位,苹果公司提供给了两个框架:
  • MapKit:用于地图展示
  • Core
    Location :用于地理定位

CoreLocation的使用:

1、导入头文件
     #import<CoreLocation/CoreLocation.h>
  • CoreLocation框架使用须知
  • CoreLocation框架中所有数据类型的前缀都是CL
  • CoreLocation中使用CLLocationManager对象来做用户定位
     
2、CLLocationManager
      CoreLocation 提供了 CLLocationManager类,来管理定位的相关操作:如开始定位、停止定位,申请授权(这是iOS8.0之后提供的方法)等;
    
     使用步骤:     
     1、实例化一个CLLocationManager对象;并用一个strong指向该对象(这样才会一致存在,供我们使用);
     2、开始用户定位
     - (void)startUpdatingLocation;
     (- (void)stopUpdatingLocation;停止定位)
  3、设置代理
  4、请求授权
     授权方式有两个:
         看单词字面意思就知道一个是后台一直运行,一个直程序运行时;
          requestWhenInUseAuthorization
          requestAlwaysAuthorization
     5、实现相关代理方法      

    特别注意:在使用授权时,需要配置info.plist
           >设置方法 requestWhenInUseAuthorization
 配置plist文件NSLocationWhenInUseUsageDescription
      >设置方法requestAlwaysAuthorization 
   配置plist文件NSLocationAlwaysUsageDescription 
     

代码如下:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self location];
}
-(void)location{ self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self; if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
[self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"%@",locations);
//[self.locationManager stopUpdatingLocation];
}

小结:
  • 当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法
  • - (void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locations;
  • locations参数里面装着CLLocation对象
   
   当然,可以跟久需要设置CLLocationManager的其它属性已满足需求
  • @property(assign,nonatomic)CLLocationDistancedistanceFilter;
  • 每隔多少米定位一次

  • @property(assign,nonatomic)CLLocationAccuracydesiredAccuracy;
  • 定位精确度(越精确就越耗电)
 
   
3、CLLocation
   CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等
  • @property(readonly,nonatomic)CLLocationCoordinate2D coordinate;
  • 经纬度
  • @property(readonly,nonatomic)CLLocationDistance altitude;
  • 海拔
  • @property(readonly,nonatomic)CLLocationDirection course;
  • 路线,航向(取值范围是0.0°~359.9°,0.0°代表真北方向)
  • @property(readonly,nonatomic)CLLocationSpeed speed;
  • 行走速度(单位是m/s)
  • 用- (CLLocationDistance)distanceFromLocation:(constCLLocation*)
    location方法可以计算2个位置之间的距离

     eg:
     -(void)compare{
         CLLocation*locationFirst
= [[CLLocationalloc]initWithLatitude:80longitude:100];
         CLLocation*locationSecond
= [[CLLocationalloc]initWithLatitude:60longitude:100];
        CLLocationDistancedistance
= [locationFirst
distanceFromLocation:locationSecond];
         NSLog(@"distance:%f
km ",distance/1000);
     }
     在测试的时候可以修改模拟器的坐标,在——Debug-Location-Custom Location


4、CLLocationCoordinate2D
     CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下
     typedefstruct{
       CLLocationDegrees latitude;//纬度
       CLLocationDegrees longitude;//经度
     } CLLocationCoordinate2D;
           一般用CLLocationCoordinate2DMake 函数来创建CLLocationCoordinate2D

5、说点隐私问题:
     在iOS6.0之后,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权;
  • 用户的位置
  • 用户的通讯录、日历、相机、相册等
     当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权;
     一旦用户选择了“Don’tAllow”,意味着你的应用以后就无法使用定位功能
     为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用
     CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
     + (BOOL)locationServicesEnabled;
6、CLGeocoder (地理编码,反地理编码)
     
  • 使用CLGeocoder可以完成“地理编码”和“反地理编码”
  • 地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)
  • 反地理编码:根据给定的经纬度,获得具体的位置信息

  • 地理编码方法
  • - (void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
  • 反地理编码方法
     - (void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler
     
     完成后的回调函数CLGeocodeCompletionHandler,会返回一个地标数组
  • typedefvoid(^CLGeocodeCompletionHandler)(NSArray*placemarks,NSError*error);
     
     CLPlacemark的字面意思是地标,封装详细的地址位置信息
  • @property(nonatomic,readonly)CLLocation*location;
  • 地理位置
  • @property(nonatomic,readonly)CLRegion*region;
  • 区域
  • @property(nonatomic,readonly)NSDictionary*addressDictionary;
  • 详细的地址信息
  • @property(nonatomic,readonly)NSString*name;
  • 地址名称
  • @property(nonatomic,readonly)NSString*locality;
  • 城市
     ...
     CLPlacemark CLLocation的关系;
          从包含关系上就可以看出,一个地标除了包含CLLocation外,还有一些其它信息;

解码和反解码的一个非常简单的demo在我的github上,有兴趣的可以去看看。

https://github.com/yscGit/MapCodeUncode

iOS-地图定位 && 解码与反解码的更多相关文章

  1. iOS | 地图定位

    在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...

  2. iOS地图 -- 定位初使用

    iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...

  3. 关于iOS地图定位中点击设置->隐私->定位服务 闪退问题

    iOS8之后,如果应用中用到了地图定位,那么点击设置->隐私->定位服务 再点击该应用有时候会出现闪退问题,其原因是iOS8之后定位中添加了 NSLocationWhenInUseDesc ...

  4. iOS 地图定位及大头针的基本使用

    地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...

  5. iOS地图 -- 地理编码和反地理编码

    地理编码和反地理编码 用到的类和方法 CLGeocoder --> 地理编码管理器 - (void)geocodeAddressString:(NSString *)addressString ...

  6. iOS地图 -- 定位中的CLLocation的介绍与小练习

    通过定位练习,熟悉CLLocation 在上篇笔记中提到了CLLocation类,这里通过练习来讲解一下这个类,类中包含了获取到的用户位置的信息 coordinate --> 坐标,经度和纬度 ...

  7. ios8版本地图定位注意点

    学习ios地图定位 我先定义一个属性: @property (weak, nonatomic) IBOutlet MKMapView *mapV; 然后在项目运行时初始化该属性一些参数: //设置地图 ...

  8. iOS之定位与地图

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一 ...

  9. 地图定位CoreLocation框架,地理位置编码与反编码

    在现代互联网时代,越来越多的应用,都用到了地图定位功能,在iOS开发中,想要加入这种功能,必须基于两个框架进行开发: 1.Map Kit:用于显示地图, 2.CoreLocation:用于显示地理位置 ...

随机推荐

  1. Jmeter自动发送邮件

    自动发送邮件: 1.自动发送邮件,需要三个jar,分别是:activation.jar,commons-email-1.2.jar,mail.jar,这三个文件放在ant的lib目录下 2.报错 Ex ...

  2. Postman学习之Postman简介

    前言:对于测试人员来说,接口测试是必须掌握的一个技能:在工作中掌握了接口自动化测试无疑是如虎添翼,那么怎么开展接口测试呢?下面将介绍一款接口测试的神器——postman 1.postman背景介绍 p ...

  3. 【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

    喜欢今日头条,偶然看到广告,半个多月前交了8.9元,报名参加了头条上Python的四天培训课,呵呵,总算是有了零的开始(还是有点收获的,见https://www.sohu.com/a/38112874 ...

  4. JS的函数和对象一

    1.递归 在函数的内部调用自身,默认是一个无限循环. 2.匿名函数 没有名称的函数  function(){   } (1)创建函数 函数声明 function fn1(){   } 函数表达式 va ...

  5. MyCat垂直分库

    一.什么是垂直分库 将一类功能的表从一个实例切分到另一个实例,横向扩展实例,增加写负载 目标:将1个实例的4类表拆分多4个实例中 二.垂直切分步骤 2.1收集分析业务模块间的关系,能分几个库 2.2全 ...

  6. web项目——启动时tomcat报错:Server Tomcat v7.0 Server at localhost failed to start.

    报错信息:Server Tomcat v7.0 Server at localhost failed to start. 报错截图: 原因分析:在使用SSM框架时,生成的mapping与系统配置文件不 ...

  7. 405 - 不允许用于访问此页的 HTTP 谓词的处理办法

    今天介绍的是针对访问html页面时出现此类错误的处理办法,如果你的问题页面是其他类型,可以参考如下信息: IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词.终极解决办法!!!! 1.为什 ...

  8. mysql驱动包

    mysql驱动包和源码下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java 下载 mysql-connector-jav ...

  9. mysql 的大文本存储TEXT & BLOB

    TEXT & BLOB 一般在保存少量字符串的时候,我们会选择 CHAR 或者 VARCHAR:而在保存较大文本时,通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能 ...

  10. [ES6系列-02]Arrow Function:Whats this?(箭头函数及它的this及其它)

    [原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 如果没用过CSharp的lambda 表达式,也没有了解过ES6,那第一眼看到这样代码什么感觉? /* eg.0 * fu ...