在向我的警报应用程序实施通知时遇到问题

Posted

技术标签:

【中文标题】在向我的警报应用程序实施通知时遇到问题【英文标题】:having trouble implementing notifications to my alarm app 【发布时间】:2018-06-23 12:03:01 【问题描述】:

我创建了一个类似于 ios 警报应用程序的警报应用程序,并且单元格和表格视图也看起来类似于它。单元格有 2 个标签和开关按钮,因此当我打开按钮时,警报会在单元格的标签时间被激活。

有一个 triggerAlarm() 函数跟踪时间并循环遍历 items 数组,该数组是 [Item]() 类型(ItemNSManagedObject 类型的类,用于保存数据。它有 2属性time: String & isOn: Bool)。

问题是 viewDidLoad() 中的 Timer 方法没有通过 triggerAlarm() func 中的循环运行,而是打印 realTime 。该循环应该将 realTime 与 items 数组进行比较,如果 isOn 属性为 true 但没有发生,则调用 notificationTrigger() 函数。

Xcode 也没有显示任何错误。

代码如下:

import UIKit
import UserNotifications

class TableViewController: UITableViewController 

    var realTime  = String()
    var items     = [Item]()

    override func viewDidLoad() 
        super.viewDidLoad()
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: didAllow, error in)

    

    override func viewWillAppear(_ animated: Bool) 

        getData()
        tableView.reloadData()

    

    override func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return items.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell

        let row = items[indexPath.row]

        cell.timeLbl.text   = row.time
        cell.switchBtn.isOn = row.isOn

        cell.callback =  newValue in
            row.isOn = newValue
            (UIApplication.shared.delegate as! AppDelegate).saveContext()
        
        return cell
    

    func getData() 
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        do 
             items = try context.fetch(Item.fetchRequest())
        catch
            print("\(error)")
        
    

    func triggerAlarm() 
        realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
        print(realTime)
        for i in 0..<items.count 
            if (items[i].time!) == realTime && items[i].isOn == true
                print(time)
                self.notificationTrigger()
            else 
                return
            
        
    

    func notificationTrigger() 
        let content      = UNMutableNotificationContent()
        content.title    = "time is up \(time)"
        content.subtitle = "asdf"
        content.body     = "qwer"
        content.badge    = 0

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
        let request = UNNotificationRequest(identifier: "customNotification", content: content, trigger: trigger)
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

    

【问题讨论】:

为什么在 viewDidLoad 和 viewWillAppear 中都调用 getData() 和 tableView.reloadData()?您在 viewDidLoad 中还有另一个问题。 我可能是复制粘贴而不是剪切粘贴 【参考方案1】:
@objc func triggerAlarm() 
    realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
    print(realTime)
    for i in 0..<items.count 
        if (items[i].time!) == realTime && items[i].isOn == true
            print(time)
            self.notificationTrigger()
        else 
            return
        
    

这里你在 else 中使用了 return。 所以不是打破当前迭代的循环(我想你想实现这个),而是从整个方法调用中返回。改为使用:-

继续

或者最好省略else部分

 @objc func triggerAlarm() 
    realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
    print(realTime)
    for i in 0..<items.count 
        if (items[i].time!) == realTime && items[i].isOn == true
            print(time)
            self.notificationTrigger()
        
    

【讨论】:

谢谢,但通知仅在我滚动表格视图或从后台打开应用程序时出现

以上是关于在向我的警报应用程序实施通知时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

我无法让推送通知以警报或横幅形式出现

在向数千名用户发送 android 推送通知时出现 405 错误

iOS 推送通知自定义警报

仅当应用程序在前台时才会收到 Android 通知

iOS:当您没有权利文件时,如何为您的应用程序实施关键警报?

Java 警报框架