Abe_ 2014-10-16 07:40 采纳率: 0%
浏览 942

ios 应用进入后台后每小时查数据库并添加本地通知(UILocalNotification)

项目现在需要实现一个应用进入后台后,每小时发出提醒通知的功能。要求如下:

1、每天8点-23点每小时发出一次本地提醒通知

2、提醒的内容是查询本地数据库得到的一个数值,会根据时间的推移而改变

LZ之前用NSTimer计时,每小时去查询数据库并添加UILocalNotification,但是在真机上就算获得了音乐播放器类应用的权限后,在后台运行一段时间,应用依旧会被挂起,导致NSTimer失效。

求大神帮忙,急~在线等!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 21:46
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题可以通过使用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()
        }
    }
    

    在这个代码中,我们首先创建了一个定时器,每隔一分钟就调用一次我们的方法。在每次调用的时候,我们都会检查一下当前的时间是否已经超过了前一天的时间。如果是的话,我们就计算出明天的时间,并且设置一个新的本地通知。然后,我们将新的本地通知添加到应用程序的通知中心中。最后,我们释放掉定时器。

    请注意,你需要先确保你的项目中有导入了UIKitFoundation这两个库。此外,你还需要在你的应用里添加一些权限,例如UserDefaults的访问权限。

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境