'iOS App clips with Mapbox - Request when in use

I've an issue with Mapbox requesting access "always" instead of only "when in use", which is a requirement for iOS AppClips.

My info.plist is only using "NSLocationWhenInUseUsageDescription"

I cannot find anything on Mapbox documentation about this and I'm a bit lost to be honest...

This is my ViewWrapper (I'm using SwiftUI):

import SwiftUI
import MapboxMaps
import CoreLocation

// Main view map
struct MapViewWrapper: UIViewControllerRepresentable {
    
    func makeUIViewController(context: Context) -> ViewController {
        return ViewController()
    }
    
    func updateUIViewController(_ uiViewController: ViewController, context: Context) {
        
    }
}

// Speed record map detail
struct MapViewWrapperShot: UIViewControllerRepresentable {
    
    var coordinates: CLLocationCoordinate2D
    var interactive: Bool
    
    func makeUIViewController(context: Context) -> ViewControllerShot {
        return ViewControllerShot(latitude: coordinates.latitude, longitude: coordinates.longitude, interactive: interactive)
    }
    
    func updateUIViewController(_ uiViewController: ViewControllerShot, context: Context) {
        
    }
}

public class MapColorScheme: UIViewController {
    
    internal var settings = Settings()
    
    enum mapColorMode {
        case light, dark, lightTrain, darkTrain
    }
    
    var isDark: Bool {
        switch traitCollection.userInterfaceStyle {
        case .light, .unspecified:
            return false
        case .dark:
            return true
        @unknown default:
            return false
        }
    }
    
    var mapColorScheme: mapColorMode {
        if isDark && !settings.hideTrainLine {
            return .darkTrain
        } else if isDark && settings.hideTrainLine {
            return .dark
        } else if !isDark && !settings.hideTrainLine {
            return .lightTrain
        } else if !isDark && settings.hideTrainLine {
            return .light
        } else {
            return .lightTrain
        }
    }

    var mapStyleURL: String {
        switch mapColorScheme {
        case .light:
            return ConstantsMapbox.light
        case .lightTrain:
            return ConstantsMapbox.lightRailways
        case .dark:
            return ConstantsMapbox.dark
        case .darkTrain:
            return ConstantsMapbox.darkRailways
        }
    }
}

public class ViewController: UIViewController {

    internal var mapView: MapView!
    internal var cameraLocationConsumer: CameraLocationConsumer!
    internal var mapColorScheme = MapColorScheme()
    
    internal var locationViewModel = LocationViewModel()
    
    override public func viewDidLoad() {
        super.viewDidLoad()
        
        // Map is centered on the last recorded location
        let options = MapInitOptions(cameraOptions: CameraOptions(center: CLLocationCoordinate2D(latitude: locationViewModel.lastLatitude, longitude: locationViewModel.lastLongitude), zoom: 15.0), styleURI: StyleURI(rawValue: mapColorScheme.mapStyleURL))
        
        // Main Map View
        mapView = MapView(frame: view.bounds, mapInitOptions: options)
        mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        
        cameraLocationConsumer = CameraLocationConsumer(mapView: mapView)
        
        mapView.location.options.puckType = .puck2D()
        mapView.location.options.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        mapView.location.options.puckBearingSource = .heading
        mapView.location.options.activityType = .automotiveNavigation
        
        // Hide scale bar
        mapView.ornaments.options.scaleBar.visibility = .hidden
        mapView.ornaments.options.logo.position = .topLeft
        mapView.ornaments.options.logo.margins = CGPoint(x: 16.0, y: 16.0)
        mapView.ornaments.options.attributionButton.position = .topRight
        mapView.ornaments.options.compass.position = .bottomRight
        mapView.ornaments.options.compass.margins = CGPoint(x: 16.0, y: 32.0)
        
        view.addSubview(mapView)
        
        mapView.mapboxMap.onNext(.mapLoaded) { _ in
            self.mapView.location.options.puckBearingSource = .heading
            self.mapView.location.addLocationConsumer(newConsumer: self.cameraLocationConsumer)
        }
    }
        
    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // Trait collection has already changed
    }
    
    public override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        // Trait collection will change. Use this one so you know what the state is changing to.
    }
}

public class CameraLocationConsumer: LocationConsumer {
    weak var mapView: MapView?
    weak var viewController: ViewController?
    
    private var mapPadding: UIEdgeInsets = UIEdgeInsets(top: 150, left: 0, bottom: 0, right: 0)
    
    init(mapView: MapView) {
        self.mapView = mapView
    }
    
    public func locationUpdate(newLocation: Location) {
        mapView?.camera.ease(
            to: CameraOptions(center: newLocation.coordinate, padding: mapPadding, zoom: 15),
            duration: 0.750)
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source