首页 > 解决方案 > Swift:CloudKit 订阅 firesOnRecordCreation 未按预期调用

问题描述

这是我的订阅方法注册

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 仪表板)添加新电影时,它应该触发它,但在这种情况下不是。

编辑:

通过仪表板添加触发订阅。但不是在使用该方法时。

标签: swiftuikitcloudkit

解决方案


创建、删除或更新的设备将不会收到订阅通知CKRecord

编辑:在此处阅读有关处理订阅通知的信息。

您使用多个设备,因为通知未发送到发出通知的同一设备


推荐阅读