Синхронизировать локальные уведомления с CloudKit?

#swift #xcode #notifications #cloudkit

#swift #xcode #уведомления #cloudkit

Вопрос:

Прямо сейчас я работаю над приложением с CloudKit sync для его базы данных Core Data. Я хочу добавить уведомления в приложение, но не уверен, что лучший способ получить уведомления, которые будут синхронизироваться между устройствами. Они будут просто синхронизированными уведомлениями на основе установленных пользователем сроков. Обычно я бы просто использовал UNUserNotificationCenter для создания a UNNotificationRequest всякий раз, когда пользователь устанавливает дату выполнения, но я хочу, чтобы эти уведомления синхронизировались между устройствами, и я не совсем уверен, как это сделать.

Я знаю, что CloudKit можно использовать для отправки push-уведомлений, но не похоже, что они предназначены для использования с простыми временными триггерами, подобными этому, не так ли?

Лучшая идея, которая у меня есть прямо сейчас, — это прослушать NSPersistentStoreRemoteChange и просмотреть каждый отдельный элемент, проверить, установлены ли на устройстве уведомления, и, если нет, создать его. Однако это кажется немного сложной задачей для запуска каждой синхронизации.

Ответ №1:

Вы правы в том, что уведомления CloudKit предназначены для запуска при CKRecord создании a, а не в определенное время, установленное пользователем.

То, что вы описываете как потенциальное решение, — это именно то, как я бы это сделал. Удаление всех предыдущих уведомлений и добавление новых — это просто запись данных на устройство, поэтому это не более трудоемко, чем запись в локальную базу данных.

Вот как я это сделал в одном из своих приложений. Предполагается, что у вас есть массив reminder объектов с различными свойствами, используемых для отображения информации об уведомлении. Это для iOS. Код для macOS немного отличается, но я могу предоставить его, если вам это нужно.

 import UIKit
import UserNotifications

func setupNotifications(){

  //Clear all the old notifications
  UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
  
  //Build new notifications
  for reminder in reminders{
    
    let notification = UNMutableNotificationContent()
    
    //Make sure we have a date property (reminder.date is a Date? optional)
    guard let date = reminder.date else{ continue }
    
    //Create a date components object from the reminder date
    let reminderDateComponents = Calendar.current.dateComponents([.year, .month, .day], from: date)
    
    //Set up a notification trigger in the future
    let trigger = UNCalendarNotificationTrigger(dateMatching: reminderDateComponents, repeats: false)
  
    notification.title = "Reminder Title"
    notification.body = "(reminder.name) is due on (date)."
    notification.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "Reminder.wav"))
    
    //Register the notification request
    let request = UNNotificationRequest(identifier: reminder.id, content: notification, trigger: trigger)
    
    UNUserNotificationCenter.current().add(request) { error in
      if let error = error{
        print("Error scheduling notification: (error.localizedDescription)")
      }
    }

  }

}
  

Затем вы можете позвонить setupNotifications() куда-нибудь в своем приложении, где ваши данные обновляются (например, после синхронизации).