我的应用程序有问题。我有一个在应用程序中运行的倒数计时器。最初,在我对应用程序委托方法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
}
答案 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)
}