项目现在需要实现一个应用进入后台后,每小时发出提醒通知的功能。要求如下:
1、每天8点-23点每小时发出一次本地提醒通知
2、提醒的内容是查询本地数据库得到的一个数值,会根据时间的推移而改变
LZ之前用NSTimer
计时,每小时去查询数据库并添加UILocalNotification
,但是在真机上就算获得了音乐播放器类应用的权限后,在后台运行一段时间,应用依旧会被挂起,导致NSTimer
失效。
求大神帮忙,急~在线等!
项目现在需要实现一个应用进入后台后,每小时发出提醒通知的功能。要求如下:
1、每天8点-23点每小时发出一次本地提醒通知
2、提醒的内容是查询本地数据库得到的一个数值,会根据时间的推移而改变
LZ之前用NSTimer
计时,每小时去查询数据库并添加UILocalNotification
,但是在真机上就算获得了音乐播放器类应用的权限后,在后台运行一段时间,应用依旧会被挂起,导致NSTimer
失效。
求大神帮忙,急~在线等!
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
这个问题可以通过使用NSOperationQueue
来解决。NSOperationQueue
是一个可以用来处理异步任务的任务队列。我们可以创建一个定时任务,然后将这个任务放入到NSOperationQueue
中,这样就可以在指定的时间内执行任务了。
以下是一个示例代码:
import UIKit
import Foundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let timer = NSTimer.scheduledTimer(withTimeInterval: 60, repeats: true) { [weak self] _ in
if let localDatabase = UserDefaults.standard.object(forKey: "localDatabase") as? [String: Int], let today = Calendar.current.date(byAdding: .day, to: Date(), adding: -1) {
let tomorrow = Calendar.current.date(byAdding: .day, to: today, adding: 1)
let reminderTime = tomorrow.timeIntervalSince(tomorrow) * 1000 // convert to milliseconds
let notification = UILocalNotification()
notification.timeZone = TimeZone.current
notification.alertBody = "\(today)"
notification.soundName = "default"
if let databaseValue = localDatabase["value"] as? Int {
if databaseValue < reminderTime {
localDatabase["value"] = databaseValue + 1
UserDefaults.standard.set(localDatabase, forKey: "localDatabase")
notification.content = "Your value is \(databaseValue), please check it."
}
} else {
localDatabase["value"] = 0
UserDefaults.standard.set(localDatabase, forKey: "localDatabase")
notification.content = "No data found, please add some values first."
}
UIApplication.shared.applicationDelegate?.delegate?.applicationWillEnterForeground()
UIApplication.shared.applicationDelegate?.delegate?.addLocalNotification(notification)
}
}
timer.invalidate()
}
}
在这个代码中,我们首先创建了一个定时器,每隔一分钟就调用一次我们的方法。在每次调用的时候,我们都会检查一下当前的时间是否已经超过了前一天的时间。如果是的话,我们就计算出明天的时间,并且设置一个新的本地通知。然后,我们将新的本地通知添加到应用程序的通知中心中。最后,我们释放掉定时器。
请注意,你需要先确保你的项目中有导入了UIKit
和Foundation
这两个库。此外,你还需要在你的应用里添加一些权限,例如UserDefaults
的访问权限。