--------------------------------------------------------
CLLocationManager 定位管理者
CLLocation 代表位置(經度/緯度/高度/速度/路線等)
CLHeading 代表移動方向
CLRegion 代表一個區域
>CLCircularRegion 圓形區域
>CLBeaconRegion 藍牙信號區域
// 返回定位服務是否可用
[CLLocationManager locationServicesEnabled];
// 後的系版本號
[UIDevice currentDevice].systemVersion.floatValue >= 8.0
// 跳轉到手機設置頁面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
// 配置info.plist
NSLocationWhenInUseUsageDescription // iOS 8.0 使用前臺定位服務
NSLocationAlwaysUsageDescription // iOS 8.0 使用前後臺都會定位
// Title:@"定位系統不可用" message:@"請進入設置頁面 > 隱私 > 定位服務 > 打開定位服務 > 選擇當前應用 > 勾上'使用應用期間'.設置完畢後請重新啓動App運行."
--------------------------------------------------------
// 設置是否可以暫停定位來節省電池電量, 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; // 設備移動速度 單位是米/秒, 適用於行車速度而不太適用於不行
--------------------------------------------------------
CLAuthorizationStatus
// 用戶尚未決定授權權限
kCLAuthorizationStatusNotDetermined
// 無法使用定位服務,該狀態用戶無法改變
kCLAuthorizationStatusRestricted
// 用戶拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態
kCLAuthorizationStatusDenied
// 已經授權(廢棄)
kCLAuthorizationStatusAuthorized
// 用戶允許該程序無論何時都可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways
// 用戶同意程序在可見時使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
--------------------------------------------------------
注意:iOS9.0 可以單次請求用戶位置
- (void)requestLocation
// 成功調用,locations位置數組,元素按照時間排序
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
// 失敗調用
-(void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error
requestLocation 作用:
// 按照定位精確度從低到高進行排序,逐個進行定位。如果獲取到的位置不是精確度最高的那個,也會在定位超時後,通過代理告訴外界(必須實現代理的-locationManager:didFailWithError:方法)
不能與startUpdatingLocation方法同時使用
--------------------------------------------------------
// 計算兩個位置之間的距離, 單位是米
[newLocation distanceFromLocation:self.prevLocation];
--------------------------------------------------------
獲取方向信息不會提示用戶(不需要授權), 因爲不會泄露隱私
// [self.mgr startUpdatingHeading];
magneticHeading // 設備與磁北的相對角度
trueHeading // 設置與真北的相對角度, 必須和定位一起使用, iOS需要位置來計算真北
--------------------------------------------------------
// 錯誤:使用CoreLocation獲取地理位置信息,報錯
Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
解決方法:
1.確定模擬器(手機)已經聯網並且允許程序獲取地理位置
2.重置地理位置服務或者網絡服務
PS:如果是模擬器就果斷直接重置模擬器吧 IOS Simulator - Reset Content and Settings...
-----------------------------------
#pragma mark - 導航 MKDirections / MKDirectionsRequest
Demo: 根據起點與終點座標, 向Apple服務器請求路線規劃信息, 再繪製路線
1. 獲取起點與終點的地理座標
2. 創建 MKDirectionRequest , 配置起點與終點的 MapItem
3. 使用 MKDirection 進行路線規劃請求 ( MKRoute, MKRouteStep )
calculateDirectionsWithCompletionHandler
4. 將獲取到的路線信息繪製到地圖上. ( MKPolyLineRender )
// 渲染方法
[self.mapView addOverlay:toute.polyline];
// 設置顏色的代理方法
// 渲染路線
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
// 設置顏色
MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
renderer.lineWidth = 2.0;
renderer.strokeColor = [UIColor blueColor];
return renderer;
}