This commit is contained in:
DDIsFriend
2023-08-18 17:28:57 +08:00
commit f0e8a1709d
4282 changed files with 192396 additions and 0 deletions
@@ -0,0 +1,42 @@
//
// DDMALocationManager.h
// DDMAMapKit_Private
// Created by DDIsFriend on 2023/2/24.
#import <Foundation/Foundation.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
NS_ASSUME_NONNULL_BEGIN
@protocol DDMALocationManagerDelegate <NSObject>
@optional
- (void)ddMALocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager;
- (void)ddMALocationManager:(AMapLocationManager *)manager locationManager:(CLLocationManager *_Nullable)locationManager didChangeAuthorization:(CLAuthorizationStatus)authorizationStatus accuracyAuthorization:(CLAccuracyAuthorization)accuracyAuthorization;
- (void)ddMALocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error;
- (void)ddMALocationManager:(AMapLocationManager *)manager didUpdateHeading:(CLHeading *)heading;
- (void)ddMALocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode;
@end
@interface DDMALocationManager : NSObject
// 请在使用该类前先设置appkey
+ (void)startWithAppKey:(nullable NSString *)appKey;
// 在创建该类实例前调用
+ (void)agreePrivacy;
@property (nonatomic, strong)AMapLocationManager *maLocationManager;
@property (nonatomic, weak)id<DDMALocationManagerDelegate> delegate;
@property (nonatomic, assign)BOOL forceFullAccuracy;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,135 @@
//
// 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