标签: cloudkit

使用CloudKit进行私有数据共享

有没有一种直接的方法来使用CloudKit在两个或多个用户之间共享私人数据?

公共和私人日期显而易见,但似乎没有办法允许一组用户组织自己的孤岛来在他们自己之间共享数据,而不会让系统的所有其他用户和应用程序开发人员都可以使用它.

我有一个学术协作应用程序,但最简单的例子是两个用户之间的私人消息传递.

我想有人可以尝试在CloudKit之上构建一个公钥加密系统来实现这一目标,但这不是我想要的,并且每个组的扩展能力超过两个用户.

macos cocoa ios icloud cloudkit

16
推荐指数
2
解决办法
4391
查看次数

使用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)

objective-c cloudkit

16
推荐指数
1
解决办法
2117
查看次数

字段“recordName”未标记为可查询 - cloudkit 仪表板

在 Cloudkit Dashboard 中,我选择“记录类型”、“编辑索引”,然后选择“添加基本索引”。我在下拉列表中看到 createTime、createdBy、eTag、modTime、modifiedBy、recordID 和记录字段。我在下拉列表中没有看到 recordName(附图)。如果没有在 recordName 上创建索引,我无法在 cloudKit Dashboard 中查询记录。我收到错误:字段“recordName”未标记为可查询 如何在 recordName 上创建索引? 克里特指数的屏幕截图

dashboard cloudkit ckrecord

16
推荐指数
2
解决办法
2745
查看次数

CloudKit统计记录

我有一个"表"可能有很多记录,当添加一个新记录时,我需要知道当前表中有多少记录,因为我在计算某些值时使用它.我能找到的最接近的是请求所有这样的条目:

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数组,但不幸的是它没有.

有没有其他方法来计算表中的行数?

ios swift ios8 cloudkit

15
推荐指数
1
解决办法
3272
查看次数

没有iCloud登录的CloudKit公共数据库读取

在文档中,它表示即使用户没有使用正确的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)

iphone ios icloud cloudkit

15
推荐指数
2
解决办法
2405
查看次数

使用 NSPersistentCloudKitContainer 在用户之间共享核心数据

Apple 在NSPersistentCloudKitContaineriOS 13 中引入了,这使我们能够将 CloudKit 与 Core Data 一起使用。我让它在不同的设备上几乎立即工作,但我的主要问题仍然存在。

是否可以以简单的方式与其他用户共享数据?我一直在阅读,CKShare但不知道如何NSPersistentCloudKitContainer以简单的方式从这里开始。

core-data ios cloudkit ckshare nspersistentcloudkitcontainer

15
推荐指数
2
解决办法
2362
查看次数

是否有iCloud磁盘容量和使用的API?

我使用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磁盘空间统计信息.

xcode nsfilemanager icloud cloudkit ios9

14
推荐指数
1
解决办法
504
查看次数

设备离线时CKQueryOperation不返回错误

我正在尝试使用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)

ios cloudkit

14
推荐指数
1
解决办法
388
查看次数

UICloudSharingController 不适用于带有 CloudKit 的 Core Data

今年夏天,Apple 发布了一个信息丰富的示例应用程序,介绍如何使用 SwiftUI 中的 Core Data、CloudKit 和 UICloudSharingController 在 iCloud 用户之间共享对象。

\n

但是,当用于带有 CloudKit 的 Core Data 时,使用 UICloudSharingController 添加更多参与者似乎不起作用。

\n

MRE
\n请参阅上面链接的 Apple 示例应用程序。\n使用其他示例应用程序时也会出现同样的问题,例如来自 RayW 的示例应用程序。\n该问题不会出现在使用纯 CloudKit 的示例中,例如Apple 的这个示例应用程序

\n

再生产

\n
    \n
  1. 创建新共享,
  2. \n
  3. 使用 UICloudSharingController 管理共享,
  4. \n
  5. 与更多人分享,
  6. \n
  7. 使用消息或其他服务共享。第一次尝试成功,后续尝试失败。
  8. \n
\n

期望
\n我们可以使用 UICloudSharingController 通过消息、邮件或其他平台添加新参与者。该链接将在所有设备上正确显示。

\n

现实
\n在 iOS16+ 上,尝试通过消息共享会使用“协作”框架并导致警告:“发生错误。无法开始协作”(参见图 1)。出现控制台警告(见下文)。触发此错误会中断任何进一步的共享 - 现在也无法为 Mail 和其他平台创建链接(参见图 2)。此外,如果第一次尝试成功,则该链接不会在接收设备上正确显示(参见图 3)。

\n

经过进一步测试,UICloudSharingController 在 iOS15 中也失败了 - 它只是关闭工作表,而不是在紧凑型设备上发出警报。显示现有共享时,UICloudSharingController 肯定会出现问题。

\n …

core-data ios imessage cloudkit swiftui

14
推荐指数
1
解决办法
1462
查看次数

CloudKit不返回最新数据

我遇到这个问题,我使用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)

ios icloud icloud-api cloudkit

13
推荐指数
1
解决办法
1072
查看次数