IOS CoreLocation中CLLocationManager類的基本使用
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
/**
iOS8以後, 要定位, 必須使用位置管理器(授權), 使用 Strong 屬性, 保證不被釋放
*/
@property (nonatomic, strong) CLLocationManager *locationManager;
@end
@implementation ViewController
/**
如果定位方法不走
1. 沒有配置 plist 鍵值
2. 模擬器 bug
3. 沒有使用 strong 的屬性
*/
- (void)viewDidLoad {
[super viewDidLoad];
//想要使用定位, 必須使用CLLocationManager
//1. 建立位置管理器
self.locationManager = [CLLocationManager new];
//2. 請求使用者授權(iOS8以後才有) 同時配置 plist 列表
//使用者使用時授權 大部分的應用應該使用此種授權方式
// 判斷可以使用巨集定義(獲取系統版本號) / respondsToSelector
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
/*
2. 請求使用者授權 --> 從iOS8開始, 必須在程式中請求使用者授權, 除了寫程式碼, 還要配置plist列表的鍵值
如果要適配iOS7, 一定要加if判斷, 因為低版本的SDK沒有授權方法
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { }
1. 如果要授權, 從iOS8開始, 必須在程式中請求使用者授權, 除了寫程式碼, 還要配置plist列表的鍵值
2. 授權方式 -->requestWhenInUseAuthorization 當使用者使用的使用授權
-->requestAlwaysAuthorization 永久授權方法
3. 一定要記得授權方法和plist列表匹配 (when / always)
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
4. 如果2個方法都寫, 會出現2此授權的情況 (第一次會走第一個方法, 第二次會走第二個方法 --> 一般使用1個方法即可
5. 大部分的程式之使用 "使用期間" 這個授權即可. 如果說列表出出現了3個, 說明兩個授權方法寫了
6. plist的Value 可以不寫, 寫上是為了提示使用者, 當前程式會在哪些地方使用定位. 建議寫上, 提高使用者開啟的機率
)
*/
if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]){
//當使用者使用的使用授權 --> 能看見APP介面的時候就是使用期間
[self.mgr requestWhenInUseAuthorization];
//永久授權方法 --> 鎖屏 / 退出後臺
// [self.mgr requestAlwaysAuthorization];
}
/**
iOS9新特性 --> 臨時獲取後臺定位許可權
*/
//allowsBackgroundLocationUpdates 如果實現了此方法, 還需要配置plist列表
//一定注意適配版本, 要加iOS9判斷
if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
self.mgr.allowsBackgroundLocationUpdates = YES;
}
//3. 設定代理 --> 獲取使用者位置
self.mgr.delegate = self;
//4. 呼叫開始定位方法
[self.mgr startUpdatingLocation];
// 比較兩個位置之前的距離
// 北京和西安的距離
// 建立一個位置物件, 最少只需要兩個值, 經緯度
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:40 longitude:116];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:34.27 longitude:108.93];
// 比較的是直線距離
CLLocationDistance distance = [location1 distanceFromLocation:location2];
NSLog(@"distance: %f",distance / 1000);
}
#pragma mark 代理方法
/** 當完成位置更新的時候呼叫 --> 次方法會頻繁呼叫*/
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
CLLocation *location = locations.lastObject;
//NSLog(@"locations: %@",location);
//5. 停止定位
//[self.mgr stopUpdatingLocation];
**/
//3. 設定代理, 來獲取資料
self.locationManager.delegate = self;
//4. 開始定位
[self.locationManager startUpdatingLocation];
/**
為了省電, 所有要對持續定位 app 進行優化
*/
//5. 距離篩選器 (當使用者發生一定位置的改變時, 再去呼叫代理方法, 以此實現省電)
// 值: 多少米 譬如:設定10, 就代表使用者位置發生10米以上的偏移時, 才去定位
self.locationManager.distanceFilter = 10;
//6. 設定精確度 (減少為衛星之間的計算, 以此實現省電)
// 定位的方式: GPS 北斗 基站定位 WiFi 定位
// iPhone開啟定位: GPS 跟24顆衛星進行通訊
//desired: 期望
//Accurac: 精準度
//iOS9以前預設kCLLocationAccuracyBest
// self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
NSLog(@"self.%zd",self.locationManager.desiredAccuracy);
}
/**
當使用者更新位置的時候呼叫此方法 頻繁呼叫, 非常耗電
*/
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
//CLLocation 位置物件 --> 經緯度
//CLLocationCoordinate2D coordinate 經緯度
//CLLocationDegrees latitude 緯度
//CLLocationDegrees longitude 經度
CLLocation *location = locations.firstObject;
NSLog(@"latitude: %f,longitude: %f",location.coordinate.latitude, location.coordinate.longitude);
}
@end
CLLocation
- 包括幾個重要的屬性:
- coordinate中包含經度、維度兩個屬性
- 重要的方法distanceFromLocation 計算該點與本點之間的直線距離
//CLLocation : 位置物件, 最核心的就是經緯度
//CLLocationCoordinate2D coordinate : 2D位置座標 –> 經緯度//CLLocationDegrees latitude; –> 緯度
//CLLocationDegrees longitude; –> 經度
相關文章
- iOS 鑰匙串的基本使用iOS
- Java中的基本型別包裝類 Integer 類該怎麼使用?Java型別
- CoreLocation框架詳細解析框架
- iOS開發之使用Git的基本使用(二)iOSGit
- iOS開發之使用Git的基本使用(一)iOSGit
- Java中Integer類的基本方法Java
- iOS CocoaPods簡介及基本使用iOS
- iOS開發-WKWebView的介紹與基本使用iOSWebView
- iOS開發- UILabel的基本介紹與使用iOSUI
- iOS-CLLocationManager請求獲取使用者定位時,是否要先判斷使用者之前有沒有同意過?iOS
- PHPUnit 中 Mockery 的基本使用PHPMock
- iOS開發-列表檢視的基本介紹與使用iOS
- sqlalchemy在python中的使用(基本使用)一SQLPython
- JAVA API:ArrayList(泛型類)基本使用JavaAPI泛型
- Protocol Buffers 在 iOS 中的使用ProtocoliOS
- iOS中優雅的使用iconfontiOS
- iOS 元件化開發(一):遠端私有庫的基本使用iOS元件化
- python中greenlet基本使用Python
- Java中的Reference類使用Java
- commons-lang包常用工具類的基本使用
- python中calss(類)的使用,類的教程,類中的函式怎麼呼叫。Python函式
- 類與類之間的基本關係
- 淺談 Dart 類與類的基本方法Dart
- JavaScript 中陣列 sort() 方法的基本使用JavaScript陣列
- iOS開發-檢視控制器UINavigationController的介紹與基本使用iOSUINavigationController
- iOS UIView基本動畫iOSUIView動畫
- iOS block巢狀block中weakify的使用iOSBloC巢狀
- 關於iOS開發中copy的使用iOS
- iOS使用Shell指令碼批量修改類名稱iOS指令碼
- Java裡的Character類的基本用法Java
- 資料庫連線池_druid基本使用&工具類資料庫UI
- 執行緒和程式基礎以及多執行緒的基本使用(iOS)執行緒iOS
- iOS開發·runtime原理與實踐: 基本知識篇(類,超類,元類,super_class,isa,物件,方法,SEL,IMP)iOS物件
- java中Scanner類使用Java
- iOS探索 類的結構分析iOS
- mongoose的基本使用Go
- Vagrant 的基本使用
- Vuex的基本使用Vue
- JSCore的基本使用JS