diff options
Diffstat (limited to 'src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm')
-rw-r--r-- | src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm | 60 |
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; } } |