zoukankan      html  css  js  c++  java
  • iOS开发拓展篇—CoreLocation定位服务

    一、简单说明

    1.CLLocationManager

    CLLocationManager的常用操作和属性

    开始用户定位- (void)startUpdatingLocation;

    停止用户定位- (void) stopUpdatingLocation;

    说明:当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法

      - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

    每隔多少米定位一次

      @property(assign, nonatomic) CLLocationDistance distanceFilter;

    定位精确度(越精确就越耗电)

      @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

    2.CLLocation

    CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等

    (1)经纬度 

      @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

    (2)海拔 

      @property(readonly, nonatomic) CLLocationDistance altitude;

    (3)路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向)

      @property(readonly, nonatomic) CLLocationDirection course;

    (4)行走速度(单位是m/s)

       @property(readonly, nonatomic) CLLocationSpeed speed;

    (5)计算2个位置之间的距离

      - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法

    3.CLLocationCoordinate2D

    CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下

    typedef struct {

            CLLocationDegrees latitude; // 纬度

            CLLocationDegrees longitude; // 经度

    } CLLocationCoordinate2D;

    一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D

    二、代码示例

    复制代码
     1 //
     2 //  YYViewController.m
     3 //  18-定位服务
     4 //
     5 //  Created by apple on 14-8-9.
     6 //  Copyright (c) 2014年 yangyong. All rights reserved.
     7 //
     8 
     9 #import "YYViewController.h"
    10 #import <CoreLocation/CoreLocation.h>
    11 
    12 //需要遵守CLLocationManagerDelegate协议
    13 @interface YYViewController ()<CLLocationManagerDelegate>
    14 @property(nonatomic,strong)CLLocationManager *locMgr;
    15 @end
    16 
    17 @implementation YYViewController
    18 #pragma mark-懒加载
    19 -(CLLocationManager *)locMgr
    20 {
    21     if (_locMgr==nil) {
    22         //1.创建位置管理器(定位用户的位置)
    23         self.locMgr=[[CLLocationManager alloc]init];
    24         //2.设置代理
    25         self.locMgr.delegate=self;
    26     }
    27     return _locMgr;
    28 }
    29 - (void)viewDidLoad
    30 {
    31     [super viewDidLoad];
    32     
    33     //判断用户定位服务是否开启
    34     if ([CLLocationManager locationServicesEnabled]) {
    35         //开始定位用户的位置
    36         [self.locMgr startUpdatingLocation];
    37         //每隔多少米定位一次(这里的设置为任何的移动)
    38         self.locMgr.distanceFilter=kCLDistanceFilterNone;
    39         //设置定位的精准度,一般精准度越高,越耗电(这里设置为精准度最高的,适用于导航应用)
    40         self.locMgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    41     }else
    42     {//不能定位用户的位置
    43         //1.提醒用户检查当前的网络状况
    44         //2.提醒用户打开定位开关
    45     }
    46     
    47     //测试方法,计算两个位置之间的距离
    48     [self countDistance];
    49 }
    50 
    51 #pragma mark-CLLocationManagerDelegate
    52 /**
    53  *  当定位到用户的位置时,就会调用(调用的频率比较频繁)
    54  */
    55 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    56 {
    57     //locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置
    58    CLLocation *loc = [locations firstObject];
    59     
    60     //维度:loc.coordinate.latitude
    61     //经度:loc.coordinate.longitude
    62     NSLog(@"纬度=%f,经度=%f",loc.coordinate.latitude,loc.coordinate.longitude);
    63     NSLog(@"%d",locations.count);
    64     
    65     //停止更新位置(如果定位服务不需要实时更新的话,那么应该停止位置的更新)
    66 //    [self.locMgr stopUpdatingLocation];
    67  
    68 }
    69 
    70 //计算两个位置之间的距离
    71 -(void)countDistance
    72 {
    73     //根据经纬度创建两个位置对象
    74     CLLocation *loc1=[[CLLocation alloc]initWithLatitude:40 longitude:116];
    75     CLLocation *loc2=[[CLLocation alloc]initWithLatitude:41 longitude:116];
    76     //计算两个位置之间的距离
    77     CLLocationDistance distance=[loc1 distanceFromLocation:loc2];
    78     NSLog(@"(%@)和(%@)的距离=%fM",loc1,loc2,distance);
    79 }
    80 
    81 @end
    复制代码

    打印查看:

      

    代码说明:

    1.关于代理方法

      需要设置代理,通过代理告诉用户当前的位置,有两个代理方法:

      locations参数里面装着CLLocation对象

    其中后者是一个过期的方法,在新的方法(第一个)中使用了一个数组来替代。
    说明:该方法在当定位到用户的位置时就会调用,调用比较频繁
    注意:不要使用局部变量(创建位置管理器),因为局部变量的方法结束它就被销毁了。建议使用一个全局的变量,且只创建一次就可以了(使用懒加载)。
     
    2.定位的精度
      
    3.如果发现自己的定位服务没有打开,那么应该提醒用户打开定位服务功能。
    4.定位服务是比较耗电的,如果是做定位服务(没必要实时更新的话),那么定位了用户位置后,应该停止更新位置。
     
    三、用户隐私的保护

    1.权限设置说明

    从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权

    (1)要想获得用户的位置

    (2)想访问用户的通讯录、日历、相机、相册等

    当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权

    注意:一旦用户选择了“Don’t Allow”,意味着你的应用以后就无法使用定位功能,且当用户第一次选择了之后,以后就再也不会提醒进行设置。

    因此在程序中应该进行判断,如果发现自己的定位服务没有打开,那么应该提醒用户打开定位服务功能。

    CLLocationManager有个类方法可以判断当前应用的定位功能是否可用+ (BOOL)locationServicesEnabled;

      常用的方法:截图告诉用户,应该怎么打开授权
      

    2.开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)

      

    说明:这里的定位服务是基于网络的。通常定位服务可以是基于GPS、基站或者是网络的。

  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/seth-chen/p/4398196.html
Copyright © 2011-2022 走看看