Location Permission Popup Not Appearing in SwiftUI App

Hello everyone,

I'm working on a SwiftUI app that requires location services, and I've implemented a LocationManager class to handle location updates and permissions. However, I'm facing an issue where the location permission popup does not appear when the app is launched.

Here is my current implementation:

LocationManager.swift:

import CoreLocation
import SwiftUI

class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
    private let locationManager = CLLocationManager()
    
    @Published var userLocation: CLLocation?
    @Published var isAuthorized = false
    @Published var authorizationStatus: CLAuthorizationStatus = .notDetermined
    
    override init() {
        super.init()
        locationManager.delegate = self
        checkAuthorizationStatus()
    }
    
    func startLocationUpdates() {
        locationManager.startUpdatingLocation()
    }
    
    func stopLocationUpdates() {
        locationManager.stopUpdatingLocation()
    }
    
    func requestLocationAuthorization() {
        print("Requesting location authorization")
        DispatchQueue.main.async {
            self.locationManager.requestWhenInUseAuthorization()
        }
    }
    
    private func checkAuthorizationStatus() {
        print("Checking authorization status")
        authorizationStatus = locationManager.authorizationStatus
        print("Initial authorization status: \(authorizationStatus.rawValue)")
        handleAuthorizationStatus(authorizationStatus)
    }
    
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        print("Authorization status changed")
        authorizationStatus = manager.authorizationStatus
        print("New authorization status: \(authorizationStatus.rawValue)")
        handleAuthorizationStatus(authorizationStatus)
    }
    
    private func handleAuthorizationStatus(_ status: CLAuthorizationStatus) {
        switch status {
        case .authorizedAlways, .authorizedWhenInUse:
            DispatchQueue.main.async {
                self.isAuthorized = true
                self.startLocationUpdates()
            }
        case .notDetermined:
            requestLocationAuthorization()
        case .denied, .restricted:
            DispatchQueue.main.async {
                self.isAuthorized = false
                self.stopLocationUpdates()
                print("Location access denied or restricted")
            }
        @unknown default:
            DispatchQueue.main.async {
                self.isAuthorized = false
                self.stopLocationUpdates()
            }
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        DispatchQueue.main.async {
            self.userLocation = locations.last
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Location manager error: \(error.localizedDescription)")
    }
}

MapzinApp.swift:

@main
struct MapzinApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    @StateObject private var locationManager = LocationManager()
    
    var body: some Scene {
        WindowGroup {
            Group {
                if locationManager.authorizationStatus == .notDetermined {
                    Text("Determining location authorization status...")
                } else if locationManager.isAuthorized {
                    CoordinatorView()
                        .environmentObject(locationManager)
                } else {
                    Text("Location access is required to use this app. Please enable it in Settings.")
                }
            }
        }
    }
}

Log input:

  • Checking authorization status
  • Initial authorization status: 0
  • Requesting location authorization
  • Authorization status changed
  • New authorization status: 0
  • Requesting location authorization

Despite calling requestWhenInUseAuthorization() when the authorization status is .notDetermined, the permission popup never appears. Here are the specific steps I have taken:

Checked the Info.plist to ensure the necessary keys for location usage are present: NSLocationWhenInUseUsageDescription NSLocationAlwaysUsageDescription NSLocationAlwaysAndWhenInUseUsageDescription Verified that the app's target settings include location services capabilities. Tested on a real device to ensure it's not a simulator issue. I'm not sure what I might be missing. Any advice or suggestions to resolve this issue would be greatly appreciated. Thank you!

Answered by Engineer in 792490022

In our experience, almost every time this issue occurs, it is due to not having the correct location permission strings in the build.

I would suggest starting with checking that the NSLocation... strings are all there and correctly spelled.

And also, The Info.plist file these are in, is indeed being built with the app. In your project you can select "Build Settings" tab. Search for "info. plist file" field under Packaging section. And make sure the target Info.plist file listed there is the one with the correct NSLocation... strings

Accepted Answer

In our experience, almost every time this issue occurs, it is due to not having the correct location permission strings in the build.

I would suggest starting with checking that the NSLocation... strings are all there and correctly spelled.

And also, The Info.plist file these are in, is indeed being built with the app. In your project you can select "Build Settings" tab. Search for "info. plist file" field under Packaging section. And make sure the target Info.plist file listed there is the one with the correct NSLocation... strings

Location Permission Popup Not Appearing in SwiftUI App
 
 
Q