当app在后台时,如何使用Timer

时间:2018-06-12 14:49:30

标签: swift google-maps nstimer dispatchertimer

使用Timer

每4秒调用一个函数

如果我点击同一个viewController中的按钮,我将导航到谷歌地图。

导航到谷歌地图后,该功能未被调用

这是按钮操作

@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 :(得分:0)

实际上你可以在后台使用Timer,但是你必须在看到gist之前创建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")
    })
}