有些業(yè)務(wù)需要在 設(shè)備位置、方向變化時對應(yīng)處理。位置管理器精度高,位置、方向變化時可以分別監(jiān)控處理,地圖回調(diào)也可以監(jiān)控,但需要更精準(zhǔn)的服務(wù)時,還是選用位置管理器來。
/// pod 定位庫
pod 'AMapLocation', '~> 2.6.4' #高德定位SDK
/// 導(dǎo)入頭文件
#import <AMapLocationKit/AMapLocationKit.h>
/// 遵循協(xié)議
AMapLocationManagerDelegate
/// 實例化位置管理器
@property (nonatomic, strong)AMapLocationManager *locationManager;
/// 配置key
[AMapServices sharedServices].apiKey = @"xxx";
- (AMapLocationManager *)locationManager {
? ? if (!_locationManager) {
? ? ? ? _locationManager = [[AMapLocationManager alloc] init];
? ? ? ? _locationManager.delegate = self;
? ? ? ? _locationManager.desiredAccuracy = kCLLocationAccuracyBest;? ? ? ? ? // Desired accuracy
? ? }
? ? return _locationManager;
}
- (void)amapLocationManager:(AMapLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
}
- (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error {
}
////// 先來定位
/**
*? @brief 單次定位。如果當(dāng)前正在連續(xù)定位,調(diào)用此方法將會失敗,返回NO。\n該方法將會根據(jù)設(shè)定的 desiredAccuracy 去獲取定位信息。如果獲取的定位信息精確度低于 desiredAccuracy ,將會持續(xù)的等待定位信息,直到超時后通過completionBlock返回精度最高的定位信息。\n可以通過 stopUpdatingLocation 方法去取消正在進(jìn)行的單次定位請求。
*? @param withReGeocode 是否帶有逆地理信息(獲取逆地理信息需要聯(lián)網(wǎng))
*? @param completionBlock 單次定位完成后的Block
*? @return 是否成功添加單次定位Request
*/
- (BOOL)requestLocationWithReGeocode:(BOOL)withReGeocode completionBlock:(AMapLocatingCompletionBlock)completionBlock;
**
*? @brief 開始連續(xù)定位。調(diào)用此方法會cancel掉所有的單次定位請求。
*/
- (void)startUpdatingLocation;
/**
*? @brief 停止連續(xù)定位。調(diào)用此方法會cancel掉所有的單次定位請求,可以用來取消單次定位。
*/
- (void)stopUpdatingLocation;
/**
*? @brief 連續(xù)定位回調(diào)函數(shù).注意:如果實現(xiàn)了本方法,則定位信息不會通過amapLocationManager:didUpdateLocation:方法回調(diào)。
*? @param manager 定位 AMapLocationManager 類。
*? @param location 定位結(jié)果。
*? @param reGeocode 逆地理信息。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode;
////// 設(shè)備方向
- (void)startUpdatingHeading;
- (void)stopUpdatingHeading;
/**
*? @brief 設(shè)備方向改變時回調(diào)函數(shù)
*? @param manager 定位 AMapLocationManager 類。
*? @param newHeading 設(shè)備朝向。
*/
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
? ? CGFloat heading? = -1.0f * M_PI * newHeading.magneticHeading / 180.0f;
? ? if (self.mapView.userLocation) {
? ? ? ? [self.mapView viewForAnnotation:self.mapView.userLocation].transform = CGAffineTransformMakeRotation(-heading);/// 這里跟隨設(shè)備朝向改變
? ? }
}
////// MapView 位置方向
如果不用更高精度的位置管理器,那就根據(jù)AmapView的位置回調(diào)來處理相關(guān)業(yè)務(wù),一般對精度要求不高的都夠用。設(shè)備位置、方向
/**
* @brief 位置或者設(shè)備方向更新后,會調(diào)用此函數(shù)
* @param mapView 地圖View
* @param userLocation 用戶定位信息(包括位置與設(shè)備方向等數(shù)據(jù))
* @param updatingLocation 標(biāo)示是否是location數(shù)據(jù)更新, YES:location數(shù)據(jù)更新 NO:heading數(shù)據(jù)更新
*/
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation;
/**
*? @brief 當(dāng)plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription,并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined,會調(diào)用代理的此方法。
? ? 此方法實現(xiàn)調(diào)用后臺權(quán)限API即可( 該回調(diào)必須實現(xiàn) [locationManager requestAlwaysAuthorization] ); since 6.8.0
*? @param locationManager? 地圖的CLLocationManager。
*/
- (void)mapViewRequireLocationAuth:(CLLocationManager *)locationManager;
/**
* @brief 定位失敗后,會調(diào)用此函數(shù)
* @param mapView 地圖View
* @param error 錯誤號,參考CLError.h中定義的錯誤號
*/
- (void)mapView:(MAMapView *)mapView didFailToLocateUserWithError:(NSError *)error;