如何使计时器在后台Xcode IOS中运行

时间:2018-08-09 09:18:10

标签: ios iphone xcode

我的应用程序有问题。我有一个在应用程序中运行的倒数计时器。最初,在我对应用程序委托方法applicationDidEnterBackground进行调整之前,如果我离开应用程序,计时器仍将运行。(未关闭应用程序,仅在主屏幕上。)

我在applicationDidEnterBackground中放置了一个通知触发器。这可能导致计时器停止运行。

我需要在计时器结束之前向用户发送通知以返回到应用程序。 (因此,通知在applicationDidEnterBackground中) 我想给用户一定的时间,使其在计时器停止之前返回到应用程序。

现在。...已发送通知,但计时器立即结束。

func applicationDidEnterBackground(_ application: UIApplication) {
    let content = UNMutableNotificationContent()
    //adding title, subtitle, body and badge
    content.title = "Hey if you will not come back"
    content.subtitle = "your timer will be killed"
    content.body = ""
    content.badge = 1
    //getting the notification trigger
    //it will be called after 5 seconds

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)

    //getting the notification request
    let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)


    //adding the notification to notification center
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

ViewController.swift

 @objc func countdown (){

    if valueToInt != 0 {
        valueToInt -= 1
        sliderLabel.text = String(valueToInt)
    } else {
        endTimer()
    }

    sliderLabel.text = timeFormatted(valueToInt)
}


func startTimer() {

    countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector (ViewController.countdown), userInfo: nil, repeats: true)

    countdown()

    stopOutlet.isHidden = false
    startOutlet.isHidden = true
    titlleLabel.isHidden = true
    sliderView.isHidden = true

 }

1 个答案:

答案 0 :(得分:0)

除非明确要求,否则不能在后台连续运行任何代码。要执行任何后台任务,您必须激活后台模式。 目标->功能->背景模式 对于您要查找的特定解决方案,您可以在不要求打开 Background Modes (背景模式)的情况下,在后台请求系统额外的时间。苹果将​​为您提供2分钟59秒的最长时间,这是我测试过的时间,但文档仅显示了不到3分钟的时间。

// Declare a background task by default I set it to TaskInvalid
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid

在进入后台模式之前,启动并开始后台任务

backgroundTask = UIApplication.shared.beginBackgroundTask(expirationHandler: { [weak self] in
        self?.endBackgroundTask()
    })

// endBackgroundTask is a helper function which you will call once you're done with your task
private func endBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = UIBackgroundTaskInvalid
}

您甚至可以在使计时器无效之前调用endBackgroundTask函数

 @objc func countdown (){

if valueToInt != 0 {
    valueToInt -= 1
    sliderLabel.text = String(valueToInt)
} else {
    // call endBackgroundTask if you didn't call system will terminate it
    self.endBackgroundTask()
    endTimer()
}

   sliderLabel.text = timeFormatted(valueToInt)
}