一、配置

  1. 导入库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 定位简单使用的更多相关文章

  1. IOS定位服务的应用

    IOS定位服务的应用 一.授权的申请与设置 二.定位服务相关方法 三.定位服务代理的相关方法 四.定位服务获取到的位置对象 五.航标定位得到的航标信息对象 IOS定位服务的应用 一.授权的申请与设置 ...

  2. ios 定位

    ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...

  3. iOS上简单推送通知(Push Notification)的实现

    iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...

  4. Appium+Python3+iOS定位元素

    前言: 最近在做IOS自动化测试,IOS的Appium环境都配置OK,执行起来真的慢,慢到怀疑人生,那么今天就来总结一下IOS定位方式和各个定位方式的速度排序. 据我观察,按查找元素的顺序速度,从快到 ...

  5. iOS定位原理和使用建议(转)

    原文:http://ibbs.91.com/thread-1548870-1-1.html 看到很多网友讨论iOS设备定位的问题,这里将我们所了解的关于iPhone.iPad.iPod等的定位原理做详 ...

  6. IOS定位核心与地图

    IOS定位核心与地图                 Core Location以及Map框架包通常能给我们的应用程序添加定位和地图相关的服务.Core Location框架包通常是使用硬件设备来进行 ...

  7. iOS CAReplicatorLayer 简单动画

    代码地址如下:http://www.demodashi.com/demo/11601.html 写在最前面,最近在看学习的时候,偶然间发现一个没有用过的Layer,于是抽空研究了下,本来应该能提前记录 ...

  8. iOS之简单瀑布流的实现

    iOS之简单瀑布流的实现   前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionVie ...

  9. ios 定位获取当前位置信息

    啊,倦怠的人生啊~~ 什么事情都没做一眨眼就2点半了啊!!赶紧爬起来写博客啊. 诸位看官会鄙视我么,表示我真心不是把这当技术文章写的啊. 啊,下午我们来第二篇.获取地理位置信息.嗯嗯,秘籍上说叫逆向地 ...

随机推荐

  1. selenium在页面中多个fream的定位

    在做页面元素定位的时候,遇到多fream的页面定位比较困难,需要先去切换到元素所在的fream才能成功定位. 1,切换到目标fream: driver.switch_to.frame('freamID ...

  2. Python内置函数(59)——open

    英文文档: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, ope ...

  3. Python内置函数(3)——max

    英文文档: max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an i ...

  4. Python-函数-Day4

    1.函数 1.1.集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 a = {1,2,3,4} b ={3,4,5,6} a {1, 2, 3, 4} type(a) <c ...

  5. Spring知识点回顾(08)spring aware

    Spring知识点回顾(08)spring aware BeanNameAware 获得容器中的bean名称 BeanFactoryAware 获得当前的bean factory Applicatio ...

  6. vmvare入门(1)使用移动,不要使用复制

    1.复制虚拟机会产生新的自动网卡,原来的 System Eth0废了? 2.xftp链接的时候,要选择sftp方式连接,utf8编码.

  7. 发布到NPMJS

    最近在做微服务的前后端设计,打算将客户端中的一个模块独立出来发布到npmjs上,因此,有机会了解了一下npm的发布过程. 参考了很多网上的文章,长篇累牍(但在这里还是真心感谢他们的分享),最终总结成一 ...

  8. 教你用命令行激活win10系统

    对于笔者这样爱自己动手的电脑爱好者来说,当然会选择自己组装一台性价比高的台式电脑,一切都准备就绪了,系统也装好了,就差最后一步了--激活系统. 笔者真的很幸运,在网上找到了一些可以使用的密钥,我装的是 ...

  9. requests-get请求

    import requests response= requests.get('http://www.baidu.com')#get方法请求网址 print(response) print(respo ...

  10. Java - Spring MVC 实现跨域资源 CORS 请求

    拦截器设置响应头 这种方式原理就是利用拦截器在方法执行前,我们增加请求的响应头,用来支持跨域请求.这种方案是可行的,大部分都是采用这种方案.我当时也是打算采用这种方案,直到我发现原来 Spring 框 ...