Я написал приведенный ниже код с таймером, который вызывает функцию обратного вызова каждую минуту. Когда приложение переходит на задний план, я запустил еще один таймер, который вызывает тот же метод обратного вызова, но фоновый таймер работает всего три минуты.
Я понимаю, что Apple позволяет выполнять фоновые задачи всего три минуты. Мое приложение больше похоже на приложение отслеживания, которое отслеживает местоположение пользователя каждую минуту, даже когда приложение находится в фоновом режиме, поэтому мне нужно реализовать эту функциональность.
Я узнал, что нужно использовать beginBackgroundTaskWithExpirationHandler, но я не знаю, правильно ли реализована моя реализация.
Примечание. У меня есть необходимые фоновые режимы в регистре plist toApp для обновлений местоположения.
Приветствуется любой рабочий код или ссылки.
override func viewDidLoad() {
    super.viewDidLoad()
    timeInMinutes = 1 * 60
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.requestWhenInUseAuthorization()
    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }
    var timer = NSTimer.scheduledTimerWithTimeInterval( timeInMinutes, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    self.latitude = locValue.latitude
    self.longitude = locValue.longitude
    if UIApplication.sharedApplication().applicationState == .Active {
    } else {
        backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
            self.backgroundTimer.invalidate()
            self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval( 60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
        })
    }
}
func updateLocation() {
    txtlocationLabel.text = String(n)
    self.n = self.n+1
    var timeRemaining = UIApplication.sharedApplication().backgroundTimeRemaining
    print(timeRemaining)
    if timeRemaining > 60.0 {
        self.GeoLogLocation(self.latitude,Longitude: self.longitude) {
            results in
            print("View Controller: \(results)")
            self.CheckResult(String(results))
        }
    } else {
        if timeRemaining == 0 {
            UIApplication.sharedApplication().endBackgroundTask(backgroundTaskIdentifier)
        }
        backgroundTaskIdentifier2 = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
            self.backgroundTimer.invalidate()
            self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval( 60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
        })
    }
}