Swift: подписка CloudKit firesOnRecordCreation не вызывается должным образом - PullRequest
0 голосов
/ 03 августа 2020

Это мой реестр для метода подписки

public func RegisterForSubscription(completion: @escaping (Result<CKSubscription, Error>) -> Swift.Void) {
    let subscription = CKQuerySubscription(recordType: Film.RecordType, predicate: NSPredicate(value: true), options: [.firesOnRecordCreation, .firesOnRecordDeletion, .firesOnRecordUpdate])

    let notificationInfo = CKSubscription.NotificationInfo()
    notificationInfo.shouldSendContentAvailable = true
    subscription.notificationInfo = notificationInfo

    database.save(subscription) { savedSubscription, error in
        if let error = error {
            print("Subscription error: \(error.localizedDescription)")
            completion(.failure(error))
            return
        }

        if let savedSubscription = savedSubscription {
            completion(.success(savedSubscription))
            return
        }
    }        
}

Теперь все, что мне нужно, это .firesOnRecordCreation, но для целей отладки я добавил все три параметра.

Когда я пытался добавить (сохранить ) новую запись, он успешно добавил их в CloudKit. вот метод

public func save(film: Film, completion: @escaping (Result<CKRecord, Error>) -> Swift.Void) {
    let filmRecord = film.toRecord()
    
    let operation = CKModifyRecordsOperation(recordsToSave: [filmRecord], recordIDsToDelete: nil)
    operation.qualityOfService = .userInitiated
    operation.completionBlock = {
        completion(.success(filmRecord))
    }
    
    database.add(operation)
}

и мой .toRecord() метод:

public func toRecord() -> CKRecord {
    let record = self.record ?? CKRecord(recordType: Self.RecordType)
    record[RecordKeys.id.rawValue] = id
    record[RecordKeys.title.rawValue] = title
    record[RecordKeys.filmDescription.rawValue] = filmDescription
    record[RecordKeys.image.rawValue] = image
    record[RecordKeys.director.rawValue] = director
    record[RecordKeys.producer.rawValue] = producer
    record[RecordKeys.releaseDate.rawValue] = releaseDate
    record[RecordKeys.rtScore.rawValue] = rtScore
    record[RecordKeys.imdbLink.rawValue] = imdbLink
    record[RecordKeys.imdbScore.rawValue] = imdbScore
    
    return record
}

Все работает. однако я хотел зарегистрироваться для подписки (беззвучные уведомления) для обнаружения изменений в реальном времени, когда пользователь добавляет новую запись (фильм).

Проблема в том, что всякий раз, когда я добавляю через метод (вызывая метод сохранения), он не запускает параметр .firesOnRecordCreation. Однако два других работают. Я обновил один из атрибутов через панель управления CloudKit и удалил их, он называется (в appDelegate didReceiveRemoteNotification)

Что я делаю не так? Когда пользователь добавляет новый фильм из метода (не через панель инструментов VIA), он должен запускаться, но не в этом случае.

EDIT:

Добавление через панель инструментов TRIGGERS подписку. Но НЕ при использовании метода.

1 Ответ

1 голос
/ 14 августа 2020

Уведомление о подписке не будет получено устройством, которое создало, удалило или обновило CKRecord.

Изменить: Прочтите здесь об обработке уведомлений о подписке.

Вы используете несколько устройств, потому что уведомление не отправляется на то же устройство, которое отправило уведомление

...