首页 > 解决方案 > 无法使用 cloudkit 从公共数据库中获取记录

问题描述

这是我用来获取公共记录的方法:

private func fetchPublicRecordZonesChanges(completion: ErrorHandler?) {
    let zone = CKRecordZone.default()
    let options = CKFetchRecordZoneChangesOptions()
    options.previousServerChangeToken = nil

    var records = [CKRecord]()
    var recordIDsToDelete = [CKRecordID]()
    let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zone.zoneID], optionsByRecordZoneID: [zone.zoneID: options])
    operation.database = CloudAssistant.shared.publicDatabase
    operation.recordChangedBlock = { record in
        records.append(record)
    }

    operation.recordWithIDWasDeletedBlock = { recordID, string in
        recordIDsToDelete.append(recordID)
    }

    operation.recordZoneChangeTokensUpdatedBlock = { _, token, _ in
        if let token = token {
            Token.temporaryPublicZoneServerChangeToken = token
        }
    }

    operation.recordZoneFetchCompletionBlock = { [weak self] _, token, _, _, error in
        if let error = error, error.isTokenExpiredError {
            UserDefaults.remove(forKey: PublicZoneServerChangeTokenKey)
            self?.fetchPublicRecordZonesChanges(completion: completion)
            return
        }
        if let token = token {
            Token.temporaryPublicZoneServerChangeToken = token
        }
    }

    operation.fetchRecordZoneChangesCompletionBlock = { [weak self] error in
        self?.save(records: records, recordIDsToDelete: recordIDsToDelete) { error in
            completion?(error)
        }
    }
    operationQueue.addOperation(operation)
}

但是,尽管调用了该方法,但没有获取任何内容,甚至recordChangedBlock在调用闭包时也没有获取任何内容。为什么?

我很确定我在那里有记录:

在此处输入图像描述

而且环境也很好,因为私有开发记录被正确获取(当然使用不同的方法)。我究竟做错了什么?

标签: iosswiftcloudkit

解决方案


要收到公共数据库更改的通知,请CKQuerySubscription为您关心的记录类型创建一个。这是一个例子:

let subscription = CKQuerySubscription(
  recordType: "Question", 
  predicate: NSPredicate(value: true), 
  subscriptionID: "subscriptionQuestion", 
  options: [
    .firesOnRecordCreation, 
    .firesOnRecordUpdate, 
    .firesOnRecordDeletion
  ])

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
subscription.notificationInfo = info

let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: nil)

operation.modifySubscriptionsCompletionBlock = { saved, deleted, error in
  if let error = error{
    print("Add subscription error: \(error)")
  }else{
    print("Successfully added Question subscription.")
  }
}

//:::
let container = CKContainer(identifier: "...")
container.publicCloudDatabase.add(operation)

推荐阅读