Conventional wisdom是,如果CloudKit记录在私有数据库中,则只能由该用户访问。
但是,我在框架中发现了一个我不理解的API。 CKRecordZoneID
的初始值设定项有两个参数:
zoneName
:标识记录区域的名称。该字符串必须仅包含ASCII字符,且不得超过255个字符。要指定当前数据库的默认区域,请为此参数传递CKRecordZoneDefaultName
常量。此参数不能是nil
或空字符串。
ownerName
:创建记录区域的用户。要指定当前用户,请使用CKOwnerDefaultName
常量。如果为此参数指定nil
或空字符串,则此方法将引发异常。
我不明白的是ownerName
参数是什么。区域在公共数据库中不可用,因此必须用于私有区域。但到底是什么?
文档中还有其他一些好奇的陈述。来自CKRecordZoneID
的介绍:
...私有数据库中的区域只能由拥有该数据库的用户创建。
来自CKContainer
:
...私人数据库的内容仅对当前用户默认可见。
所有这些让我怀疑,如果你掌握了另一个用户的私人数据库中现有区域的用户名和区域名,你可以构建一个CKRecordZoneID
并访问它。
是这样的吗?有人试过吗?如果它不起作用,ownerName
的目的是什么?
答案 0 :(得分:1)
当创建记录区(仅限私有数据库中)时,您只能将创建者的用户记录名称用作ownerName
或更好CKCurrentUserDefaultName
({ {1}}已弃用)因为创建者(即当前用户)是所有者。
在共享数据库中查询/订阅更改时,记录区域的所有者可以与当前用户不同。因此,您可以通过指定区域名称和所有者名称来初始化记录区域ID,然后使用记录区域ID执行查询/订阅。
我还没有尝试使用CloudKit进行共享,如果我的理解不正确,请纠正我。
答案 1 :(得分:0)
我认为这个子类别的目的是'这样,特定用户可以通过使用文档引用为" ownerName"的简单文本字符串来区分每个区域,从而在其私有数据库中创建多个区域。这似乎是示例代码在这里做的事情: