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:
- An incoming SMS arrives.
handle(_:context:completion:)is invoked.- The extension returns a classification.
- The conversation is moved to the Spam folder.
- 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
- Is this behavior expected in iOS 26?
- Has the message filtering pipeline changed so that conversations already classified as Spam no longer invoke
ILMessageFilterExtension? - Is there any documented API or recommended approach to have the extension evaluate every incoming message for an existing Spam conversation?
- 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.