Как получить все ожидающие уведомления из iCloud и уведомить его о том, что мое приложение получило уведомление?

Обычно я получаю уведомления сразу после изменения записи.

Но что делать, когда мое приложение не работает, и мне нужно получить все ожидающие уведомления?

1 ответ

  1. Просто сделайте это так:

    func fetchPendingNotifications() {
    
        var queryNotifications = [CKQueryNotification]()
    
        let operation = CKFetchNotificationChangesOperation(previousServerChangeToken: nil)
        let operationQueue = OperationQueue()
    
        operation.notificationChangedBlock = { notification in
    
            if let queryNotification = notification as? CKQueryNotification {
                queryNotifications.append(queryNotification)
            }
        }
    
        operation.fetchNotificationChangesCompletionBlock = { _, error in
    
            if error == nil {
    
                self.perform(queryNotifications: queryNotifications) { _ in
    
                    //do sth on success
                }
            }
        }
    
        operationQueue.addOperation(operation)
    }
    

    вспомогательная функция:

    private func perform(queryNotifications: [CKQueryNotification], completion: ErrorHandler? = nil) {
    
        var currentQueryNotifications = queryNotifications
    
        if let queryNotification = currentQueryNotifications.first {
    
            currentQueryNotifications.removeFirst()
    
            if queryNotification.queryNotificationReason == .recordCreated || queryNotification.queryNotificationReason == .recordUpdated {
    
                //fetch the record from cloud and save to core data
                self.fetchAndSave(with: queryNotification.recordID!) { error in 
    
                    if error == nil {
    
                        OperationQueue().addOperation(CKMarkNotificationsReadOperation(notificationIDsToMarkRead: [queryNotification.notificationID!]))
                        self.perform(queryNotifications: currentQueryNotifications, completion: completion)
    
                    } else {
                        completion?(error)
                    }
                }
    
            } else {
                //delete record from coredata
                self.delete(with: queryNotification.recordID!) { error in
    
                    if error == nil {
    
                        OperationQueue().addOperation(CKMarkNotificationsReadOperation(notificationIDsToMarkRead: [queryNotification.notificationID!]))
                        self.perform(queryNotifications: currentQueryNotifications, completion: completion)
    
                    } else {
                        completion?(error)
                    }
                }
            }
    
        } else {
    
            completion?(nil)
        }
    }