Swift:在后台运行计时器并发送通知

Swift:在后台运行计时器并发送通知,swift,timer,apple-push-notifications,background-process,Swift,Timer,Apple Push Notifications,Background Process,我知道已经有关于这个话题的问题了,但这对我不起作用,所以我想再问一次这个问题 我想做的是: 我有一个简单的间隔计时器应用程序,你可以设置你的间隔和休息时间。当用户关闭应用程序(未完成,只是向上滑动进入主屏幕)时,间隔或中断再次开始时,他应该会收到消息。我已经试过两种不同的方法 一,。 我集成了后台模式、写入和通知用户的功能。当间隔/中断开始时,在计时器中调用该函数 func notify(title: String, message: String){ let content = UNM

我知道已经有关于这个话题的问题了,但这对我不起作用,所以我想再问一次这个问题

我想做的是:

我有一个简单的间隔计时器应用程序,你可以设置你的间隔和休息时间。当用户关闭应用程序(未完成,只是向上滑动进入主屏幕)时,间隔或中断再次开始时,他应该会收到消息。我已经试过两种不同的方法

一,。 我集成了后台模式、写入和通知用户的功能。当间隔/中断开始时,在计时器中调用该函数

func notify(title: String, message: String){
    let content = UNMutableNotificationContent()
    content.title = title
    content.body = message
    
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
    
    let req = UNNotificationRequest(identifier: "MSG", content: content, trigger: trigger)
    
    UNUserNotificationCenter.current().add(req, withCompletionHandler: nil)
}
代码在模拟器上完美地执行。计时器在后台运行,并将通知发送给用户。但是,当我在实际设备上运行代码时,计时器停止运行,因此不会发送通知。我读到不可能在后台运行计时器。这是真的还是有办法

  • 当我读到计时器不会在后台运行时,我尝试了另一种方法。当用户离开应用程序时,我会运行一个函数,为将要发生的每个更改创建通知

     func notify(trainingsState: [TrainingsState]){
    
     let center = UNUserNotificationCenter.current()
    
     let content = UNMutableNotificationContent()
     content.title = trainingsState[0].name
     content.body = trainingsState[0].msg ?? "Error"
     var trigger = UNTimeIntervalNotificationTrigger(timeInterval: Double(insgesamt), repeats: false)
    
     var request = UNNotificationRequest(identifier: "startedExercise", content: content, trigger: trigger)
    
     center.add(request) { (error) in
         if let error = error{
             print("Error: \(error)")
         }
     }
    
     var dauerInsgesamt: Double{
         var dauer = 0.0
         for _ in 1...Int(daten.durchgaenge){
             for _ in übungListe.übungen{
                 dauer += daten.intervallInsgesamt
                 dauer += daten.pauseInsgesamt
             }
             dauer -= daten.pauseInsgesamt
             dauer += daten.pauseZwischenDurchgängenInsgesamt
         }
    
         print(dauer)
         return dauer
     }
    
     var dauerBisGroßePause: Double{
         var dauer = 0.0
         for _ in übungListe.übungen{
             dauer += daten.intervallInsgesamt
             dauer += daten.pauseInsgesamt
         }
         dauer -= daten.pauseInsgesamt
    
         print(dauer)
         return dauer
     }
    
     for übung in trainingsState{
         content.title = übung.name
         content.body = übung.msg ?? ""
    
         if !übung.isSpecial{
             trigger = UNTimeIntervalNotificationTrigger(timeInterval: übung.isBreak ? daten.pauseInsgesamt : daten.intervallInsgesamt, repeats: true)
         }else{
             if übung.dauer == nil{
                 trigger = UNTimeIntervalNotificationTrigger(timeInterval: dauerBisGroßePause, repeats: true)
             }else{
                 trigger = UNTimeIntervalNotificationTrigger(timeInterval: dauerInsgesamt, repeats: false)
             }
         }
    
         request = UNNotificationRequest(identifier: übung.id.uuidString, content: content, trigger: trigger)
    
         center.add(request) { (error) in
             if let error = error{
                 print("Error: \(error)")
             }
         }
     }
    
    }

  • 但这不起作用。我得到一个错误,触发器的时间间隔必须至少为60秒,但是当时间间隔只有30秒长时,用户还必须得到通知。有人知道如何解决这个问题吗

    结论: 我知道有可能对我想要的行为进行编程,因为有些应用程序正是我想要做的。问题:当应用程序处于后台时,暂停或间隔将开始时,我如何向用户发送通知


    感谢所有:)

    当应用程序暂停或终止时,计时器将失效。您可以使用后台模式唤醒应用程序以执行特定任务(您有30秒的时间在后台完成任务)

    以下是2019年的一些资料,还有到2020年的链接: