mop-flutter-sdk/ios/Classes/FinAppletExt/ExtensionApi/Location/FATExt_LocationUpdateManager.m

201 lines
7.8 KiB
Dart
Raw Permalink Normal View History

2023-08-02 19:36:40 +08:00
//
// FATExt_LocationUpdateManager.m
// FinAppletExt
//
// Created by 王兆耀 on 2022/11/6.
//
#import "FATExt_LocationUpdateManager.h"
#import <FinApplet/FinApplet.h>
#import "FATWGS84ConvertToGCJ02.h"
#import <FinApplet/FinApplet.h>
static FATExt_LocationUpdateManager *instance = nil;
NSString *const FATExtAppletUpdateBackgroudPermissions = @"FATAppletUpdateBackgroudPermissions";
@interface FATExt_LocationUpdateManager ()<CLLocationManagerDelegate>
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) void (^success)(NSDictionary<NSString *, id> *_Nonnull);
@property (nonatomic, copy) void (^failure)(NSDictionary *_Nullable);
@property (nonatomic, copy) void (^cancel)(NSDictionary *_Nullable);
@end
@implementation FATExt_LocationUpdateManager
+ (instancetype)sharedManager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[[self class] 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) {
//小程序关闭通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appletClose:) name:FATAppletDestroyNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(permissionsUpdate:) name:FATExtAppletUpdateBackgroudPermissions object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appletEnterBackground:) name:FATAppletEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidForeground:) name:FATAppletForegroundNotification object:nil];
}
return self;
}
#pragma
- (void)appletClose:(NSNotification *)notification {
NSDictionary *dic = notification.userInfo;
NSString *appletId = [dic objectForKey:@"appletId"];
// 关闭小程序时,需要停止获取定位。
if (appletId && [appletId isEqualToString:self.appletId] && self.locationIsInit) {
[self stopLocationUpdate];
}
}
- (void)permissionsUpdate:(NSNotification *)notification {
NSDictionary *dic = notification.userInfo;
NSInteger type = [[dic objectForKey:@"type"] integerValue];
if (type == 0 ) {
[self stopLocationUpdate];
}
if (_locationManager.allowsBackgroundLocationUpdates && self.locationIsInit) {
if (type == 1) {
[self stopLocationUpdate];
}
}
}
- (void)appletEnterBackground:(NSNotification *)notification {
if (!_locationManager.allowsBackgroundLocationUpdates && self.locationIsInit) {
[_locationManager stopUpdatingLocation];
}
}
- (void)appDidForeground:(NSNotification *)notification {
if (!_locationManager.allowsBackgroundLocationUpdates && self.locationIsInit) {
if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways)) {
[_locationManager startUpdatingLocation];
}
}
}
- (void)checkLocationState {
if (self.locationIsInit) {
// 胶囊按钮
UIViewController *vc = [[UIApplication sharedApplication] fat_topViewController];
UINavigationController<FATCapsuleViewProtocol> *nav = (UINavigationController<FATCapsuleViewProtocol> *)vc.navigationController;
if ([nav respondsToSelector:@selector(controlCapsuleStateButton:state:animate:)]) {
[nav controlCapsuleStateButton:NO state:FATCapsuleButtonStateLocation animate:YES];
}
}
}
- (void)startLocationUpdateType:(NSString *)type isAllowsBackgroundLocationUpdates:(BOOL)result withAppId:(NSString *)appId Success:(void (^)(NSDictionary<NSString *, id> *successResult))success
failure:(void (^)(NSDictionary *failResult))failure
cancel:(void (^)(NSDictionary *cancelResult))cancel {
// 如果已经初始化了,并且参数一致,就终止
if (self.locationIsInit && _locationManager.allowsBackgroundLocationUpdates == result) {
return;
}
//定位功能可用
_locationManager = [[FATExtLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
_locationManager.allowsBackgroundLocationUpdates = result;
_locationManager.pausesLocationUpdatesAutomatically = YES;
[_locationManager requestWhenInUseAuthorization];
self.type = type;
self.locationIsInit = YES;
if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways)) {
[self onLocationUpdate];
}
self.appletId = appId;
self.success = success;
self.failure = failure;
}
- (void)onLocationUpdate {
[_locationManager startUpdatingLocation];
}
- (void)stopLocationUpdate {
[_locationManager stopUpdatingLocation];
if (self.context) {
[self.context sendResultEvent:0 eventName:@"offLocationChange" eventParams:@{} extParams:nil];
}
self.appletId = @"";
self.locationIsInit = NO;
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation *newLocation = [locations objectAtIndex:0];
// 把默认值改为gcj02
NSString *typeString = @"gcj02";
CLLocationCoordinate2D coord = [FATWGS84ConvertToGCJ02ForAMapView transformFromWGSToGCJ:[newLocation coordinate]];
newLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
if ([self.type isEqualToString:@"wgs84"]) {
CLLocationCoordinate2D coord = [FATWGS84ConvertToGCJ02ForAMapView transformFromGCJToWGS:[newLocation coordinate]];
newLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
typeString = @"wgs84";
}
CLLocationCoordinate2D coordinate = newLocation.coordinate;
NSDictionary *params = @{@"altitude" : @(newLocation.altitude),
@"latitude" : @(coordinate.latitude),
@"longitude" : @(coordinate.longitude),
@"speed" : @(newLocation.speed),
@"accuracy" : @(newLocation.horizontalAccuracy),
@"type" : typeString,
@"verticalAccuracy" : @(newLocation.verticalAccuracy),
@"horizontalAccuracy" : @(newLocation.horizontalAccuracy)
};
if (self.context) {
[self.context sendResultEvent:0 eventName:@"onLocationChange" eventParams:params extParams:nil];
}
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if (self.context) {
[self.context sendResultEvent:0 eventName:@"onLocationChangeError" eventParams:@{} extParams:nil];
}
[self stopLocationUpdate];
if (self.failure) {
self.failure(@{});
}
}
//- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
// if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) {
// [self onLocationUpdate];
// if (self.success) {
// self.success(@{});
// }
// } else {
// if (self.failure) {
// self.failure(@{@"errMsg" : @"system permission denied"});
// }
// [self stopLocationUpdate];
// }
//}
@end