//  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之UI--小实例项目--添加商品和商品名

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. 关于配置并发访问的服务器apache、nginx

    一. apache,nginx比较     关于Apache与Nginx的优势比较  (apache计算密集型   nginx io密集型  各有优势,不存在谁取代谁) 二.nginx 基于nginx ...

  3. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

  4. 解决tomcat6部署spring4+mybatisJSP页面产生的500错误,控制台报java.lang.NullPointerException的问题

    搭建spring4+mybatis+springMVC访问项目时产生异常: 严重: Servlet.service() for servlet jsp threw exception java.lan ...

  5. 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 ...

  6. 常用oracle函数

    一.逗号拼接字段 SELECT LISTAGG(aa, ',') WITHIN GROUP (ORDER BY aa) AS AA FROM *** where id<5 输出结果例如:1,2, ...

  7. TCP/IP包格式详解

    文章参考地址:http://blog.chinaunix.net/uid-20698826-id-4700710.html http://blog.csdn.net/mrwangwang/articl ...

  8. 卡拉兹(Callatz)猜想

    题目描述 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步 得到n=1.卡拉兹在195 ...

  9. java :hello world

    练习java的基本语法. output hellow world. 需求:打包自身项目的bin目录文件为一个临时可运行的jar文件,执行完后删除. 使用process执行jar文件,返回输入流和错误流 ...

  10. 循环 wxl

    #include <cstdio> #include <cstring> #include <string> #include <algorithm> ...