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点半了啊!!赶紧爬起来写博客啊. 诸位看官会鄙视我么,表示我真心不是把这当技术文章写的啊. 啊,下午我们来第二篇.获取地理位置信息.嗯嗯,秘籍上说叫逆向地 ...
随机推荐
- selenium在页面中多个fream的定位
在做页面元素定位的时候,遇到多fream的页面定位比较困难,需要先去切换到元素所在的fream才能成功定位. 1,切换到目标fream: driver.switch_to.frame('freamID ...
- Python内置函数(59)——open
英文文档: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, ope ...
- Python内置函数(3)——max
英文文档: max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an i ...
- Python-函数-Day4
1.函数 1.1.集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 a = {1,2,3,4} b ={3,4,5,6} a {1, 2, 3, 4} type(a) <c ...
- Spring知识点回顾(08)spring aware
Spring知识点回顾(08)spring aware BeanNameAware 获得容器中的bean名称 BeanFactoryAware 获得当前的bean factory Applicatio ...
- vmvare入门(1)使用移动,不要使用复制
1.复制虚拟机会产生新的自动网卡,原来的 System Eth0废了? 2.xftp链接的时候,要选择sftp方式连接,utf8编码.
- 发布到NPMJS
最近在做微服务的前后端设计,打算将客户端中的一个模块独立出来发布到npmjs上,因此,有机会了解了一下npm的发布过程. 参考了很多网上的文章,长篇累牍(但在这里还是真心感谢他们的分享),最终总结成一 ...
- 教你用命令行激活win10系统
对于笔者这样爱自己动手的电脑爱好者来说,当然会选择自己组装一台性价比高的台式电脑,一切都准备就绪了,系统也装好了,就差最后一步了--激活系统. 笔者真的很幸运,在网上找到了一些可以使用的密钥,我装的是 ...
- requests-get请求
import requests response= requests.get('http://www.baidu.com')#get方法请求网址 print(response) print(respo ...
- Java - Spring MVC 实现跨域资源 CORS 请求
拦截器设置响应头 这种方式原理就是利用拦截器在方法执行前,我们增加请求的响应头,用来支持跨域请求.这种方案是可行的,大部分都是采用这种方案.我当时也是打算采用这种方案,直到我发现原来 Spring 框 ...