Commit 5035c0b4 by Lukas Kurz Committed by GitHub

Fix ERROR_ALREADY_REQUESTING_PERMISSIONS on iOS after requesting locationAlways (#800)

* trigger callback using notification center

* bump version of permission_handler_apple

* make receiveActivityNotification private
parent 4c5ae3f9
......@@ -5,4 +5,5 @@
# Name/Organization <email address>
Baseflow <hello@baseflow.com>
Maurits van Beusekom <maurits@baseflow.com>
\ No newline at end of file
Maurits van Beusekom <maurits@baseflow.com>
Lukas Kurz <me@lukaskurz.com>
## 9.0.3
* Ensures a request for `locationAlways` permission returns a result unblocking the permission request and preventing the `ERROR_ALREADY_REQUESTING_PERMISSIONS` error for subsequent permission request.
## 9.0.2
* Moves Apple implementation into its own package.
\ No newline at end of file
......@@ -7,6 +7,10 @@
#if PERMISSION_LOCATION
@interface LocationPermissionStrategy ()
- (void) receiveActivityNotification:(NSNotification *)notification;
@end
@implementation LocationPermissionStrategy {
CLLocationManager *_locationManager;
PermissionStatusHandler _permissionStatusHandler;
......@@ -53,6 +57,7 @@
}
} else if (permission == PermissionGroupLocationAlways) {
if ([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"] != nil) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveActivityNotification:) name:UIApplicationDidBecomeActiveNotification object:nil];
[_locationManager requestAlwaysAuthorization];
} else {
[[NSException exceptionWithName:NSInternalInconsistencyException reason:@"To use location in iOS8 you need to define NSLocationAlwaysUsageDescription in the app bundle's Info.plist file" userInfo:nil] raise];
......@@ -66,6 +71,22 @@
}
}
- (void) receiveActivityNotification:(NSNotification *) notification {
CLAuthorizationStatus status;
if(@available(iOS 14.0, *)){
status = _locationManager.authorizationStatus;
} else {
status = [CLLocationManager authorizationStatus];
}
if ((_requestedPermission == PermissionGroupLocationAlways && status != kCLAuthorizationStatusAuthorizedAlways)) {
PermissionStatus permissionStatus = [LocationPermissionStrategy determinePermissionStatus:_requestedPermission authorizationStatus:status];
_permissionStatusHandler(permissionStatus);
}
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
}
// {WARNING}
// This is called when the location manager is first initialized and raises the following situations:
// 1. When we first request [PermissionGroupLocationWhenInUse] and then [PermissionGroupLocationAlways]
......
name: permission_handler_apple
description: Permission plugin for Flutter. This plugin provides the iOS API to request and check permissions.
version: 9.0.2
version: 9.0.3
homepage: https://github.com/baseflow/flutter-permission-handler
environment:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment