2014-10-29 2 views
4

저는 CKSubscription 알림을 사용하여 공개 데이터베이스에 대한 변경 사항을 추적하는 CloudKit 기반 앱에서 작업하고 있습니다. 심지어, 나는 그것이 가져 오는 미래의 큐에 표시에서 계속됩니다 알림 읽기를 표시 알고있는 것처럼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]; 

: 앱에서 푸시 알림을 수신 할 때마다 나는 CKFetchNotificationChangesOperation와 알림 대기열을 확인하고이를 처리 한 후 각 읽기 통지를 표시 서버 변경 토큰이 nil로 재설정 된 경우 대신 1 ~ 2 개의 새로운 토큰이 있어야 할 때마다 무조건 변경 토큰을 사용하여 모든 가져 오기에서 많은 오래된 알림을 얻게됩니다. 나는 notificationType 플래그에서 낡은 것을 검출 할 수있다. 그러나 나는 그것들이 전혀 보이지 않는다고 우려하고있다. 어딘가에 한 걸음도 놓치고 있습니까?

+0

동일한 문제가 있습니다. http://stackoverflow.com/questions/27007014/ios-8-cloudkit-cknotifications-keep-showing-up-mark-a-cknotificationtyperea –

+0

@GregMaletic이 문제가 계속 발생합니까? – user2924482

+0

@ user2924482 아니에요. 왜 지금은 효과가 있으며, 전에는 효과가 없었습니다. 확실하지 않습니다! –

답변

3

나는 이것이 약간 오래된 것을 알고 있지만, 나는 같은 문제에 부딪쳤다. 내 생각에 적어도 내가 알아 낸 것 같아.

내 코드에서 나는 모든 notificationID를 배열에 추가하고이를 내 CKMarkNotificationsReadOperation에 사용하고 모든 알림을 매번 반환했습니다. (언급 한대로, "ReadNotification"형식).

코드를 변경하여 "ReadNotification"항목이 아니라 "ReadNotification"항목이 아닌 "New"알림 만 추가하고 전송했습니다. 그것은 그것을 고쳤다.

서버에 알림을 보내면 이미 표시된 것으로 표시 되어도 "ReadNotification"으로 다시 반환됩니다.

이 정보가 도움이되기를 바랍니다.

+0

흥미 롭습니다. 내 프로젝트는 잠시 중단됩니다. 활성 agin 될 때 확실히 솔루션을 시도합니다. –

+0

감사합니다. 문서를 가져 오면 읽지 않은 알림이 다시 가져 오기 알림으로 반환되지 않는 것처럼 들립니다. – malhal

0

설명서에 "읽은 상태로 알림을 표시하면 후속 가져 오기 작업으로 반환되지 않습니다."... 쿼리 알림 유형으로 ... 이 표시됩니다. 더 명확히 말하면 알림은 읽기 유형으로 반환됩니다.

전혀 반환되지 않은 경우 푸시를 놓친 다른 장치는 변경된 사항을 알지 못합니다.