Получение местоположения пользователя в фоновом режиме запуска ViewController - PullRequest
0 голосов
/ 07 ноября 2018

Мое приложение должно собирать местоположения пользователей, даже когда приложение находится в фоновом режиме или не работает, поэтому я внедрил CLLocationManager в startMonitoringSignificantLocationChanges в AppDelegate следующим образом:

class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

    var window: UIWindow?
    var locationMgrSLC = CLLocationManager()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window?.tintColor = kMainRedColor

        //Other setups ...

        //Init Location for Significant Location Changes
        locationMgrSLC.desiredAccuracy = kCLLocationAccuracyBest
        locationMgrSLC.distanceFilter = kCLDistanceFilterNone
        locationMgrSLC.allowsBackgroundLocationUpdates = true
        locationMgrSLC.delegate = self
        if launchOptions?[UIApplication.LaunchOptionsKey.location] != nil { //launch service again if is background
            startMonitoringSignificantLocationChanges()
        }

        return true
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits

        startMonitoringSignificantLocationChanges()
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

        locationMgrSLC.stopMonitoringSignificantLocationChanges()
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

        startMonitoringSignificantLocationChanges()
    }

    // MARK: Background location update

    func startMonitoringSignificantLocationChanges() {
        if CLLocationManager.locationServicesEnabled() && CLLocationManager.authorizationStatus() == .authorizedAlways {

            locationMgrSLC.startMonitoringSignificantLocationChanges()

            if CLLocationManager.significantLocationChangeMonitoringAvailable() {
                print("[Background location] started...")
            }
            else {
                print("[Background location] SLC not available...")
            }
        }
        else {
            print("[Background location] cannot start (not authorized)")
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        if let userLocation = locations.last {

            //Send data to server ...

        }
        else {
            print("[Background location] no user location found")
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("[Background location] didFailWithError: \(error.localizedDescription)")
    }
}

Эта реализация работает, как и ожидалось, но похоже, что, когда iOS запускает приложение с новым местоположением (неактивное состояние в фоновом режиме), все приложение запускается в фоновом режиме, как оно было запущено пользователем. Я знаю, что это потому, что некоторые запросы API делаются из основного ViewController.

Это нормальное поведение? Что я могу сделать, чтобы предотвратить запуск контроллера основного вида в фоновом режиме?

...