是否所有用户都使用相同的订阅接收公共数据库订阅通知?

时间:2015-03-29 14:29:32

标签: cloudkit

我已经设置了一个CKSubscription *,以便我收到记录类型的更改。

我正在使用公共数据库。

当我使用相同的用户(相同的iCloud帐户)进行测试时,我会收到通知。

如果我使用其他用户(不同的iCloud帐户),我不会收到通知。

订阅是否仅适用于同一用户的设备?

以下是描述订阅的文档:

  

使用CKSubscription对象跟踪服务器上发生的更改。   订阅就像服务器上的持久查询一样   跟踪记录的创建,删除和修改。什么时候   发生更改时,它们会触发推送通知的传递   您的应用可以做出适当的回应。

https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKSubscription_class/index.html#//apple_ref/occ/cl/CKSubscription

无论哪个用户编辑记录,我都希望收到通知,而订阅谓词仍应匹配。

更新

*每个用户都有一个具有相同谓词的订阅,主要关注具有特定属性值的单个recordType。

此订阅的有效负载仅用于推送shouldSendContentAvailable = YES。

文档内容如下:

  

当此属性为YES时,服务器包含content-available   推送通知的有效负载中的标志。该标志导致系统   唤醒或启动当前未运行的应用程序。该应用程序是   然后给出后台执行时间来下载与之相关的任何数据   推送通知,例如更改的记录集。 如果   应用程序已经在前台运行,包含此标志   没有其他效果,通知将传递给应用程序   代理人照常处理。

recordType的安全权限是:

enter image description here

进一步更新

检查设备未接收推送的日志,并查看:

apsd[85]: Silent Push: Deny app not available

重新启动设备,现在工作正常!

3 个答案:

答案 0 :(得分:3)

为了在上面的答案中添加另一个维度,每个iCloud帐户记录CKSubscriptions'不是每个设备。登录到同一iCloud帐户(*)的所有设备将根据该iCloud帐户下任何设备输入的任何订阅接收所有通知。以上是指用户'他们的意思是“登录到iCloud帐户的任何设备”。

  • 除了修改导致通知的文件的特定设备

答案 1 :(得分:2)

此行为是由于我的CKSubscription配置错误造成的。如果我们希望所有用户都从订阅接收通知,那么它不应该设置zoneID(应保持为零)。我将zoneID设置为defaultRecordZone中的值,这会将通知限制为当前用户,因为defaultRecordZone的用户是当前用户。

<强>更新

终于解决了这个问题。它不仅是zoneID的问题,而且似乎还有一个bug。我的订阅notificationInfo只是将shouldSendContentAvailable设置为YES。这不会导致订阅通知触发由当前用户以外的任何人(u1d1-&gt; u1d2,而不是u1d1&gt; u2d2)所做的更改。我只是添加了一个alertBody并且通知开始触发。

其他人是否面临此问题?

更新2

重新启动设备解决了这个问题。

答案 2 :(得分:1)

每个用户都应该创建自己的订阅。订阅仅对创建它的用户有效。在应用启动时,您应该测试订阅是否适用于当前用户(您可以使用database.fetchAllSubscriptionsWithCompletionHandler功能)

然后,如果订阅了recordType和谓词,那么该用户应该收到有关此recorderType和谓词中记录有任何更改的通知。

无法保证每次更改都会被推送。如果有多个通知,则可能会发生您不会收到所有通知。这就是为什么在收到通知后您还应该在服务器上查询未完成的订阅通知(使用CKFetchNotificationChangesOperation

如果您在设备上创建了记录,则不应在该设备上收到有关该记录的通知。因此,如果您的应用中有订阅的数据集合,那么您也应该在修改数据后更新此数据集。

如果您认为这很复杂,那么您可以尝试EVCloudKitDao