一、CLLocationManager介紹
在開始說CoreLocation之前我必須先來介紹一下CLLocationManager 因為定位服務使用的管理類就是它 下面先來說說CLLocationManager的常用操作和屬性:
開始用戶定位- (void)startUpdatingLocation;
停止用戶定位- (void) stopUpdatingLocation;
-
說明:當調用了startUpdatingLocation方法后,就開始不斷地定位用戶的位置,中途會頻繁地調用代理的下面方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
* 每隔多少米定位一次
@property(assign, nonatomic) CLLocationDistance distanceFilter;
定位精確度(越精確就越耗電)
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
##### 二、CLLocation的簡單介紹
說完CLLocationManager 那么我們繼續來介紹CLLocation,它使用來表示某個位置的地理信息,比如經緯度、海拔等等
* 經緯度
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
* 海拔
@property(readonly, nonatomic) CLLocationDistance altitude;
* 路線,航向(取值范圍是0.0° ~ 359.9°,0.0°代表真北方向)
@property(readonly, nonatomic) CLLocationDirection course;
* 行走速度(單位是m/s)
@property(readonly, nonatomic) CLLocationSpeed speed;
* 計算2個位置之間的距離
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法
##### 三、CLLocationCoordinate2D的簡單介紹
看上去這個類好像很高大上的樣子 2D都出來了感覺是不是跟3D也有關系呢 其實沒那么神秘 CLLocationCoordinate2D其實就是一個用來表示經緯度的結構體,定義如下
typedef struct {
CLLocationDegrees latitude; // 緯度
CLLocationDegrees longitude; // 經度
} CLLocationCoordinate2D;
一般用CLLocationCoordinate2DMake函數來創建 這個我想大家抖動的 OC中的結構體 幾乎都是使用XXXMake的方式來創建 但是有一個NSRange有點特殊 它是使用NSMakeRange的方式創建的 好了 好像有點扯遠了 那下面我就使用代碼來給大家演示一下
//
// ViewController.m
// 一次定位
//
// Created by 遠洋 on 16/1/15.
// Copyright ? 2016年 yuanyang.com. All rights reserved.
//
import "ViewController.h"
import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
//全局的位置管理對象manager
@property(nonatomic,strong)CLLocationManager *locationManager;
@end
@implementation ViewController
-
(void)viewDidLoad {
[super viewDidLoad];//實例化位置管理對象
CLLocationManager * locationManager = [[CLLocationManager alloc]init];//給全局賦值
self.locationManager = locationManager;//設置代理
locationManager.delegate = self;//設置當超過一定距離的時候 開啟定位
locationManager.distanceFilter = 100;//定位的精讀 例如100米的位置 以內就算定位出你的位置
// locationManager.desiredAccuracy = 100;//判斷設備是否是8.0以后
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// [locationManager requestAlwaysAuthorization];//設置一次授權 [locationManager requestWhenInUseAuthorization];
}
//設置永久授權
//開啟定位
[locationManager startUpdatingLocation];//比較兩個位置之間的直線距離
[self compareDistance];
}
pragma mark - /********比較兩個位置之間的直線距離*******/
-(void)compareDistance{
//獲取第一個點的位置
CLLocation * location1 = [[CLLocation alloc]initWithLatitude:40 longitude:119];
//第二個點的位置
CLLocation * location2 = [[CLLocation alloc]initWithLatitude:39 longitude:120];
//計算兩個點之間的直線距離 單位是米
CLLocationDistance distance = [location1 distanceFromLocation:location2];
NSLog(@"%lf",distance / 1000);
}
pragma mark - /********定位的代理方法*******/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"%@",locations);
[self.locationManager stopUpdatingLocation];
}
@end
注意點 :必須要特別注意的一點是 很多人 都會忘記用戶授權 這一步 或者是忘記 在info.plist文件中添加key值
* 判斷設備是否需要請求授權 8.0之后必須請求授權
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// [locationManager requestAlwaysAuthorization];
//設置一次授權
[locationManager requestWhenInUseAuthorization];
}
* 配置info.plist文件
