我解决了这个问题。
var backgroundUpdateTask: UIBackgroundTaskIdentifier = 0
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
return true
}
func applicationWillResignActive(application: UIApplication) {
self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
self.endBackgroundUpdateTask()
})
}
func endBackgroundUpdateTask() {
UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskInvalid
}
func applicationWillEnterForeground(application: UIApplication) {
self.endBackgroundUpdateTask()
}
计时器在激活之前无法工作。即使在后台运行应用程序,我也想执行计时器更新过程。我使用滴答功能更新当前时间,并且当计时器与开机/关机计时器同步时,我会进行开机或关机操作。我希望计时器和更新过程在后台运行。
override func viewDidLoad()
{
super.viewDidLoad()
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(self.tick) , userInfo: nil, repeats: true)
}
@objc func tick() {
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy HH:mm"
labelTimer.text = formatter.string(from: Date())
zaman()
zaman1()
}
@objc func zaman(){
if timertext.text == String? (labelTimer.text!) {
zamanlayıcıfunc()
}else{
return
}
}
@objc func zamanlayıcıfunc()
{
if labelcheckbox.text == ("aç"){
updateState()
}
if labelcheckbox.text == ("kapat"){
updateState1()
}
}
@objc func zaman1(){
if timertext2.text == String? (labelTimer.text!) {
zamanlayıcıfunc1()
}else{
return
}
}
@objc func zamanlayıcıfunc1()
{
if labelcheckbox2.text == ("saatinde kapat"){
updateState1()
}
else{
updateState()
}
}
@objc func updateState(){
let ref = Database.database().reference()
ref.child("\(chip1InfoString1!)/states/\(self.ekle2.text!)").setValue(true)
getData()
}
答案 0 :(得分:4)
您的应用程序将不会在后台继续处理。如果所有应用程序都可以做到,那么手机电池将很快被耗尽。
操作系统将为您提供一些有限的后台执行时间,但是如果您使用过多的资源,则会进一步受到限制。您可以详细了解in Apple's documentation。
您可能需要做的是使用UIApplication.didEnterBackgroundNotification
和UIApplication.willEnterForegroundNotification
跟踪应用何时进入后台和前台,以查看经过了多少时间。