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之UI--小实例项目--添加商品和商品名
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 关于配置并发访问的服务器apache、nginx
一. apache,nginx比较 关于Apache与Nginx的优势比较 (apache计算密集型 nginx io密集型 各有优势,不存在谁取代谁) 二.nginx 基于nginx ...
- Linux线程学习(二)
线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...
- 解决tomcat6部署spring4+mybatisJSP页面产生的500错误,控制台报java.lang.NullPointerException的问题
搭建spring4+mybatis+springMVC访问项目时产生异常: 严重: Servlet.service() for servlet jsp threw exception java.lan ...
- Effective Java 68 Prefer executors and tasks to threads
Principle The general mechanism for executing tasks is the executor service. If you think in terms o ...
- 常用oracle函数
一.逗号拼接字段 SELECT LISTAGG(aa, ',') WITHIN GROUP (ORDER BY aa) AS AA FROM *** where id<5 输出结果例如:1,2, ...
- TCP/IP包格式详解
文章参考地址:http://blog.chinaunix.net/uid-20698826-id-4700710.html http://blog.csdn.net/mrwangwang/articl ...
- 卡拉兹(Callatz)猜想
题目描述 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步 得到n=1.卡拉兹在195 ...
- java :hello world
练习java的基本语法. output hellow world. 需求:打包自身项目的bin目录文件为一个临时可运行的jar文件,执行完后删除. 使用process执行jar文件,返回输入流和错误流 ...
- 循环 wxl
#include <cstdio> #include <cstring> #include <string> #include <algorithm> ...