3 Replies
      Latest reply on Oct 29, 2019 3:21 AM by mattll
      mattll Level 1 Level 1 (0 points)
        I am currently testing the background location mode in iOS 13, as I want to track the user´s location and motion (using the CMMotionManager) in the background. Therefore, i have my own (singleton) class handling the location tracking. I initialize the CLLocationManager in the following way:
        func initializeLocationManager() -> CLLocationManager { 
        let manager = locationManager ?? CLLocationManager() 
        manager.delegate = self manager.requestAlwaysAuthorization() 
        manager.allowsBackgroundLocationUpdates = true 
        manager.pausesLocationUpdatesAutomatically = false 
        manager.distanceFilter = kCLDistanceFilterNone 
        manager.desiredAccuracy = kCLLocationAccuracyBest 
        manager.activityType = .other 
        return manager 
        }

        Then I start the following services:  

        func startLocationServices() { 
        ... 
        locationManager.startUpdatingLocation() 
        locationManager.startMonitoringVisits() 
        locationManager.startMonitoringSignificantLocationChanges() 
        ... 
        }

        In addition, I implemented the CLLocationManagerDelegate-methods didChangeAuthorization(), didUpdateLocation().

        In the .plist-file I appended the following entries:<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>

        <string>...</string> 
        <key>NSLocationWhenInUseUsageDescription</key> 
        <string>...</string> 
        <key>UIBackgroundModes</key> 
        <array> 
        <string>location</string> 
        </array> 

        In my view controller, I call the startLocationServices. Currently, I set the app's authorization to track location data to ".authorizedAlways"

        The location updates stop after approximately 60 - 130 minutes.

         

        To solve the problem, I already added the didFinishLaunchingWithOptions-function, which triggers the location-updates again:nc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if let launchOptions = launchOptions, 
        let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool, 
        isLocationKey { 
        restartServices()  
        } 
        return true 
        } 

        When the app gets awoken using this function, I managed to get continuous data on some tests, but sometimes the app was suspended again after a few minutes.

        Last, I also tried a timer that restarts the location tracking every 5 minutes, but this does not seem to affect the update-duration at all.

        I tested the application on iOS 12 and it gets continuous updates in 5/5 tests. So I guess the problem is related to iOS 13.

         

        So my question is if there is a way of continuously receiving the location updates in the background in iOS13, or is there some option I am missing?

        Thanks in advance.