目前正在开发一个快速应用程序,其中包含使用云套件填充的表格视图。
由于某种原因,当应用程序打开时,表格视图显示为空白,但是一旦触摸屏幕,我的条目列表就会突然出现。
我在下面提供了整个 Tableview 大师班,我的想法是这与功能有关viewDidLoad(),但无论我尝试什么,我似乎都无法弄清楚。
import UIKit
import CloudKit
import MobileCoreServices
class MasterViewController: UITableViewController {
//// DB setup (outside DidLoad)
let container = CKContainer.defaultContainer()
var Database: CKDatabase?
var currentRecord: CKRecord?
var detailViewController: DetailViewController? = nil
///Array to save dbrecords
var objects = [CKRecord]()
/// Initialise object of ClipManager class
let MyClipManager = ClipManager()
override func viewDidLoad() {
super.viewDidLoad()
// Database loading on runtime
Database = container.privateCloudDatabase
///Build Query
let query = CKQuery(recordType: "CloudNote", predicate: NSPredicate(format: "TRUEPREDICATE"))
///Perform query …Run Code Online (Sandbox Code Playgroud) 我已成功将CKShareURL 保存到 CloudKit,并且可以看到用户位于INVITEDCloudKit 仪表板中。我的 Mac 应用程序通过电子邮件将 URL 发送给该人,但当他们单击该 URL 时,他们只能在 icloud.com 上看到此屏幕:
单击“确定”会使所有内容消失,因此您只能看到网页上的背景。
我的理解是,该 URL 应该打开我的 Mac 应用程序,它将userDidAcceptCloudKitShareWith在我的应用程序委托中触发。但它什么也没做。
这可能是因为我的应用程序正在开发中,尚未出现在 Mac App Store 中吗?我是否需要自定义 URL 方案才能打开我的应用程序?
关于这些东西的文档非常稀疏。我很乐意有人能提供的任何帮助。
在我的应用程序中,我决定使用 CloudKit 作为我的同步后端。我的应用程序与项目无关,但为了简单起见,我们可以这么说......
所以......在我的应用程序中,用户将有多个项目。其中每个都包含与该项目关联的多个实体。比如任务,还有提醒等等。
所有这些数据将存储在用户的私人数据库中。公共数据库中不会有任何内容。
现在一个用户可以拥有多个项目。
我的第一个问题:每个项目都应该在它自己的 CKRecordZone 中吗?我没有看到这样做的好处?!?有人可以向我解释一下拥有多个记录区的好处是什么吗?所以目前所有项目都在一个区域。
接下来,我希望用户能够与其他人共享他的所有数据。目前的问题是,由于该项目当前是我数据库中的根记录,我需要为每个项目创建一个共享,对吗?!?在我的应用程序中,单独邀请用户加入每个项目实际上没有意义,因此我想以某种方式对其进行存档。创建一个将项目作为子项目的新根记录,然后用户邀请某人加入这个新根记录是否有意义?
最后一个问题...是否有类似 Sack-Team 之类的组织可以询问有关 CloudKit 的问题?似乎比在 stackoverflow 上开始一个新问题更容易,因为我的问题非常针对我的应用程序......
正如标题所示,我正在发布一个应用程序,该应用程序使用 Core Data 和 CloudKit 在多个设备之间同步用户数据。为了通过 TestFlight 以及稍后通过 App-Store 分发应用程序,我必须将 CloudKit 容器部署到生产模式。不幸的是,目前这对我来说似乎不可能。
因此,通过遵循本指南https://developer.apple.com/documentation/cloudkit/managing_icloud_containers_with_the_cloudkit_database_app/deploying_an_icloud_container_s_schema,我选择了左侧的“部署架构更改”按钮并确认了部署。

之后,我什至收到一条成功消息,但在实际容器选择下方的顶部,它仍然显示“此容器尚未部署到生产环境”。

那么我错过了什么?
我有一个应用程序用于CloudKit存储数据.当我测试,从Xcode安装时,它运行良好.当我提交到iTunes Connect并安装为beta App时,它不会通过某些CloudKit启动过程.我现在不是确切的问题.难道我需要CloudKit` 部署到生产中吗?
很难测试.我无法调试TestFlight版本,只能调试Xcode版本,但是可行.
在我正在制作的应用程序中,将从iCloud加载应用程序的大量数据.我的问题是它不会将数据加载到集合视图中,直到它完成接收所有数据(这需要一段时间).我希望应用程序在收集数据时将数据加载到集合视图中,因此用户无需等待.或者让应用程序一次只加载一些数据会更好吗?我该怎么做呢?这是我用来加载数据的代码.
注意:我在这个项目中使用swift.
func loadInfo() {
let predicate:NSPredicate = NSPredicate(value: true)
let query:CKQuery = CKQuery(recordType: "Data", predicate: predicate)
query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
if let database = self.publicDatabase {
database.performQuery(query, inZoneWithID: nil, completionHandler: { (records:[AnyObject]!, error:NSError!) in
if error != nil {
self.alert("Error: \(error.localizedDescription)", Message: "Make sure iCloud is turned on and you are connected to the internet")
}
else {
dispatch_async(dispatch_get_main_queue()) {
self.array.removeAll(keepCapacity: false)
for record in records {
let usernameRecord:CKRecord = record as CKRecord
self.array.append(usernameRecord.objectForKey("Info") as String)
} …Run Code Online (Sandbox Code Playgroud) 这是一段代码,我在其中修改用户私有CloudKit DB上的一些记录.
let op = CKModifyRecordsOperation(recordsToSave: recordsToModify, recordIDsToDelete: [])
op.savePolicy = CKRecordSavePolicy.ChangedKeys
op.modifyRecordsCompletionBlock = { saved, deleted, err in
println("modified all ... \(saved.count) w err '\(err)' \(err != nil ? err.userInfo : [:])")
}
self.privateDB.addOperation(op)
Run Code Online (Sandbox Code Playgroud)
这非常有效:
modified all ... 284 w err 'nil' Optional([:])
Run Code Online (Sandbox Code Playgroud)
但是我时不时地得到以下输出:
modified all ... 0 w err '<CKError 0x7f9210e92840:"Zone Busy" (23/2029);
"Zone busy">' Optional([NSDebugDescription: CKInternalErrorDomain: 2029,
NSLocalizedDescription: Zone busy, NSUnderlyingError: <CKError 0x7f9210ea7dd0:
"Unknown Error" (2029)>])
Run Code Online (Sandbox Code Playgroud)
我假设这是CloudKit方面的某种打嗝 - 但我如何检测到这一点?我应该怎么处理?
使用CloudKit.js,如何构建一个匹配字段为零的项的查询?我尝试过的每个排列都失败了 - 要么它在字符串值上明显匹配(即"null"或"nil"),要么我实际尝试传递'null'时会抛出错误.
有任何想法吗?以下都不起作用.
filterBy: [{
fieldName: 'customerNumber',
comparator: 'EQUALS',
fieldValue: { value: "nil" }
}]
filterBy: [{
fieldName: 'customerNumber',
comparator: 'EQUALS',
fieldValue: { value: null }
}]
filterBy: [{
fieldName: 'customerNumber',
comparator: 'EQUALS',
fieldValue: { value: "null" }
}]
filterBy: [{
fieldName: 'customerNumber',
comparator: 'EQUALS',
fieldValue: { value: "" }
}]
Run Code Online (Sandbox Code Playgroud) 这似乎是元素,但我似乎无法找到导致我正确的方向.
在我的应用程序中,我有这个代码来访问CloudKit记录:
db.performQuery(query, inZoneWithID: nil) {(results, error) -> Void in
if error != nil {
print("performQuery error on query:\n\(error?.description)")
}
else {
for rec in results! {
// handle the record
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但有时我会收到错误; 例如:
<CKError 0x155cfaa0: \"Request Rate Limited\" (7/2008); Retry after 1.9 seconds>
Run Code Online (Sandbox Code Playgroud)
我理解为什么我得到错误,但我不知道如何访问CKError对象,该对象具有我需要等待的信息并在之后重试操作 - 在这种情况下 - 1.9秒(或消息中显示的任何内容).闭包中的"错误"是NSError.
如何访问CKError记录并检索CkErrorCode和retryAfter属性,以便我可以优雅地处理重试?
对不起,如果这似乎是元素,但我肯定没有发现任何解释它.
我无法让我的应用程序获取所有类型的记录并让每个用户记录放入一个数组.
这是保存记录的代码
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let id = CKRecordID(recordName: "01")
let locationRecord = CKRecord(recordType: "location", recordID: id)
locationRecord.setObject(location, forKey: "location")
let publicData = CKContainer.defaultContainer().publicCloudDatabase
publicData.saveRecord(locationRecord) { record, error in
//..
}
}
Run Code Online (Sandbox Code Playgroud) cloudkit ×10
ios ×8
swift ×5
icloud ×2
arrays ×1
ckrecord ×1
core-data ×1
icloud-api ×1
tableview ×1
testflight ×1
uitableview ×1