用于调度通知的唯一标识符,Swift 3 iOS 10

Posted

技术标签:

【中文标题】用于调度通知的唯一标识符,Swift 3 iOS 10【英文标题】:Unique Identifier for scheduling notifications, Swift 3 iOS 10 【发布时间】:2017-01-29 22:16:44 【问题描述】:

我正在安排具有唯一标识符的通知,因此我不必为每个通知创建一个新字符串。这一切都适用于调度,但问题在于试图取消它们。

这是我用于安排通知的代码...

    let notifIdentifier = TaskManager.notification2.userInfo.description as String!
    let trigger = UNCalendarNotificationTrigger(dateMatching: components , repeats: true)
    let request = UNNotificationRequest(identifier: notifIdentifier! , content: TaskManager.notification2, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

这是取消通知的代码...

// Deletion of Cells ...

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 

    let managedObject: NSManagedObject = frc.object(at: indexPath) as! NSManagedObject
    context.delete(managedObject)
    if tableView == TaskTableViews 
    let itemController = TaskManager()
    let nItem: List = frc.object(at: indexPath) as! List
    itemController.nItem = nItem
    UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [itemController.notifIdentifier!] )

当我试图取消它们时,它们会很受打击。我已经通过将标识符更改为常规字符串来测试代码,并且一切正常,因此它绝对是唯一标识符。

对于为每个新任务/通知创建唯一 ID 有什么想法/建议?

【问题讨论】:

有什么问题?甚至是什么意思?请解释一下问题是什么。什么是 TaskManager? 一次只能取消一个通知(不能取消多个)。如果您安排通知,关闭应用程序,然后重新打开应用程序以删除任务,通知不会被取消。就像我说的那样,这一切都与字符串完美配合,但使用唯一 ID 是我的问题。我正在寻找另一种为每个任务创建唯一 ID 的方法。 “所有都与字符串完美配合,但使用唯一 ID 是我的问题”我也无法弄清楚这意味着什么。标识符 is 是一个字符串,所以我不明白你在画什么区别。而且您还没有展示您的标识符是如何创建和存储的,所以谁知道您在做什么?到目前为止,整个问题都完全不清楚(至少对我而言)。 OK 创建一个唯一的字符串,我使用 TaskManager.notification2.userInfo.description 作为字符串!而不是为 UNNotifcationRequest 组成一个字符串,例如“Whatever” 问题是,“为通知创建唯一标识符”你不能批评我的代码。下次尝试回答问题而不是批评代码。如果您无法回答问题,请继续。 【参考方案1】:

安排通知

@IBAction func scheduleNotification(_ sender: AnyObject) 

    let uuid = UUID().uuidString


    let content = UNMutableNotificationContent()
    content.title = NSString.localizedUserNotificationString(forKey: "Example", arguments: nil)
    content.sound = UNNotificationSound.default()
    //...

    var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self.datePicker.date)
    dateComponents.second = 0

    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

    let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger)

    UNUserNotificationCenter.current().add(request)  (error) in

        if let errorPerforms = error 
         print(errorPerforms.localizedDescription)
         else 
         print("Success")
        
    


    let managedObject = ManagedObject(context: self.managedObjectContext!)
    managedObject.setValue(uuid, forKey: "uuid")
    //...

    do 
     try self.managedObjectContext.save()
        self.dimiss()
     catch 

indexPath 中删除通知。

 // Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 

    switch editingStyle 
    case .delete:

        let managedObject = self.fetchedResultsController.object(at: indexPath)
        self.managedObjectContext.delete(managedObject)

        let center = UNUserNotificationCenter.current()
        center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!])
        center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!])

        do 
         try self.managedObjectContext.save()
            self.tableView.reloadData()
         catch 

    default:
        break
    


这很好用!当您使用 NSFetchedResultsControllerDelegate 协议方法时。希望对你有帮助

【讨论】:

不幸的是,这对我不起作用。我可以联系您进一步讨论吗? 好的!有什么可以帮助你的吗?

以上是关于用于调度通知的唯一标识符,Swift 3 iOS 10的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何以编程方式获取iOS设备的唯一标识符?

转换为 Swift 3 - 通知中心调度队列

如何在 iOS(Swift 3)上断开 Firebase 通知?

iOS 设备获取唯一标识符汇总

swift 4如何将firebase Crashlytics用于多个标识符IOS的多个捆绑标识符

iOS中的通知