summaryrefslogtreecommitdiffstats
path: root/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm')
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm60
1 files changed, 41 insertions, 19 deletions
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm
index 07556ad8b9..4aa35f3920 100644
--- a/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm
@@ -73,41 +73,45 @@ struct PermissionRequest
return Qt::PermissionStatus::Denied;
}
- switch ([self authorizationStatus]) {
+#if defined(Q_OS_VISIONOS)
+ if (permission.availability() == QLocationPermission::Always)
+ return Qt::PermissionStatus::Denied;
+#endif
+
+ auto status = [self authorizationStatus];
+ switch (status) {
case kCLAuthorizationStatusRestricted:
case kCLAuthorizationStatusDenied:
return Qt::PermissionStatus::Denied;
case kCLAuthorizationStatusNotDetermined:
return Qt::PermissionStatus::Undetermined;
+#if !defined(Q_OS_VISIONOS)
case kCLAuthorizationStatusAuthorizedAlways:
return Qt::PermissionStatus::Granted;
-#ifdef Q_OS_IOS
+#endif
+#if defined(Q_OS_IOS) || defined(Q_OS_VISIONOS)
case kCLAuthorizationStatusAuthorizedWhenInUse:
- if (permission.availability() == QLocationPermission::WhenInUse)
- return Qt::PermissionStatus::Granted;
- else
- return Qt::PermissionStatus::Denied; // FIXME: Verify
+ if (permission.availability() == QLocationPermission::Always)
+ return Qt::PermissionStatus::Denied;
+ return Qt::PermissionStatus::Granted;
#endif
}
- Q_UNREACHABLE();
+ qCWarning(lcPermissions) << "Unknown permission status" << status << "detected in" << self;
+ return Qt::PermissionStatus::Denied;
}
- (CLAuthorizationStatus)authorizationStatus
{
- if (self.manager) {
- if (@available(macOS 11, iOS 14, *))
- return self.manager.authorizationStatus;
- }
+ if (self.manager)
+ return self.manager.authorizationStatus;
return QT_IGNORE_DEPRECATIONS(CLLocationManager.authorizationStatus);
}
- (Qt::PermissionStatus)accuracyAuthorization:(QLocationPermission)permission
{
- auto status = CLAccuracyAuthorizationReducedAccuracy;
- if (@available(macOS 11, iOS 14, *))
- status = self.manager.accuracyAuthorization;
+ auto status = self.manager.accuracyAuthorization;
switch (status) {
case CLAccuracyAuthorizationFullAccuracy:
@@ -116,19 +120,24 @@ struct PermissionRequest
if (permission.accuracy() == QLocationPermission::Approximate)
return Qt::PermissionStatus::Granted;
else
- return Qt::PermissionStatus::Denied; // FIXME: Verify
+ return Qt::PermissionStatus::Denied;
}
- Q_UNREACHABLE();
+ qCWarning(lcPermissions) << "Unknown accuracy status" << status << "detected in" << self;
+ return Qt::PermissionStatus::Denied;
}
- (QStringList)usageDescriptionsFor:(QPermission)permission
{
+#if defined(Q_OS_MACOS)
+ return { "NSLocationUsageDescription" };
+#else // iOS 11 and above
QStringList usageDescriptions = { "NSLocationWhenInUseUsageDescription" };
const auto locationPermission = *permission.value<QLocationPermission>();
if (locationPermission.availability() == QLocationPermission::Always)
- usageDescriptions << "NSLocationAlwaysUsageDescription";
+ usageDescriptions << "NSLocationAlwaysAndWhenInUseUsageDescription";
return usageDescriptions;
+#endif
}
- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
@@ -171,19 +180,32 @@ struct PermissionRequest
}
break;
case QLocationPermission::Always:
+#if defined(Q_OS_VISIONOS)
+ [self deliverResult]; // Not supported
+#else
// The documentation specifies that requestAlwaysAuthorization can only
// be called when the current authorization status is either undetermined,
// or authorized when in use.
switch ([self authorizationStatus]) {
case kCLAuthorizationStatusNotDetermined:
+ [self.manager requestAlwaysAuthorization];
+ break;
#ifdef Q_OS_IOS
case kCLAuthorizationStatusAuthorizedWhenInUse:
+ // Unfortunately when asking for AlwaysAuthorization when in
+ // the WhenInUse state, to "upgrade" the permission, the iOS
+ // location system will not give us a callback if the user
+ // denies the request, leaving us hanging without a way to
+ // respond to the permission request.
+ qCWarning(lcLocationPermission) << "QLocationPermission::WhenInUse"
+ << "can not be upgraded to QLocationPermission::Always on iOS."
+ << "Please request QLocationPermission::Always directly.";
+ Q_FALLTHROUGH();
#endif
- [self.manager requestAlwaysAuthorization];
- break;
default:
[self deliverResult];
}
+#endif
break;
}
}