IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    IOS之定位

    键盘上的舞者发表于 2015-10-08 14:45:24
    love 0

    使用定位服务的几个步骤:

    定位,使用CoreLocation框架,使用定位服务的三个步骤:
    1.创建CoreLocation的管理者
    2.成为CoreLocation管理者的代理监听获取到的位置
    3.开始监听(开始获取位置)
    如果IOS的版本是8以上,则需要在info.plist中配置一下:
    NSLocationAlwaysUsageDescription或者NSLocationUsageDescription  IOS8请求授权

    //
    //  ViewController.m
    //  ios定位
    //
    //  Created by 键盘上的舞者 on 15/10/8.
    //  Copyright © 2015年 键盘上的舞者. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <CoreLocation/CoreLocation.h>
    
    @interface ViewController ()<CLLocationManagerDelegate>
    
    @property(nonatomic,strong) CLLocationManager *manager;
    
    @end
    
    @implementation ViewController
    
    //懒加载manager
    -(CLLocationManager *)manager
    {
        if(_manager==nil){
            //创建管理者
            _manager=[[CLLocationManager alloc] init];
        }
        return _manager;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //设置manager的代理
        self.manager.delegate=self;
        NSLog(@"%@",[UIDevice currentDevice].systemVersion);
        
        if ([[UIDevice currentDevice].systemVersion doubleValue]>8.0) {
           // [self.manager requestAlwaysAuthorization];
        }
        //开始监听
        [self.manager startUpdatingLocation];
    }
    
    //实现代理方法
    //授权状态改变
    -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
    {
        
    }
    //更新位置,记录存放在locations数组中
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
    {
        NSLog(@"aaaa------");
    }
    
    @end

    一些笔记:

    01. CLLocation

    CLLocationManager 定位管理者

    CLLocation 代表位置(经度/纬度/高度/速度/路线等)

    CLHeading  代表移动方向

    CLRegion   代表一个区域

    >CLCircularRegion  圆形区域

    >CLBeaconRegion 蓝牙信号区域

    返回定位服务是否可用

    [CLLocationManager locationServicesEnabled];

    返回延迟定位更新是否可用

    [CLLocationManager deferredLocationUpdatesAvailable];

    返回重大位置改变监听是否可用

    [CLLocationManager significantLocationChangeMonitoringAvailable];

    返回是否支持磁力计算方向

    [CLLocationManager headingAvailable];

    返回蓝牙信号范围服务是否可用

    [CLLocationManager isRangingAvailable];

    ——————————————————–

    设置是否可以暂停定位来节省电池电量, YES不需要定位数据时自动暂停定位

    // mgr.pausesLocationUpdatesAutomatically

    ——————————————————–

    每隔多少米定位一次, 只有水平方向超过该值时才会重新定位

    // mgr.distanceFilter = 100;

    ——————————————————–

    定位精确度

    // mgr.desiredAccuracy;

    kCLDistanceFilterNone;

    kCLLocationAccuracyBestForNavigation 导航级最佳精准

    kCLLocationAccuracyBest; 最佳精准

    kCLLocationAccuracyNearestTenMeters; 10米误差

    kCLLocationAccuracyHundredMeters; 百米胡茬

    kCLLocationAccuracyKilometer;  千米误差

    kCLLocationAccuracyThreeKilometers; 3千米误差

    ——————————————————–

    定位数据的用途

    // mgr.activityType;

    CLActivityTypeOther 作为普通用途

    CLActivityTypeAutomotiveNavigation  作为车辆导航

    CLActivityTypeFitness  作为不行

    CLActivityTypeOtherNavigation 作为其它导航

    ——————————————————–

    // CLLocation

    location.coordinate; 坐标, 包含经纬度

    location.altitude; 设备海拔高度 单位是米

    location.course; 设置前进方向 0表示北 90东 180南 270西

    location.horizontalAccuracy; 水平精准度

    location.verticalAccuracy; 垂直精准度

    location.timestamp; 定位信息返回的时间

    location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行

    /*

    可以设置模拟器模拟速度

    bicycle ride 骑车移动

    run 跑动

    freeway drive 高速公路驾车

    */

    ——————————————————–

    // CLAuthorizationStatus

    用户从未选择过权限

    kCLAuthorizationStatusNotDetermined

    无法使用定位服务,该状态用户无法改变

    kCLAuthorizationStatusRestricted

    用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态

    kCLAuthorizationStatusDenied

    已经授权(废弃)

    kCLAuthorizationStatusAuthorized

    用户允许该程序无论何时都可以使用地理信息

    kCLAuthorizationStatusAuthorizedAlways

    用户同意程序在可见时使用地理位置

    kCLAuthorizationStatusAuthorizedWhenInUse

    ——————————————————–

    // 计算两个位置之间的距离, 单位是米

    [newLocation distanceFromLocation:self.prevLocation];

    ——————————————————–

    获取方向信息不会提示用户(不需要授权), 因为不会泄露隐私

    // [self.mgr startUpdatingHeading];

    magneticHeading 设备与磁北的相对角度

    trueHeading 设置与真北的相对角度, 必须和定位一起使用, iOS需要设置的位置来计算真北

    真北始终指向地理北极点

    磁北对应随着时间变化的地球磁场北极

    // 牛逼的地方

    116.958776,36.721199

    ——————————————————–

    // 错误:使用CoreLocation获取地理位置信息,报错

    Error Domain=kCLErrorDomain Code=0 “The operation couldn’t be completed. (kCLErrorDomain error 0.)”

    解决方法:

    1.确定模拟器(手机)已经联网并且允许程序获取地理位置

    2.重置地理位置服务或者网络服务

    PS:如果是模拟器就果断直接重置模拟器吧  IOS Simulator – Reset Content and Settings..。



沪ICP备19023445号-2号
友情链接