有没有一种直接的方法来使用CloudKit在两个或多个用户之间共享私人数据?
公共和私人日期显而易见,但似乎没有办法允许一组用户组织自己的孤岛来在他们自己之间共享数据,而不会让系统的所有其他用户和应用程序开发人员都可以使用它.
我有一个学术协作应用程序,但最简单的例子是两个用户之间的私人消息传递.
我想有人可以尝试在CloudKit之上构建一个公钥加密系统来实现这一目标,但这不是我想要的,并且每个组的扩展能力超过两个用户.
任何人都知道可能导致此错误的原因在下面的查询块中返回:
<CKError 0x7f8d5ba27a10: "Internal Error" (1/4000); "Couldn't send a valid signature">
Run Code Online (Sandbox Code Playgroud)
这是我的代码片段:
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *publicDatabase = [container publicCloudDatabase];
//CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:container] publicCloudDatabase];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"doctorName = %@", @"Dr. Harry White"];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"WellnessTest" predicate:predicate];
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error)
{
if (error)
{
// Error handling for failed fetch from public database
NSLog(@"ERROR: %@", error.description);
}
else
{
// Display the fetched records
NSLog(@"Results: %@", results.description);
} …Run Code Online (Sandbox Code Playgroud) 我有一个"表"可能有很多记录,当添加一个新记录时,我需要知道当前表中有多少记录,因为我在计算某些值时使用它.我能找到的最接近的是请求所有这样的条目:
var query : CKQuery = CKQuery(recordType: "Stars", predicate: NSPredicate(format: "mass > 0"))
var request : CKQueryOperation = CKQueryOperation(query: query)
var starCount = 0
request.queryCompletionBlock = {
(cursor:CKQueryCursor!, error:NSError!) in
if error {
completionHandler(ECOResponse.error(error.description), starCount)
} else {
completionHandler(ECOResponse.ok(), starCount)
}
}
request.recordFetchedBlock = {
(record:CKRecord!) in
starCount += 1
}
Run Code Online (Sandbox Code Playgroud)
我希望queryCompletionBlock与CKQueryCursor一起给出一个count或results数组,但不幸的是它没有.
有没有其他方法来计算表中的行数?
在文档中,它表示即使用户没有使用正确的iCloud帐户登录,CloudKit公共数据库也可以读取.但是,如果我没有将我的iOS模拟器或设备连接到iCloud,我无法从我的云数据库中获取任何内容.当我激活我的iCloud帐户时,我可以从我的公共数据库中获取数据.如果有人对我有答案或同样的问题可以回答那会很好.谢谢.
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:@"mycontainer"] publicCloudDatabase];
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:@"idofmyrecord"] ;
[publicDatabase fetchRecordWithID:recordID completionHandler:^(CKRecord *fetchedRecord, NSError *error) {
if(!error){
NSLog(@"****Success***** %@",fetchedRecord[@"field1"]);
}else{
NSLog(@"****Failed***** %@",fetchedRecord[@"field2"]);
}
}];
Run Code Online (Sandbox Code Playgroud) Apple 在NSPersistentCloudKitContaineriOS 13 中引入了,这使我们能够将 CloudKit 与 Core Data 一起使用。我让它在不同的设备上几乎立即工作,但我的主要问题仍然存在。
是否可以以简单的方式与其他用户共享数据?我一直在阅读,CKShare但不知道如何NSPersistentCloudKitContainer以简单的方式从这里开始。
core-data ios cloudkit ckshare nspersistentcloudkitcontainer
我使用NSFileManager获取当前设备磁盘空间(总数,使用数和空闲数),如此...
let systemAttributes = try? NSFileManager.defaultManager().attributesOfFileSystemForPath(NSHomeDirectory() as String)
let space = (systemAttributes?[NSFileSystemSize] as? NSNumber)?.longLongValue
Run Code Online (Sandbox Code Playgroud)
有没有办法为用户的iCloud帐户做类似的事情?我希望能够在应用程序中显示用户的iCloud磁盘空间统计信息.
我正在尝试使用CKQueryOperation,而不是performQuery在我的CloudKit数据库上.
两者都有效,但是当使用CKQueryOperation时,我在设备离线时没有收到错误,但是在使用时我没有收到错误 performQuery
这是我的performQuery例子,数据库是我的CKDatabase
database.performQuery(q, inZoneWithID: nil) { (records:[CKRecord]?, error:NSError?) in
if error != nil {
print(error!.localizedDescription)
return
}
}
Run Code Online (Sandbox Code Playgroud)
设备离线时会出现错误,允许我提示用户.错误是
The internet connection appears to be offline
但是,当我使用a时,我没有错误 CKQueryOperation
let p = NSPredicate(format:"recordID IN %@", student.courses)
let q = CKQuery(recordType: String(Course), predicate: p)
let queryOperation = CKQueryOperation(query: q)
queryOperation.recordFetchedBlock = { record in
// not called without network connection - doesn't enter scope
print(record)
}
queryOperation.queryCompletionBlock = { (cursor: CKQueryCursor?, error: NSError?) …Run Code Online (Sandbox Code Playgroud) 今年夏天,Apple 发布了一个信息丰富的示例应用程序,介绍如何使用 SwiftUI 中的 Core Data、CloudKit 和 UICloudSharingController 在 iCloud 用户之间共享对象。
\n但是,当用于带有 CloudKit 的 Core Data 时,使用 UICloudSharingController 添加更多参与者似乎不起作用。
\nMRE:
\n请参阅上面链接的 Apple 示例应用程序。\n使用其他示例应用程序时也会出现同样的问题,例如来自 RayW 的示例应用程序。\n该问题不会出现在使用纯 CloudKit 的示例中,例如Apple 的这个示例应用程序。
再生产:
\n期望:
\n我们可以使用 UICloudSharingController 通过消息、邮件或其他平台添加新参与者。该链接将在所有设备上正确显示。
现实:
\n在 iOS16+ 上,尝试通过消息共享会使用“协作”框架并导致警告:“发生错误。无法开始协作”(参见图 1)。出现控制台警告(见下文)。触发此错误会中断任何进一步的共享 - 现在也无法为 Mail 和其他平台创建链接(参见图 2)。此外,如果第一次尝试成功,则该链接不会在接收设备上正确显示(参见图 3)。
经过进一步测试,UICloudSharingController 在 iOS15 中也失败了 - 它只是关闭工作表,而不是在紧凑型设备上发出警报。显示现有共享时,UICloudSharingController 肯定会出现问题。
\n …我遇到这个问题,我使用CloudKit向icloud保存了一些内容,但是立即获取结果并不会返回插入的最新数据.
例
let todoRecord = CKRecord(recordType: "Todos")
todoRecord.setValue(todo, forKey: "todotext")
publicDB.saveRecord(todoRecord, completionHandler: { (record, error) -> Void in
NSLog("Saved in cloudkit")
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Todos",
predicate: predicate)
self.publicDB.performQuery(query, inZoneWithID: nil) {
results, error in
if error != nil {
dispatch_async(dispatch_get_main_queue()) {
self.delegate?.errorUpdating(error)
return
}
} else {
NSLog("###### fetch after save : \(results.count)")
dispatch_async(dispatch_get_main_queue()) {
self.delegate?.modelUpdated()
return
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Before saving in cloud kit : 3
CloudKit[22799:882643] Saved in cloudkit
CloudKit[22799:882643] ###### …Run Code Online (Sandbox Code Playgroud)