iOS 定位简单使用
一、配置
- 导入库CoreLocation.

2.info.plist配置key NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription(至少一个), 如果不设置key, 系统会忽略定位请求.

如果需要后台定位的话需要打开后台模式.

二、使用
1.导入头文件 <CoreLocation/CoreLocation.h>.
2.创建位置管理者 CLLocationManager, 设置管理者的一些属性.
3.设置代理、遵守协议、实现代理方法.
4.调用打开地理位置方法requestWhenInUseAuthorization或requestAlwaysAuthorization, 不然当授权状态为未决定的时候不会请求用户授权.
5.调用开始更新位置方法.
导入头文件和初始化
#import <CoreLocation/CoreLocation.h>
@interface CouponWebController ()<CLLocationManagerDelegate>
// 原生地图
@property (nonatomic, strong) CLLocationManager *locService;
@end
@implementation CouponWebController
#pragma mark ----- 入口
- (void)initLocation {
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{ //让定位管理者同步执行,在主线程中创建
// 初始化定位
_locService = [[CLLocationManager alloc] init]; //创建位置管理者 CLLocationManager
_locService.delegate = self;
_locService.distanceFilter = 10; //设置定位距离过滤参数 (当本次定位和上次定位之间的距离大于或等于这个值时,调用代理方法)
_locService.desiredAccuracy = kCLLocationAccuracyBest; // 设置定位精度(精度越高越耗电)
});
}
开启定位
#pragma mark ----- 获取gps
- (void)getGps {
[_locService requestWhenInUseAuthorization]; //调用打开地理位置方法
[_locService startUpdatingLocation]; //调用开始更新位置方法
}
定位的相关代理方法
#pragma mark ----- CLLocationManagerDelegate
/** 获取到新的位置信息时调用*/
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
[_locService stopUpdatingLocation]; //停止定位
CLLocation *newLocation = locations.lastObject;
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
if (locationAge > 1.0){ //didUpdateLocations方法可能会执行多次. 此条件限制如果已经调用一次,不再执行
// 限制如果已经调用一次,不再执行的另一方法为:
// 使用dispatch_once, 可以简化代码并且彻底保证线程安全,开发者无需担心加锁或同步。此外,dispatch_once更高效,它没有使用重量级的同步机制,若是那样做的话,每次运行代码前都要获取锁。相反,此函数采用“原子访问”来查询标记,以判断其所对应的代码原来是否已经执行过。在64位Mac OS X上测试,dispatch_once的执行速度要比stopUpdatingLocation快一倍。
return;
}else{
NSString *longitude = [NSString stringWithFormat:@"%f",newLocation.coordinate.longitude];
NSString *latitude = [NSString stringWithFormat:@"%f",newLocation.coordinate.latitude];
BBLog(@"latitude = %@ longitude = %@",_latitude, _longitude); //NSLog
//创建地理位置解码编码器对象 解析具体位置(如城市, 街道等)
CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
for (CLPlacemark * place in placemarks) {
BBLog(@"城市:%@",place.locality);
}
}];
}
}
/** 定位状态改变后会调用这个代理方法*/
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
// kCLAuthorizationStatusDenied 定位服务没开
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) { //如果由未定位变成已定位并回到前台, 重新定位
[_locService startUpdatingLocation];
}
// 定位的各种状态
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;
}
}
/** 获取位置信息失败时调用*/
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
// Alert弹框
[CommonTool tub:YES delegate:self title:@"提示" message:@"需要开启定位权限后才可正常使用" cancelText:@"取消" sureText:@"去开启" tag:1344];
}
@end
iOS 定位简单使用的更多相关文章
- IOS定位服务的应用
IOS定位服务的应用 一.授权的申请与设置 二.定位服务相关方法 三.定位服务代理的相关方法 四.定位服务获取到的位置对象 五.航标定位得到的航标信息对象 IOS定位服务的应用 一.授权的申请与设置 ...
- ios 定位
ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...
- iOS上简单推送通知(Push Notification)的实现
iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...
- Appium+Python3+iOS定位元素
前言: 最近在做IOS自动化测试,IOS的Appium环境都配置OK,执行起来真的慢,慢到怀疑人生,那么今天就来总结一下IOS定位方式和各个定位方式的速度排序. 据我观察,按查找元素的顺序速度,从快到 ...
- iOS定位原理和使用建议(转)
原文:http://ibbs.91.com/thread-1548870-1-1.html 看到很多网友讨论iOS设备定位的问题,这里将我们所了解的关于iPhone.iPad.iPod等的定位原理做详 ...
- IOS定位核心与地图
IOS定位核心与地图 Core Location以及Map框架包通常能给我们的应用程序添加定位和地图相关的服务.Core Location框架包通常是使用硬件设备来进行 ...
- iOS CAReplicatorLayer 简单动画
代码地址如下:http://www.demodashi.com/demo/11601.html 写在最前面,最近在看学习的时候,偶然间发现一个没有用过的Layer,于是抽空研究了下,本来应该能提前记录 ...
- iOS之简单瀑布流的实现
iOS之简单瀑布流的实现 前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionVie ...
- ios 定位获取当前位置信息
啊,倦怠的人生啊~~ 什么事情都没做一眨眼就2点半了啊!!赶紧爬起来写博客啊. 诸位看官会鄙视我么,表示我真心不是把这当技术文章写的啊. 啊,下午我们来第二篇.获取地理位置信息.嗯嗯,秘籍上说叫逆向地 ...
随机推荐
- Golang学习--平滑重启
在上一篇博客介绍TOML配置的时候,讲到了通过信号通知重载配置.我们在这一篇中介绍下如何的平滑重启server. 与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只 ...
- TFTP通信原理
TFTP的通信流程 TFTP共定义了五种类型的包格式,格式的区分由包数据前两个字节的Opcode字段区分,分别是: · l 读文件请求包:Read request,简写为RRQ,对应Opcode字段值 ...
- STM32常见问题
一.STM32 下不了程序 提示: (1).JLink Info: CPU halted Erase Done. Programming Failed! 解决办法: 用isp把芯片全部擦除再试试,如果 ...
- WPF 自定义DataGrid控件样式
内容转自https://www.cnblogs.com/xiaogangqq123/archive/2012/05/07/2487166.html 一.DataGrid基本样式(一) 小刚已经把Dat ...
- Linux实战案例(5)关闭Centos的防火墙
1.检查防火墙的状态 [root@LxfN1 ~]# service iptables status表格:filterChain INPUT (policy ACCEPT)num target pro ...
- 读取properties配置的工具类
@Service public class AppPropertiesManager implements DisposableBean{ @Value("${shortloan_rate_ ...
- Java-NIO(二):缓冲区(Buffer)的数据存取
缓冲区(Buffer): 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通 ...
- Java调用SQL脚本执行的方案
在Java中调用SQL脚本的方式有多种,在这里只记录一种自己常用的方式,个人觉得挺实用方便的. 运用ScriptRunner这个类. import org.apache.ibatis.io.Resou ...
- ACE之通信的设计空间
本篇文章主要介绍 .无连接的和面向连接的协议之间的对比 .同步的和异步的消息交换之间的对比. .消息传递和共享内存之间的对比. 1:无连接和面向连接的协议对比 协议(protocol)是指一组规则,这 ...
- Ubuntu 18.04 LTS修改 国内源(以中科大源为例)
国内有很多Ubuntu的镜像源,包括阿里的.网易的,还有很多教育网的源,比如:清华源.中科大源. 我们这里以中科大的源为例讲解如何修改Ubuntu 18.04里面默认的源. 可以进入这个链接进行下载: ...