SwiftUI·后台计时器适用于模拟器,但不适用于真实设备

丹尼尔

我试图建立一个计时器,当应用程序在后台甚至屏幕被锁定时,它会继续递减计数。计时器达到0后,应发送通知。

到目前为止,它可以在模拟器上运行,但不能在真实设备(运行iOS 13.5.1的iPhone X)上运行。进入后台时,任务只是暂停。

如何使倒数计时在真实设备上运行?

import SwiftUI
import UserNotifications

struct ContentView: View {
    @State var start = false
    @State var count = 10 // 10 sec timer
    @State var time = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    var body: some View{
        VStack{
            Text("\(self.count)")
            
            Button(action: {
                self.start.toggle()
            }) {
                Text("Start")
            }
        }
        .onAppear(perform: {
            UNUserNotificationCenter.current().requestAuthorization(options: [.badge,.sound,.alert]) { (_, _) in
            }
        })
            .onReceive(self.time) { (_) in
                if self.start{
                    if self.count != 0{
                        self.count -= 1
                    }
                    else{
                        self.sendNotification()
                    }
                }
        }
    }
    
    func sendNotification(){
        
        let content = UNMutableNotificationContent()
        content.title = "Timer"
        content.body = "Time is up!"
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
        let req = UNNotificationRequest(identifier: "MSG", content: content, trigger: trigger)
        
        UNUserNotificationCenter.current().add(req, withCompletionHandler: nil)
    }
}

选定的背景模式(屏幕截图)

Xnero

Apple不允许计时器在后台运行。

有关更多信息,请参见以下两个问题:

在您的应用程序后台运行后,Apple不允许您长时间运行进程。从文档:

实施长期任务

对于需要更多执行时间才能实现的任务,您必须请求特定权限才能在后台运行它们而不暂停它们。在iOS中,只允许特定的应用类型在后台运行:]

  • 在后台播放可听内容的应用程序,例如音乐播放器应用程序
  • 在后台录制音频内容的应用
  • 始终让用户了解其位置的应用程序,例如导航应用程序
  • 支持互联网协议语音(VoIP)的应用
  • 需要定期下载和处理新内容的应用
  • 从外部配件接收定期更新的应用
  • 实现这些服务的应用必须声明它们支持的服务,并使用系统框架来实现这些服务的相关方面。

声明服务可使系统知道您使用的服务,但在某些情况下,实际上是系统框架阻止了应用程序被挂起。

但是在这种情况下,您想发送通知,因此我建议您进行类似的操作,但要有所不同。

当用户离开应用程序时,您想要获取当前时间。然后,您想将剩余计时器时间添加到当前时间,并在应用中运行代码以在当前时间+计时器剩余时间发送通知。

在特定时间发送通知的代码可以在这里查看

let content = UNMutableNotificationContent()
                content.title = "Title"
                content.body = "Body"
                content.sound = UNNotificationSound.default()

                let gregorian = Calendar(identifier: .gregorian)
                let now = Date()
                var components = gregorian.dateComponents([.year, .month, .day, .hour, .minute, .second], from: now)

                // Change the time to 7:00:00 in your locale
                components.hour = 7
                components.minute = 0
                components.second = 0

                let date = gregorian.date(from: components)!

                let triggerDaily = Calendar.current.dateComponents([.hour,.minute,.second,], from: date)
                let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)


                let request = UNNotificationRequest(identifier: CommonViewController.Identifier, content: content, trigger: trigger)
                print("INSIDE NOTIFICATION")

                UNUserNotificationCenter.current().add(request, withCompletionHandler: {(error) in
                    if let error = error {
                        print("SOMETHING WENT WRONG")
                    }
                })

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

角度计时器指令不适用于离子框架

通用链接适用于xcode8模拟器,但不适用于ios 10设备

从集合视图单元中拖动可在iPad模拟器上使用,但不适用于iPhone模拟器或Swift 4中的真实设备

后台方法停止在设备上运行,仅适用于模拟器swift 4 xcode 9

适用于iOS的Firebase动态链接适用于我的设备和模拟器,但发布后不适用于用户

回收站ItemClick不适用于倒数计时器

在Android模拟器中安装应用程序显示“此应用程序不适用于您的设备”

自动滑动适用于iOS 6模拟器,但不适用于iOS 7

Global.asax计时器可用于IIS,但不适用于Azure

Forward GeoCoding正在模拟器上运行,但不适用于iPhone

css3视口:适用于chrome模拟器,不适用于android手机

.setText()在使用计时器时不适用于textview

在Xcode中设置自定义类适用于iOS 9.1模拟器,但不适用于iOS 8.4

应用程序是为模拟器创建的,但不适用于“通用iOS设备”

Firebase数据库安全性规则适用于模拟器,而不适用于Java代码

iOS 10.3 文本转语音适用于模拟器但不适用于设备

JavaScript 计时器不适用于多个实例

滑动删除不适用于计时器

该应用程序适用于模拟器但不适用于实际设备

如果语句不适用于计时器

Firestore 规则适用于模拟器但不适用于网站

自定义 Alexa 技能不适用于回声点,但适用于模拟器

Android 谷歌地图适用于模拟器,但不适用于真机

React Native Android:请求适用于 android 模拟器,但不适用于 Play Store 构建

WebView 仅适用于模拟器而不适用于设备

Okhttp 模拟服务器不适用于 API 28 及以上模拟器

SharedPreferences 不适用于真实设备 FLUTTER

来自 URL 的颤动图像仅适用于模拟器,而不适用于物理设备

std::chrono 纳秒计时器适用于 MSVC 但不适用于 GCC