iOS 26 Message Filter Extension not invoked after conversation is moved to Spam

We're seeing a behavior change with ILMessageFilterExtension on iOS 26 and would like to confirm whether this is expected or a regression.

Environment

  • iOS: 26.x
  • Framework: IdentityLookup
  • Extension type: ILMessageFilterExtension

Behavior

For a new sender:

  1. An incoming SMS arrives.
  2. handle(_:context:completion:) is invoked.
  3. The extension returns a classification.
  4. The conversation is moved to the Spam folder.
  5. Subsequent SMS messages in the same conversation are delivered to the Spam folder, but handle(_:context:completion:) is no longer invoked for any new messages.

Expected behavior

We expected the message filter extension to be invoked for every incoming SMS, regardless of the current conversation folder, allowing the extension to evaluate each message independently.

Actual behavior

Once the conversation is in the Spam folder, all subsequent messages bypass the extension completely. The extension receives no callback, making it impossible to:

  • Re-evaluate new messages using updated filtering logic.
  • Change the classification if sender reputation changes.
  • Apply cloud-based or dynamic filtering policies on subsequent messages.

Questions

  1. Is this behavior expected in iOS 26?
  2. Has the message filtering pipeline changed so that conversations already classified as Spam no longer invoke ILMessageFilterExtension?
  3. Is there any documented API or recommended approach to have the extension evaluate every incoming message for an existing Spam conversation?
  4. If this is not expected, is this a known issue?

If anyone from Apple or other developers can confirm whether this is by design, it would be greatly appreciated.

Thanks for the great post.

I believe to optimize battery life, system performance, and memory, iOS minimizes the number of times app extensions are woken up in the background. Once a sender or conversation is classified as Spam by the extension, the system caches this classification for the conversation. Subsequent messages from that same sender are automatically routed to the Spam folder without invoking the extension's handle(_:context:completion:) method again. Is that what you are seeing?

I do believe, this caching mechanism has been part of the system's to handle high volumes of spam efficiently.

My recommendation is to watch the WWDC22 video, so I think this is being there for a while. Would be great to get input from that team about this.

WWDC22 Explore SMS message filters https://developer.apple.com/videos/play/wwdc2022/110341/

Albert  WWDR

iOS 26 Message Filter Extension not invoked after conversation is moved to Spam
 
 
Q