在向我的警报应用程序实施通知时遇到问题
Posted
技术标签:
【中文标题】在向我的警报应用程序实施通知时遇到问题【英文标题】:having trouble implementing notifications to my alarm app 【发布时间】:2018-06-23 12:03:01 【问题描述】:我创建了一个类似于 ios 警报应用程序的警报应用程序,并且单元格和表格视图也看起来类似于它。单元格有 2 个标签和开关按钮,因此当我打开按钮时,警报会在单元格的标签时间被激活。
有一个 triggerAlarm()
函数跟踪时间并循环遍历 items
数组,该数组是 [Item]()
类型(Item
是 NSManagedObject
类型的类,用于保存数据。它有 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 错误