gpt4 book ai didi

ios - CKFetchNotificationChangesOperation 返回旧通知

转载 作者:可可西里 更新时间:2023-11-01 05:44:08 25 4
gpt4 key购买 nike

我正在开发一个基于 CloudKit 的应用程序,它使用 CKSubscription 通知来跟踪对公共(public)数据库的更改。每当应用程序收到推送通知时,我都会使用 CKFetchNotificationChangesOperation 检查通知队列,并在处理后将每个通知标记为已读:

    __block NSMutableArray *notificationIds = [NSMutableArray new];

CKFetchNotificationChangesOperation *operation = [[CKFetchNotificationChangesOperation alloc] initWithPreviousServerChangeToken:self.serverChangeToken];
operation.notificationChangedBlock = ^(CKNotification *notification) {
[notificationIds addObject:notification.notificationID];
[self processRemoteNotification:notification withCompletionHandler:completionHandler];
};

__weak CKFetchNotificationChangesOperation *operationLocal = operation;
operation.fetchNotificationChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSError *operationError) {
if (operationError) {
NSLog(@"Unable to fetch queued notifications: %@", operationError);
}
else {
self.serverChangeToken = serverChangeToken;
completionHandler(UIBackgroundFetchResultNewData);

// Mark the processed notifications as read so they're not delivered again if the token gets reset.
CKMarkNotificationsReadOperation *markReadOperation = [[CKMarkNotificationsReadOperation alloc] initWithNotificationIDsToMarkRead:[notificationIds copy]];
[notificationIds removeAllObjects];

markReadOperation.markNotificationsReadCompletionBlock = ^(NSArray *notificationIDsMarkedRead, NSError *operationError) {
if (operationError) {
NSLog(@"Unable to mark notifications read: %@", operationError);
}
else {
NSLog(@"%lu notifications marked read.", (unsigned long)[notificationIDsMarkedRead count]);
}
};

[[CKContainer defaultContainer] addOperation:markReadOperation];

if (operationLocal.moreComing) {
NSLog(@"Fetching more");
[self checkNotificationQueueWithCompletionHandler:completionHandler];
}
}
};

[[CKContainer defaultContainer] addOperation:operation];

据我所知,将通知标记为已读将使它不会出现在未来的队列提取中,即使服务器更改 token 重置为零也是如此。相反,当只有 1 或 2 个新通知时,我在每次提取时都会收到很多带有非零更改 token 的旧通知。我可以从 notificationType 标志中检测到旧的,但我担心它们会出现。我在某处错过了一步吗?

最佳答案

我知道这有点老了,但我遇到了同样的问题。我想我明白了(至少对我来说是这样)。

在我的代码中,我做的和你一样:即将所有的 notificationID 添加到一个数组中,并在我的 CKMarkNotificationsReadOperation 中使用它,并且每次都得到返回的所有通知(尽管,正如你所指出的,一种“ReadNotification”)。

我更改了我的代码,以便我只向我的数组添加"new"通知,而不是“ReadNotification”项,然后发送这些通知。这样就解决了。

似乎将通知发送回服务器以标记为已读,即使它已经被标记为已读,也会导致它再次返回为“ReadNotification”。

我希望这对某人有帮助。

关于ios - CKFetchNotificationChangesOperation 返回旧通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26631311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com