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点半了啊!!赶紧爬起来写博客啊. 诸位看官会鄙视我么,表示我真心不是把这当技术文章写的啊. 啊,下午我们来第二篇.获取地理位置信息.嗯嗯,秘籍上说叫逆向地 ...
随机推荐
- Microsoft dynamic sdk中join应该注意的问题.
QueryExpression queryNextSeq = new QueryExpression { EntityName = "ep_prodoperationsequence&quo ...
- c# gridview 新增行
string[] newRow = {"long","d","b"}; Gridview.Rows.Insert(Gridview.Rows ...
- Linq 透明标识符
IEnumerable<Person> list = new List<Person> { , Id = }, , Id = }, , Id = }, , Id = }, , ...
- Struts2 配置文件小结
每次写的博文都被管理员都被移出首页,好气!还希望有哪位大神可以指点迷津-- struts2 配置文件的 result 节点 result 节点是 action 节点的子节点,他代表着 action 方 ...
- OpenID Connect + OAuth2.0
一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...
- ubuntu 虚拟机上的 django 服务,在外部Windows系统上无法访问
背景介绍 今天尝试着写了一个最简单的django 服务程序,使用虚拟机(Ubuntu16.02 LTS)上的浏览器访问程序没有问题.但是在物理机器上(win10 Home) 就出现错误 解决方法 在 ...
- kafka---broker 保存消息
1 .存储方式 物理上把 topic 分成一个或多个 patition(对应 server.properties 中的 num.partitions=3 配置),每个 patition 物理上对应一个 ...
- hdu4864 Task贪心好题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4864 题目大意: 有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间 ...
- [转][scrapy] CannotListenError: Couldn’t listen on [Errno 98] Address already in use.
[scrapy] CannotListenError: Couldn't listen on [Errno 98] Address already in use. python eason 1年前 ...
- Docker----起步
最近学习了一下的docker相关的东西,下面介绍一下我个人的学习总结和体会.关于docker的详细介绍和优势,在网上随便都可以找得到,就不做介绍了.这个部分的内容比较简单,有Docker基础的朋友可以 ...