一、地圖的簡介 在移動互聯網時代,移動app能解決用戶的很多生活瑣事,比如 導航:去任意陌生的地方 周邊:找餐館、找酒店、找銀行、找電影院 手機軟體:微信搖一搖、QQ附近的人、微博、支付寶等 在上述應用中,都用到了地圖和定位功能,在iOS開發中,要想加入這兩大功能,必須基於兩個框架進行開發 MapK ...
一、地圖的簡介
在移動互聯網時代,移動app能解決用戶的很多生活瑣事,比如
導航:去任意陌生的地方
周邊:找餐館、找酒店、找銀行、找電影院
手機軟體:微信搖一搖、QQ附近的人、微博、支付寶等
在上述應用中,都用到了地圖和定位功能,在iOS開發中,要想加入這兩大功能,必須基於兩個框架進行開發
MapKit :用於地圖展示
CoreLocation :用於地理定位
二、地圖定位(CoreLocation框架,地理編碼與反地理編碼)
1、CoreLocation框架的使用
- 導入框架 (iOS5之後不再需要)
- 導入頭文件
#import <CoreLocation/CoreLocation.h>
- CoreLocation框架使用須知
CoreLocation 框架中所有數據類型的首碼都是CL
CoreLocation 中使用 CLLocationManager 對象來做用戶定位
2、CLLocationManager的常用操作(詳細使用說明見註釋)
// 開始用戶定位 - (void)startUpdatingLocation; // 停止用戶定位 - (void) stopUpdatingLocation; // 每隔多少米定位一次 @property(assign, nonatomic) CLLocationDistance distanceFilter; // 定位精確度(越精確就越耗電) @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy; // 當調用了startUpdatingLocation方法後,就開始不斷地定位用戶的位置,中途會頻繁地調用下麵的代理方法 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations; // 參數locations中的元素對象是CLLocation對象,是一系列的位置信息 // 當定位失敗的時候,會調用下麵的代理方法 - (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(nullable CLRegion *)region withError:(NSError *)error;
CLLocationAccuracy 是一個枚舉值
/* 最佳導航 kCLLocationAccuracyBestForNavigation 最精準 kCLLocationAccuracyBest; 10米 kCLLocationAccuracyNearestTenMeters; 百米 kCLLocationAccuracyHundredMeters; 千米 kCLLocationAccuracyKilometer; 3千米 kCLLocationAccuracyThreeKilometers; */
3、CLLocation
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個位置(CLLocation)之間的距離 - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
4、CLLocationCoordinate2D
CLLocationCoordinate2D 是一個用來表示經緯度的結構體,定義如下
typedef struct { CLLocationDegrees latitude; // 緯度 CLLocationDegrees longitude; // 經度 } CLLocationCoordinate2D;
一般用 CLLocationCoordinate2DMake 函數來創建 CLLocationCoordinate2D
5、實現定位的步驟
- 第一步:初始化定位管理器
self.manager = [[CLLocationManager alloc] init];
- 第二步:進行隱私的判斷和授權
1> 進行定位服務是否開啟的判斷
若 locationServicesEnabled 為 NO,就跳轉到隱私界面進行設置
2> 進行版本判斷(iOS8.0前後的定位方式不一樣)獲取版本數:[[[UIDevice currentDevice] systemVersion] integerValue]
3> iOS8.0之後授權的操作
① 判斷授權狀態:authorizationStatus
五種狀態枚舉值
kCLAuthorizationStatusNotDetermined: 用戶尚未做出決定是否啟用定位服務
kCLAuthorizationStatusRestricted: 沒有獲得用戶授權使用定位服務,可能用戶沒有自己禁止訪問授權
kCLAuthorizationStatusDenied:用戶已經明確禁止應用使用定位服務或者當前系統定位服務處於關閉狀態
kCLAuthorizationStatusAuthorizedAlways: 應用獲得授權可以一直使用定位服務,即使應用不在使用狀態(常用)
kCLAuthorizationStatusAuthorizedWhenInUse: 使用此應用過程中允許訪問定位服務(常用)
② 在授權請求之前需要在infoPlist文件中設置 NSLocationUsageDescription 允許定位內容
authorizationStatus 為 kCLAuthorizationStatusAuthorizedWhenInUse 時使用NSLocationWhenInUseUsageDescription 進行設置
authorizationStatus 為 kCLAuthorizationStatusAuthorizedAlways 時使用 NSLocationAlwaysUsageDescription 進行設置