具有相同订阅的所有用户是否都收到 public 数据库订阅通知?
Are public database subscription notifications received by all users with the same subscription?
我已经设置了 CKSubscription*,以便接收对记录类型的更改。
我正在使用 public 数据库。
当我用同一个用户(同一个 iCloud 帐户)进行测试时,我会收到通知。
如果我使用不同的用户(不同的 iCloud 帐户),我不会收到通知。
订阅是否仅适用于同一用户的设备?
这是描述订阅的文档:
Use a CKSubscription object to track changes occurring on the server.
A subscription acts like a persistent query on the server that can
track the creation, deletion, and modification of records. When
changes occur, they trigger the delivery of push notifications so that
your app can respond appropriately.
无论哪个用户编辑记录,我都希望收到通知,并且订阅谓词应该仍然匹配。
更新
*每个用户都有一个具有相同谓词的订阅,基本上专注于具有特定 属性 值的单个记录类型。
此订阅的负载仅用于推送 shouldSendContentAvailable=YES。
文档内容如下:
When this property is YES, the server includes the content-available
flag in the push notification’s payload. That flag causes the system
to wake or launch an app that is not currently running. The app is
then given background execution time to download any data related to
the push notification, such as the set of records that changed. If the
app is already running in the foreground, the inclusion of this flag
has no additional effect and the notification is delivered to the app
delegate for processing as usual.
记录类型的安全权限是:
进一步更新
检查了设备在应该收到推送时没有收到推送的日志,看到:
apsd[85]: Silent Push: Deny app not available
重新启动设备,现在可以正常使用了!
每个用户都应该创建自己的订阅。订阅仅对创建它的用户有效。在应用程序启动时,您应该测试当前用户是否有订阅(您可以为此使用 database.fetchAllSubscriptionsWithCompletionHandler
函数)
然后,如果订阅了 recordType 和 predicate,则该用户应该会收到有关此 recorType 和 predicate 中的记录有任何更改的通知。
不能保证每次更改都会被推送。如果有多个通知,您可能不会收到所有通知。这就是为什么在收到通知后您还应该在服务器上查询未完成的订阅通知(使用 CKFetchNotificationChangesOperation
)
如果您在您的设备上创建记录,那么您应该不会在该设备上收到有关该记录的通知。因此,如果您的应用程序中有订阅数据收集,那么您也应该在修改数据后更新它。
如果你觉得这很复杂,那么你可以试试EVCloudKitDao
此行为是由于我的 CKSubscription 配置错误所致。如果我们希望所有用户都收到来自订阅的通知,那么它不应该设置 zoneID(应该保持为零)。我将 zoneID 设置为 defaultRecordZone 中的值,这会将通知限制为当前用户,因为 defaultRecordZone 的用户是当前用户。
更新
终于解决了问题。这不仅是 zoneID 的问题,而且似乎还有一个错误。我的订阅 notificationInfo 只是将 shouldSendContentAvailable 设置为 YES。这不会导致订阅通知因当前用户以外的任何人所做的更改而触发(u1d1->u1d2,但不是 u1d1>u2d2)。我只是添加了一个 alertBody 并且通知开始触发。
还有其他人遇到过这个问题吗?
更新 2
重启设备解决了问题。
为了给上面的答案添加另一个维度,CKSubscriptions 'per iCloud Account' 不是按设备记录的。登录同一 iCloud 帐户 (*) 的所有设备都将收到基于该 iCloud 帐户下任何设备输入的任何订阅的所有通知。当上面提到 'user' 时,它们的意思是 'any device logged into that iCloud Account'.
- 修改导致通知的文件的特定设备除外
我已经设置了 CKSubscription*,以便接收对记录类型的更改。
我正在使用 public 数据库。
当我用同一个用户(同一个 iCloud 帐户)进行测试时,我会收到通知。
如果我使用不同的用户(不同的 iCloud 帐户),我不会收到通知。
订阅是否仅适用于同一用户的设备?
这是描述订阅的文档:
Use a CKSubscription object to track changes occurring on the server. A subscription acts like a persistent query on the server that can track the creation, deletion, and modification of records. When changes occur, they trigger the delivery of push notifications so that your app can respond appropriately.
无论哪个用户编辑记录,我都希望收到通知,并且订阅谓词应该仍然匹配。
更新
*每个用户都有一个具有相同谓词的订阅,基本上专注于具有特定 属性 值的单个记录类型。
此订阅的负载仅用于推送 shouldSendContentAvailable=YES。
文档内容如下:
When this property is YES, the server includes the content-available flag in the push notification’s payload. That flag causes the system to wake or launch an app that is not currently running. The app is then given background execution time to download any data related to the push notification, such as the set of records that changed. If the app is already running in the foreground, the inclusion of this flag has no additional effect and the notification is delivered to the app delegate for processing as usual.
记录类型的安全权限是:
进一步更新
检查了设备在应该收到推送时没有收到推送的日志,看到:
apsd[85]: Silent Push: Deny app not available
重新启动设备,现在可以正常使用了!
每个用户都应该创建自己的订阅。订阅仅对创建它的用户有效。在应用程序启动时,您应该测试当前用户是否有订阅(您可以为此使用 database.fetchAllSubscriptionsWithCompletionHandler
函数)
然后,如果订阅了 recordType 和 predicate,则该用户应该会收到有关此 recorType 和 predicate 中的记录有任何更改的通知。
不能保证每次更改都会被推送。如果有多个通知,您可能不会收到所有通知。这就是为什么在收到通知后您还应该在服务器上查询未完成的订阅通知(使用 CKFetchNotificationChangesOperation
)
如果您在您的设备上创建记录,那么您应该不会在该设备上收到有关该记录的通知。因此,如果您的应用程序中有订阅数据收集,那么您也应该在修改数据后更新它。
如果你觉得这很复杂,那么你可以试试EVCloudKitDao
此行为是由于我的 CKSubscription 配置错误所致。如果我们希望所有用户都收到来自订阅的通知,那么它不应该设置 zoneID(应该保持为零)。我将 zoneID 设置为 defaultRecordZone 中的值,这会将通知限制为当前用户,因为 defaultRecordZone 的用户是当前用户。
更新
终于解决了问题。这不仅是 zoneID 的问题,而且似乎还有一个错误。我的订阅 notificationInfo 只是将 shouldSendContentAvailable 设置为 YES。这不会导致订阅通知因当前用户以外的任何人所做的更改而触发(u1d1->u1d2,但不是 u1d1>u2d2)。我只是添加了一个 alertBody 并且通知开始触发。
还有其他人遇到过这个问题吗?
更新 2
重启设备解决了问题。
为了给上面的答案添加另一个维度,CKSubscriptions 'per iCloud Account' 不是按设备记录的。登录同一 iCloud 帐户 (*) 的所有设备都将收到基于该 iCloud 帐户下任何设备输入的任何订阅的所有通知。当上面提到 'user' 时,它们的意思是 'any device logged into that iCloud Account'.
- 修改导致通知的文件的特定设备除外