2015-11-02 59 views
1

Conventional wisdom就是说,如果CloudKit记录位于私人数据库中,则只能由该用户访问。其他用户的私有数据库是否可以通过CKRecordZoneID.ownerName访问?

但是,我发现框架中的一个API,我不明白。 CKRecordZoneID的初始化程序需要两个参数:

zoneName:标识记录区域的名称。该字符串只能包含ASCII字符,不得超过255个字符。要指定当前数据库的默认区域,请为此参数传递CKRecordZoneDefaultName常量。该参数不能是nil或空字符串。

ownerName:创建记录区域的用户。要指定当前用户,请使用CKOwnerDefaultName常数。如果您为此参数指定nil或空字符串,则此方法会引发异常。

我不明白的是ownerName参数的用途。区域在公共数据库中不可用,所以它必须用于私人区域。但是到底是什么?

在文档中还有一些其他好奇的陈述。从CKRecordZoneID的介绍:

...私有数据库的区域只能由拥有该数据库的用户创建

CKContainer

...私有数据库的内容是可见的只有默认当前用户

这一切都让我暗自怀疑的是,如果你的用户和区域名称得到了你的手在其他用户的私人数据库中的现有区域,你可以建立一个CKRecordZoneID和访问它。

这是这种情况?有人试过吗?如果它不起作用,ownerName的目的是什么?

回答

0

我认为这个'子类别'的目的是让特定的用户可以通过区分每个区域与文档引用为“ownerName”的简单文本字符串在他们的私人数据库中创建多个区域。这似乎是什么样的代码在这里做什么:

https://developer.apple.com/library/ios/samplecode/CloudAtlas/Listings/iOS_CloudKitCatalog_AAPLCKRecordViewController_m.html#//apple_ref/doc/uid/TP40014599-iOS_CloudKitCatalog_AAPLCKRecordViewController_m-DontLinkElementID_26

+0

此示例应用程序不会为自定义所有者创建任何区域。它创建的唯一自定义区域是'[[CKRecordZone alloc] initWithZoneName:self.zoneTextField.text]',它不包含'ownerName:'参数。 –

0

创建记录区(只在私有数据库可能),则只能使用创建者的用户记录名称为ownerName,或更好CKCurrentUserDefaultNameCKOwnerDefaultName已弃用),因为创建者(即当前用户)是所有者。

查询/订阅在共享数据库变化,记录区可以具有它的主人比当前的用户不同。因此,您可以通过指定其区域名称和所有者名称来初始化记录区域ID,然后使用记录区域ID执行查询/订阅。

我还没有尝试过使用CloudKit共享,但如果我的理解不正确,请纠正我。

相关问题