137 lines
4.8 KiB
Dart
137 lines
4.8 KiB
Dart
|
//
|
|||
|
// FATExt_locationAuthManager.m
|
|||
|
// FinAppletExt
|
|||
|
//
|
|||
|
// Created by 王兆耀 on 2022/12/24.
|
|||
|
//
|
|||
|
|
|||
|
#import "FATExt_locationAuthManager.h"
|
|||
|
#import <CoreLocation/CoreLocation.h>
|
|||
|
|
|||
|
|
|||
|
@interface FATExt_locationAuthManager () <CLLocationManagerDelegate>
|
|||
|
|
|||
|
@property (nonatomic, strong) CLLocationManager *locationManager;
|
|||
|
|
|||
|
@property (nonatomic, strong) NSMutableArray *locationAuthCompleteArray;
|
|||
|
|
|||
|
@property (nonatomic, strong) NSMutableArray<FATAppletInfo*> *appletInfoArray;
|
|||
|
@property (nonatomic, strong) NSMutableDictionary *authTypeDic; //key是小程序Id value是权限类型,用来区分后台定位和正常位置权限
|
|||
|
@end
|
|||
|
|
|||
|
static FATExt_locationAuthManager *instance = nil;
|
|||
|
|
|||
|
@implementation FATExt_locationAuthManager
|
|||
|
|
|||
|
+ (instancetype)shareInstance {
|
|||
|
static dispatch_once_t onceToken;
|
|||
|
dispatch_once(&onceToken, ^{
|
|||
|
instance = [[FATExt_locationAuthManager alloc] init];
|
|||
|
});
|
|||
|
|
|||
|
return instance;
|
|||
|
}
|
|||
|
|
|||
|
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
|
|||
|
static dispatch_once_t onceToken;
|
|||
|
dispatch_once(&onceToken, ^{
|
|||
|
instance = [super allocWithZone:zone];
|
|||
|
});
|
|||
|
|
|||
|
return instance;
|
|||
|
}
|
|||
|
|
|||
|
- (instancetype)init {
|
|||
|
self = [super init];
|
|||
|
if (self) {
|
|||
|
[self p_init];
|
|||
|
}
|
|||
|
return self;
|
|||
|
}
|
|||
|
|
|||
|
- (void)p_init {
|
|||
|
_locationAuthCompleteArray = [NSMutableArray array];
|
|||
|
_appletInfoArray = [[NSMutableArray alloc]init];
|
|||
|
_authTypeDic = [[NSMutableDictionary alloc]init];
|
|||
|
}
|
|||
|
|
|||
|
- (void)fat_requestAppletLocationAuthorize:(FATAppletInfo *)appletInfo isBackground:(BOOL)isBackground withComplete:(void (^)(BOOL status))complete {
|
|||
|
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
|
|||
|
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
|
|||
|
[self notifyApp:appletInfo authType:isBackground ? FATAuthorizationTypeLocationBackground : FATAuthorizationTypeLocation authResult:FATAuthorizationStatusAuthorized];
|
|||
|
if (complete) {
|
|||
|
complete(YES);
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (status != kCLAuthorizationStatusNotDetermined) {
|
|||
|
[self notifyApp:appletInfo authType:isBackground ? FATAuthorizationTypeLocationBackground : FATAuthorizationTypeLocation authResult:FATAuthorizationStatusDenied];
|
|||
|
if (complete) {
|
|||
|
complete(NO);
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|||
|
[self.locationAuthCompleteArray addObject:complete];
|
|||
|
if (appletInfo) {
|
|||
|
[self.appletInfoArray addObject:appletInfo];
|
|||
|
if (appletInfo.appId) {
|
|||
|
[self.authTypeDic setValue:isBackground ? @(FATAuthorizationTypeLocationBackground) : @(FATAuthorizationTypeLocation) forKey:appletInfo.appId];
|
|||
|
}
|
|||
|
}
|
|||
|
self.locationManager = [[CLLocationManager alloc] init];
|
|||
|
self.locationManager.delegate = self;
|
|||
|
[self.locationManager requestWhenInUseAuthorization];
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
- (void)notifyApp:(FATAppletInfo *)appletInfo authType:(FATAuthorizationType)type authResult:(FATAuthorizationStatus)result {
|
|||
|
id<FATAppletAuthDelegate> delegate = [FATClient sharedClient].authDelegate;
|
|||
|
if (delegate && [delegate respondsToSelector:@selector(applet:didRequestAuth:withResult:)]) {
|
|||
|
[delegate applet:appletInfo didRequestAuth:type withResult:result];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
|
|||
|
|
|||
|
if (status == kCLAuthorizationStatusNotDetermined) {
|
|||
|
return;
|
|||
|
}
|
|||
|
for (FATAppletInfo *appInfo in self.appletInfoArray) {
|
|||
|
FATAuthorizationStatus authStatus = FATAuthorizationStatusDenied;
|
|||
|
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
|
|||
|
authStatus = FATAuthorizationStatusAuthorized;
|
|||
|
}
|
|||
|
NSNumber *authtype = [self.authTypeDic objectForKey:appInfo.appId];
|
|||
|
FATAuthorizationType type = FATAuthorizationTypeLocation;
|
|||
|
if (authtype) {
|
|||
|
type = [authtype integerValue];
|
|||
|
}
|
|||
|
[self notifyApp:appInfo authType:type authResult:authStatus];
|
|||
|
}
|
|||
|
[self.appletInfoArray removeAllObjects];
|
|||
|
[self.authTypeDic removeAllObjects];
|
|||
|
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
|
|||
|
for (int i = 0; i < self.locationAuthCompleteArray.count; i++) {
|
|||
|
void(^locationComplete)(BOOL status) = self.locationAuthCompleteArray[i];
|
|||
|
locationComplete(YES);
|
|||
|
}
|
|||
|
[self.locationAuthCompleteArray removeAllObjects];
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
for (int i = 0; i < self.locationAuthCompleteArray.count; i++) {
|
|||
|
void(^locationComplete)(BOOL status) = self.locationAuthCompleteArray[i];
|
|||
|
locationComplete(NO);
|
|||
|
}
|
|||
|
|
|||
|
[self.locationAuthCompleteArray removeAllObjects];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
@end
|
|||
|
|