//  ViewController.m
// CoreLocation框架的基本使用—定位
// 注意 点: 1.设置地位可用 2. 设置允许本程序定位(对弹出的框,允许即可) 3. 为模拟器 设置位置移动方式, 比如 Freeway Drive(自由驾车模式) #import "ViewController.h"
#import <CoreLocation/CoreLocation.h> #define isIOS(version) ([[UIDevice currentDevice].systemVersion floatValue] >= version) @interface ViewController ()<CLLocationManagerDelegate>
{
CLLocation *_lastLoc;
}
/** 位置管理者*/
@property (nonatomic, strong) CLLocationManager *locM; @end @implementation ViewController #pragma mark - 懒加载
/** locM属性的懒加载 */
-(CLLocationManager *)locM
{
if (!_locM) {
// 1. 创建位置管理者
_locM = [[CLLocationManager alloc] init];
// 1.1 block , 代理, 通知
_locM.delegate = self; // 精确度越高, 越好点, 而且, 定位时间越长
// 精确度
_locM.desiredAccuracy = kCLLocationAccuracyBest; /** ----------iOS8.0+定位适配-------------- */ // 如果两个授权请求,同时发送, 那么先执行第一个 if(isIOS(8.0))
{ // 请求前后台定位授权
// 无论是在前台还是后台, 都可以获取用户位置,而且不会出现蓝条
// 无论是否勾选后台模式
// 如果当前的授权状态 != 用户未选择状态, 那么这个方法不会有效
// 如果当前授权状态 == 前台定位授权时, 这个方法也会有效
// [_locM requestAlwaysAuthorization]; // 请求前台定位授权
// 在前台授权下, 默认只能在前台获取用户位置信息, 如果想要在后台获取用户位置, 那么 勾选后台模式 Location updates (会出现蓝条)
// 如果当前的授权状态 != 用户未选择状态, 那么这个方法不会有效
[_locM requestWhenInUseAuthorization]; // 在前台授权下, 默认只能在前台获取用户位置信息, 如果想要在后台获取用户位置, 那么 勾选后台模式 Location updates (会出现蓝条), 需要额外的设置一下属性为YES
if (isIOS(9.0)) {
// _locM.allowsBackgroundLocationUpdates = YES;
} } }
return _locM;
} - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ // 2. 开始更新用户位置
// start 开始某个服务 stop 停止某个服务
// 一旦我们调用了这个方法, 那么就会在后台不断的获取用户位置, 然后告诉外界
// 标准化定位(gps/ 基站 / WiFi)
//
[self.locM startUpdatingLocation]; // 显著位置变化(基站)(要求设备必须由电话模块)
// 当app 被杀死时也可以接收到位置通知(app -- 后台 )
// [self.locM startMonitoringSignificantLocationChanges]; /**
* ———————————应用场景—————————————
1) 如果要求定位及时,精度较高,并且运行时间较短,可使用标准定位;
2) 如果长时间监控用户位置,用户移动速度比较快(例如打车软件),可使用后者
*
*/ /**
* extern const CLLocationAccuracy kCLLocationAccuracyBest;
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;ß
*/ // [self.locM requestLocation]; } #pragma mark - CLLocationManagerDelegate /**
* 获取到位置信息时调用
*
* @param manager 位置管理者
* @param locations 位置数组
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// NSLog(@"获取到位置"); CLLocation *loc = [locations lastObject]; NSLog(@"%lf",loc.horizontalAccuracy);
// 代表当前位置 horizontalAccuracy>0 才是有效的
if(loc.horizontalAccuracy > )
{ /**
* CLLocation
* coordinate : 经纬度
altitude :海拔
course : 航向
speed : 速度
distanceFromLocation : 计算两个点之间的直线物理距离
*/ /**
* 场景演示:打印当前用户的行走方向,偏离角度以及对应的行走距离,
例如:”北偏东 30度 方向,移动了 8米 ”
*/ // 确定航向
NSString *angleStr = nil;
switch ((int)loc.course / ) {
case :
angleStr = @"北偏东";
break;
case :
angleStr = @"东偏南";
break;
case :
angleStr = @"南偏西";
break;
case :
angleStr = @"西偏北";
break; default:
angleStr = @"掉沟里去了";
break;
} // 确定偏离角度
int angle = ;
angle = (int)loc.course % ;
// 正方向
if (angle == ) {
angleStr = [angleStr substringToIndex:];
} // 移动了多少
CLLocationDistance distance = ;
if (_lastLoc) {
distance = [loc distanceFromLocation:_lastLoc];
}
_lastLoc = loc; // 拼串
// 例如:”北偏东 30度 方向,移动了 8米 ” NSString *str ;
if (angle == ) {
str = [NSString stringWithFormat:@"正%@方向, 移动了%f米", angleStr, distance];
}else
{
str = [NSString stringWithFormat:@"%@%zd度方向, 移动了%f米", angleStr , angle, distance];
} NSLog(@"%@", str); } // 如果我们想要定位一次 // 停止位置更新
// [manager stopUpdatingLocation];
} /**
* 当前授权状态发生变化时调用
*
* @param manager 位置管理者
* @param status 状态
*/
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户未选择");
break;
}
case kCLAuthorizationStatusRestricted:
{
NSLog(@"受限制");
break;
}
case kCLAuthorizationStatusDenied:
{ // 确定当前设备, 是否支持定位,或者定位服务是否开启
if([CLLocationManager locationServicesEnabled])
{
NSLog(@"拒绝"); // 我们可以调用代码, 打开设置界面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} }else
{
NSLog(@"服务关闭");
} break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"前后台定位授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"前台定位授权");
break;
} default:
break;
}
} /**
* 定位失败
*
* @param manager 位置管理者
* @param error 错误
*/
-(void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error
{
NSLog(@"fail%@",error); } @end

ios 定位 航向检测的更多相关文章

  1. IOS定位服务的应用

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

  2. ios 定位

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

  3. 【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类

    背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题.我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题.视图和控制器相关的内存泄露,几乎都不存在了.后来想着一直就那个工 ...

  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 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  8. OverFeat:基于卷积网络的集成识别、定位与检测

    摘要:我们提出了一个使用卷积网络进行分类.定位和检测的集成框架.我们展示了如何在ConvNet中有效地实现多尺度和滑动窗口方法.我们还介绍了一种新的深度学习方法,通过学习预测对象边界来定位.然后通过边 ...

  9. iOS 硬件授权检测:定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等(转)

    转载自:http://www.cocoachina.com/ios/20151214/14502.html iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用 ...

随机推荐

  1. iOS多线程-03-NSOperation与NSOperationQueue

    简介 通过NSOperation与NSOperationQueue的组合也能实现多线程 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现 NSOpera ...

  2. virt manager 提示权限不允许(ubuntu)

    问题描述: 新安装virt manager 打开提示权限不允许(ubuntu 15.04); 提示检查libvirt-bin包是否安装:libvirtd服务是否已运行:当前用户是否在libvirtd组 ...

  3. 8张图理解Java

    一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选.如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟. 1.字符串不变性 下面这张图展示了这段代码做 ...

  4. Profile 分析 Erlang 虚拟机源码时要注意的一个问题

    最近用 Intel Vtune 剖析 Erlang 虚拟机的运行,想看看那些函数和语句耗时最多,遇到一个小问题,那就是 Vtune 给出的源码和汇编码对应有问题.这个问题在 profile 或 deb ...

  5. JavaScript闭包的底层运行机制

    转自:http://blog.leapoahead.com/2015/09/15/js-closure/ 我研究JavaScript闭包(closure)已经有一段时间了.我之前只是学会了如何使用它们 ...

  6. 问题解决——XP线程池找不到QueueUserWorkItem

    2013年7月11号 主管让同事写一个并发100的小工具进行什么压力测试,据说是创建100个线程. 我表示这真真的是在坑人! 线程创建消耗资源,以自己的笔记本来跑这个东西,时间片都消耗在了线程切换上了 ...

  7. 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

    温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...

  8. uboot 2014.04 运行过程记录

    uboot启动流程分析,针对S5PV210 BL1阶段,SPL,u-boot-spl.bin 1.首先运行arch/arm/cpu/armv7/start.S 里面的_start函数,进行异常向量表设 ...

  9. 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题

    关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati ...

  10. 【开学季】自学嵌入式开发|四核开发板|4412开发板|ARM+Android+linux技术

    淘宝店铺:迅为开发板http://arm-board.taobao.com 网站:http://www.topeetboard.com QQ咨询:2551456065 电话咨询:010-5895758 ...