Files
OrderScheduling/Pods/DDMAMapKit_Private/DDMAMapKit_Private/Classes/DDMALocation/DDMALocationManager.m
T
2023-08-18 17:28:57 +08:00

136 lines
6.8 KiB
Objective-C

//
// DDMALocationManager.m
// DDMAMapKit_Private
// Created by DDIsFriend on 2023/2/24.
#import "DDMALocationManager.h"
#import <DDLogKit_Private/DDOCLog.h>
@interface DDMALocationManager ()<AMapLocationManagerDelegate>
@end
@implementation DDMALocationManager
// MARK: <Class Initialize>
+ (void)startWithAppKey:(nullable NSString *)appKey{
[[AMapServices sharedServices] setEnableHTTPS:YES];
[AMapServices sharedServices].apiKey = appKey;
}
+ (void)agreePrivacy{
[AMapLocationManager updatePrivacyShow:AMapPrivacyShowStatusDidShow privacyInfo:AMapPrivacyInfoStatusDidContain];
[AMapLocationManager updatePrivacyAgree:AMapPrivacyAgreeStatusDidAgree];
}
- (AMapLocationManager *)maLocationManager{
if (_maLocationManager == nil) {
_maLocationManager = [AMapLocationManager new];
_maLocationManager.delegate = self;
}
return _maLocationManager;
}
// MARK: <AMapLocationManagerDelegate>
- (void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager{
if ([self.delegate respondsToSelector:@selector(ddMALocationManager:doRequireLocationAuth:)]) {
[self.delegate ddMALocationManager:manager doRequireLocationAuth:locationManager];
}else{
[locationManager requestWhenInUseAuthorization];
}
}
- (void)amapLocationManager:(AMapLocationManager *)manager doRequireTemporaryFullAccuracyAuth:(CLLocationManager *)locationManager completion:(void (^)(NSError *))completion API_AVAILABLE(ios(14.0)){
if (locationManager.accuracyAuthorization == CLAccuracyAuthorizationReducedAccuracy) {
/// Every time you open the app and detect that the positioning accuracy is reduce, you need to apply for a temporary full accuracy.
[self ddMALocationManager:locationManager requestTemporaryFullAccuracyAuthorizationWithCompletion:^(NSError * _Nullable error) {
}];
}
}
- (void)amapLocationManager:(AMapLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status API_DEPRECATED("",ios(11.0 , 13.0)){
[self ddMACombineManager:manager locationManager:nil didChangeAuthorization:[CLLocationManager authorizationStatus] accuracyAuthorization:CLAccuracyAuthorizationFullAccuracy];
}
- (void)amapLocationManager:(AMapLocationManager *)manager locationManagerDidChangeAuthorization:(CLLocationManager*)locationManager API_AVAILABLE(ios(14.0)){
CLAccuracyAuthorization accuracyAuthorization = CLAccuracyAuthorizationFullAccuracy;
if (locationManager.accuracyAuthorization == CLAccuracyAuthorizationFullAccuracy) {
accuracyAuthorization = CLAccuracyAuthorizationFullAccuracy;
}else if (locationManager.accuracyAuthorization == CLAccuracyAuthorizationReducedAccuracy){
accuracyAuthorization = CLAccuracyAuthorizationReducedAccuracy;
/// When opening the app authorization location for the first time, a temporary promt is also required.
[self ddMALocationManager:locationManager requestTemporaryFullAccuracyAuthorizationWithCompletion:^(NSError * _Nullable error) {
}];
}
[self ddMACombineManager:manager locationManager:locationManager didChangeAuthorization:[locationManager authorizationStatus] accuracyAuthorization:accuracyAuthorization];
}
- (void)ddMALocationManager:(CLLocationManager *_Nullable)locationManager requestTemporaryFullAccuracyAuthorizationWithCompletion:(void(^)(NSError *_Nullable error))completion API_AVAILABLE(ios(14.0)) {
/// This is async.
[locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"FORCE_FULL_ACCURACY" completion:^(NSError * _Nullable error) {
// 授权定位下才能请求单次定位,不然会有性能问题
BOOL canBeLocated = (locationManager.authorizationStatus == kCLAuthorizationStatusAuthorizedAlways || locationManager.authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse);
if (canBeLocated && locationManager.accuracyAuthorization == CLAccuracyAuthorizationReducedAccuracy && self.forceFullAccuracy) {
[self ddMALocationManager:locationManager requestTemporaryFullAccuracyAuthorizationWithCompletion:nil];
}
}];
}
- (void)ddMACombineManager:(AMapLocationManager *)manager locationManager:(CLLocationManager *_Nullable)locationManager didChangeAuthorization:(CLAuthorizationStatus)authorizationStatus accuracyAuthorization:(CLAccuracyAuthorization)accuracyAuthorization{
switch (authorizationStatus) {
case kCLAuthorizationStatusNotDetermined:
DDLog("当前定位权限 - kCLAuthorizationStatusNotDetermined");
break;
case kCLAuthorizationStatusDenied:
DDLog("当前定位权限 - kCLAuthorizationStatusDenied");
break;
case kCLAuthorizationStatusRestricted:
DDLog("当前定位权限 - kCLAuthorizationStatusRestricted");
break;
case kCLAuthorizationStatusAuthorizedAlways:
DDLog("当前定位权限 - kCLAuthorizationStatusAuthorizedAlways");
break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
DDLog("当前定位权限 - kCLAuthorizationStatusAuthorizedWhenInUse");
break;
default:
break;
}
switch (accuracyAuthorization) {
case CLAccuracyAuthorizationFullAccuracy:
DDLog("当前精度 - CLAccuracyAuthorizationFullAccuracy");
break;
case CLAccuracyAuthorizationReducedAccuracy:
DDLog("当前精度 - CLAccuracyAuthorizationReducedAccuracy");
break;
default:
break;
}
if ([self.delegate respondsToSelector:@selector(ddMALocationManager:locationManager:didChangeAuthorization:accuracyAuthorization:)]){
[self.delegate ddMALocationManager:manager locationManager:locationManager didChangeAuthorization:authorizationStatus accuracyAuthorization:accuracyAuthorization];
}
}
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode{
if ([self.delegate respondsToSelector:@selector(ddMALocationManager:didUpdateLocation:reGeocode:)]) {
[self.delegate ddMALocationManager:manager didUpdateLocation:location reGeocode:reGeocode];
}
}
- (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error{
if ([self.delegate respondsToSelector:@selector(ddMALocationManager:didFailWithError:)]) {
[self.delegate ddMALocationManager:manager didFailWithError:error];
}
}
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateHeading:(CLHeading *)heading{
if ([self.delegate respondsToSelector:@selector(ddMALocationManager:didUpdateHeading:)]) {
[self.delegate ddMALocationManager:manager didUpdateHeading:heading];
}
}
@end