【问题标题】:Are public database subscription notifications received by all users with the same subscription?是否所有订阅相同的用户都会收到公共数据库订阅通知?
【发布时间】:2015-06-02 12:45:06
【问题描述】:

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

我正在使用公共数据库。

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

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

订阅是否设计为只能在同一用户的设备之间使用?

这里是描述订阅的文档:

使用 CKSubscription 对象来跟踪服务器上发生的更改。 订阅的行为类似于服务器上的持久查询,可以 跟踪记录的创建、删除和修改。什么时候 发生变化时,它们会触发推送通知的传递,以便 您的应用可以做出适当的响应。

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

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

更新

*每个用户都有一个具有相同谓词的订阅,基本上专注于具有特定属性值的单个记录类型。

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

文档如下:

当此属性为 YES 时,服务器包含 content-available 推送通知的有效负载中的标志。该标志导致系统 唤醒或启动当前未运行的应用程序。该应用程序是 然后给定后台执行时间以下载与 推送通知,例如更改的记录集。 如果 应用程序已在前台运行,包含此标志 没有额外的效果,并且通知被传递到应用程序 像往常一样委托处理。

recordType的安全权限是:

进一步更新

检查了设备在应该收到推送时没有收到推送的日志并看到了:

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

重启了设备,现在可以正常使用了!

【问题讨论】:

  • 亲爱的投票者,这个问题有什么问题?

标签: cloudkit


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    更新

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

    还有其他人面临这个问题吗?

    更新 2

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

    【讨论】:

    • 根据 [Apple Push Notification Service ](developer.apple.com/library/ios/documentation/…) 文档,content-available 标志会导致您的应用程序在后台被唤醒,并且不会提醒用户。不过,您需要在应用程序的 UIBackgroundModes 数组中包含 remote-notification 值。如果您错过了这一点,那么您的应用程序将不会被唤醒,并且看起来好像您没有收到任何推送。
    • 添加 alertBody 只是导致通知作为常规推送通过并提醒用户,这就是您看到通知的原因。
    • 不是在寻找用户更新,只是想让应用静默更新数据,后台模式设置正确
    • @farktronix - 我已将所有信息添加到上述问题中,如果您需要更多详细信息,请告诉我。
    • 包含您要监控的记录的记录区域的ID。此参数不能为 nil。
    【解决方案3】:

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

    如果订阅了记录类型和谓词,则该用户应该收到有关此记录类型和谓词中的记录有任何更改的通知。

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

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

    如果你觉得这很复杂,那么你可以试试EVCloudKitDao

    【讨论】:

    • 感谢@edwin-vermeer,我了解您在此处概述的内容。当您说“[if] 此 [recordType] 和谓词中的记录有任何更改”时,这是否意味着无论哪个用户编辑公共数据库中的记录,所有已设置订阅的用户都会收到更改通知?因为这是我没有经历的部分,所以当它是不同设备上的同一用户时,我会收到通知,但当它是另一台设备上的另一个用户时(最后一部分不太清楚,让我知道它是否有意义) )。
    • “因此,如果您的应用中有订阅的数据 [集合],那么您也应该在修改数据后更新它” - 不确定这意味着什么......
    • 假设您在应用程序中查询记录类型 A,并为记录类型 A 创建订阅。然后,如果您从自己的手机添加新记录,则不会收到通知。因此初始查询的结果中将缺少新创建的记录。如果您的内存中仍有该结果,那么您还应该更新该结果。
    • 好的,我的问题与当前用户没有收到他保存的记录的通知无关。我的问题是有两个不同的用户,他们对相同的记录类型有相同的订阅,但是当用户 A 保存记录时,通知没有为用户 B 发布,但是,另一台设备上的用户 A 收到通知。
    • 好的 - 我认为我的问题是我没有将 zoneID 设置为 nil。我正在尝试将其设置为公共数据库的默认 zoneID,这可能是问题所在。如果是这种情况,我今晚会尝试并关闭这个问题,无论如何感谢 Edwin,感谢您的帮助。
    猜你喜欢
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2020-12-29
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多