2.3 高德地圖定位、方向變化

有些業(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;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容