iOS 13.1无法接收静默CKQuerySubscription通知。

7

我的应用程序使用CloudKit查询订阅和通知作为基于CloudKit的同步解决方案的一部分。这在iOS 12、macOS 10.14甚至macOS 10.15 beta上运行得很完美,但不适用于iOS 13.0、iOS 13.1、iPadOS 13.1和tvOS 13.0。

删除并重新创建订阅并不能解决这个问题。

这是一个已知的问题吗?

根据文档,CloudKit订阅没有任何改变。或者我错过了什么?


2
在开发过程中,我在所有版本的iOS上都会时不时地遇到这个问题。有些日子我能收到通知,而有些日子则不能。而且这种情况在不同的设备上也是断断续续的。有一天我的iPhone可以收到通知,但我的iPad却不能。另一天则恰好相反。这真的很令人沮丧。我无法猜测自己已经浪费了多少时间来调试代码,因为我一直以为这是我的代码问题。 - rmaddy
1
顺便说一下 - 刚刚我在运行13.1的iPad上获取CloudKit通知没有问题。但几个小时前就不行了。唉。 - rmaddy
1
添加了我的反馈报告,建议你也这样做。 - the Reverend
@theReverend iOS 13.1.1更新并没有带来任何改进。我正在等待苹果开发技术支持的回复。 - Ely
很奇怪,那我们是不是应该使用CKDatabaseSubscription呢?但是这个类没有指定订阅何时触发通知的方法(例如firesOnRecordDelete)。 - powertoold
显示剩余6条评论
2个回答

5
在iOS 13.x和tvOS 13.x中接收静默CKQuerySubscription通知时,您的CKQuerySubscription的NotificationInfo中的soundName和alertBody参数不应被设置。过去,我们学会了对这些参数使用空字符串来使整个CloudKit订阅工作正常,但现在已经过时了。显然,苹果公司已经解决了一个旧的错误,导致使用这个“解决方法”的应用程序出现问题。我已经在iOS 12.4.2、iOS 13.1.2、tvOS 13.0、macOS 10.14.6和macOS 10.15 GM上进行了测试。
let info = CKSubscription.NotificationInfo()
info.shouldSendContentAvailable = true
// info.soundName = "" // Don't set this property
// info.alertBody = "" // And also leave this this property alone
let subscription = CKQuerySubscription(recordType: "yourRecordType", predicate: NSPredicate(value: true), subscriptionID: "yourSubscription", options: [CKQuerySubscription.Options.firesOnRecordUpdate, CKQuerySubscription.Options.firesOnRecordDeletion])
subscription.notificationInfo = info

// You must first delete the old subscription to change the sound name            
let deleteOperation = CKModifySubscriptionsOperation(subscriptionsToSave: nil, subscriptionIDsToDelete: ["yourSubscription"])      
yourContainer.privateCloudDatabase.add(deleteOperation)

let createOperation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: nil)
createOperation.addDependency(deleteOperation)        
yourContainer.privateCloudDatabase.add(createOperation)

自从iOS 11以来,我就没有使用过soundName参数,但我的通知仍然无法正常工作。可能是通过删除现有的CKSubscriptions并重新创建它们来修复了问题。这可能与soundName无关... - powertoold
我注意到的另一件事是,CloudKit仪表板不再有关于订阅的选项卡/部分。我曾经能够在仪表板中查看并编辑所有我的订阅。 - powertoold
1
@powertoold 你是否已经尝试重新创建你的订阅?如果我像以前一样用空的声音名称重新创建订阅,原来的问题就会回来。可以通过单击最初显示“记录”或“记录类型”的大型下拉菜单(取决于所选的主视图(数据或方案))在CloudKit仪表板中检查订阅。请注意,您无法编辑任何内容,只能删除内容。此外,声音名称属性不会显示。 - Ely
我还没有尝试重新创建订阅。如果我这样做可能会开始工作,但是我过去曾因另一个与CloudKit相关的订阅问题而这样做。我不确定为什么设置空soundName与否会造成这样的问题。苹果应该很容易忽略空的soundName参数。目前,我将alertBody设置为""(尽管我的面板显示alertBody为空参数),因此这个问题可能会再次出现在alertBody上。如果只需删除soundName即可解决,则我宁愿苹果修复这些明显的问题。 - powertoold
请注意,soundName问题不是由我检测出来的,而是由苹果公司检测出来的。我从未为查询订阅设置alertBody,因此在iOS 13中可能会出现问题,特别是如果将其设置为空字符串。唯一必要的参数设置是shouldSendContentAvailable = true。 - Ely

4

我的应用在iOS 13中也停止使用静默通知。

当我看到Ely的答案时,我立即去检查是否设置了通知的声音名称。尽管我没有任何设置,但我看到了空字符串的alertBody并决定尝试不带它。重新创建订阅后,在iOS 13中,静默通知又开始工作了。在阅读文档时,似乎显而易见,您不希望在静默通知上收到警报消息。然而,我记得在某个iOS版本上添加它以使其工作。

在我的情况下,我像这样创建RecordZoneSubscription:

CKSubscription * subscription = [[CKRecordZoneSubscription alloc] initWithZoneID:self.dataZone.zoneID subscriptionID:[self mainPrivateSubscriptionID]];

CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
notificationInfo.shouldBadge = false;
notificationInfo.alertBody = @""; // THE CULPRIT
notificationInfo.shouldSendContentAvailable = true;
subscription.notificationInfo = notificationInfo;

解决方案:
CKSubscription * subscription = [[CKRecordZoneSubscription alloc] initWithZoneID:self.dataZone.zoneID subscriptionID:[self mainPrivateSubscriptionID]];

CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
notificationInfo.shouldBadge = false;
notificationInfo.shouldSendContentAvailable = true;
subscription.notificationInfo = notificationInfo;

1
这真的很傻。你是对的。在之前的版本中,我们需要添加一个空的alertBody才能使通知工作,现在我们必须将其删除。更糟糕的是,在CloudKit仪表板中,即使已将其设置为空字符串,它也显示为“nil”。苹果本可以让它保持原样而不是破坏它。 - powertoold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接