ios 定位 航向检测
// 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 定位 航向检测的更多相关文章
- IOS定位服务的应用
IOS定位服务的应用 一.授权的申请与设置 二.定位服务相关方法 三.定位服务代理的相关方法 四.定位服务获取到的位置对象 五.航标定位得到的航标信息对象 IOS定位服务的应用 一.授权的申请与设置 ...
- ios 定位
ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...
- 【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类
背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题.我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题.视图和控制器相关的内存泄露,几乎都不存在了.后来想着一直就那个工 ...
- 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 内存泄露检测工具
MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22 | zepo | 23 Comments 背景 平常我们都会用 Instrument 的 Lea ...
- OverFeat:基于卷积网络的集成识别、定位与检测
摘要:我们提出了一个使用卷积网络进行分类.定位和检测的集成框架.我们展示了如何在ConvNet中有效地实现多尺度和滑动窗口方法.我们还介绍了一种新的深度学习方法,通过学习预测对象边界来定位.然后通过边 ...
- iOS 硬件授权检测:定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等(转)
转载自:http://www.cocoachina.com/ios/20151214/14502.html iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用 ...
随机推荐
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- canvas & animation
1.using canvas using canvas to set difference property. it will showing like an animation. The true ...
- Apache Shiro 简介
使用 Apache Shiro 为 web 应用程序进行用户身份验证 Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权.在本文中,了解 Apache Shiro 并通 ...
- (Ios 实战) 自定义UITableView
自定义UITableView 分成两个部分 1 自定义UITableViewCell 继承UITableViewCell,同时提供接口,根据当前的数据,现实View 2 在UITableView中实 ...
- Android开源项目汇总【转】
主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView ...
- TOMCAT报错:HTTP Status 404 -
构建struts2工程师,tomcat报错: HTTP Status 404 - type Status report message description The requested resour ...
- 常用vi编辑命令
在自己的博客里存起来,这么多全记住确实有点难,时不时的翻一翻到是可以的. 摘自:http://www.cnblogs.com/junw_china/articles/1708967.html 光标控制 ...
- STM32启动文件选择说明
图1. STM32F10xxx标准外设库体系结构先说这个问题,大家都知道,我们在选择使用哪些外围的的时候,是去更改从官方模版中拷贝过来的stm32f10x_conf.h文件的27-48行,把我们要用的 ...
- 实习小记-python中不可哈希对象设置为可哈希对象
在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下: 实习小记-python中可哈希对象是个啥?what is hashable object in python? ...
- 2014 Super Training #6 F Search in the Wiki --集合取交+暴力
原题: ZOJ 3674 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3674 题意不难理解,很容易想到用暴力,但是无从下 ...