Как работать с таймером, когда приложение находится в фоновом режиме - PullRequest
0 голосов
/ 12 июня 2018

Вызываю одну функцию каждые 4 секунды, используя Таймер

, и если я нажимаю на кнопку в том же представлении, контроллер переходит на карты Google.

После перехода на карты Google эта функцияне вызывается

Вот действие кнопки

@IBAction func navigateBtnClicked(_ sender: Any) {
    if UIApplication.shared.canOpenURL(URL(string: "comgooglemaps://")!) {
        let googleMapUrlString: String = "comgooglemaps://?saddr=&daddr=\(CDouble(pickupLat)),\(CDouble(pickupLong))&mode=driving"
        UIApplication.shared.open(URL(string: googleMapUrlString)!, options: [:], completionHandler: nil)
    }
}

Вот мой код для использования таймера

override func viewDidLoad() {
    super.viewDidLoad()

    DispatchQueue.global(qos: .default).async(execute: {
        sendingLatLongTimer = Timer(timeInterval: 4, target: self, selector: #selector(self.webserviceCall), userInfo: nil, repeats: true)
        RunLoop.main.add(self.sendingLatLongTimer!, forMode: .commonModes)
    })
}

1 Ответ

0 голосов
/ 14 июня 2018

на самом деле вы можете использовать Timer в фоновом режиме, но вы должны создать BackgroundTask, прежде чем увидеть суть здесь: https://gist.github.com/phatmann/e96958529cc86ff584a9 Следует отметить, что фоновая задача в IOS 11 имеет максимальное время жизни 180 секунд, после истечения срока фоновой задачи ваше приложение падаетв режиме ожидания, если вам нужно периодически выполнять какую-либо работу в фоновом режиме, используйте тихий пуш с сервера.

private func startBarkgroundTaskTimer(time: TimeInterval) {
    backgroundTaskTimer?.invalidate()
    backgroundTaskTimer = nil
    backgroundTaskTimer = Timer.scheduledTimer(
        withTimeInterval: time,
        repeats: true,
        block: { [weak self] _ in
            guard let `self` = self, UIApplication.isBackground else { return }
            Logger.log("update location from BG")
    })
}
...