We’re building an iOS app that uses an ILMessageFilterExtension to classify unwanted property-related SMS messages. Our goal is for filtered/junk messages to trigger an automatic scan/classification flow so the main app can show the user useful stats like “X messages blocked since your last check-in,” and ideally categorize them by type such as likely wholesaler, investor, realtor, scam, or unclear.
The bottleneck we’re running into is understanding the correct architecture and limits of the Message Filter Extension. We know the extension can inspect sender/message content and return allow/junk, and we understand that network requests are limited to Apple’s deferred query flow. What we’re trying to clarify is whether there is an Apple-compliant way for the extension to persist lightweight scan results or aggregate counts that the containing app can later read, without violating privacy or extension restrictions. We do not need to export a full copy of message bodies into the app; what we want is a compliant way to keep counters/summary metadata such as blocked count, blocked since last app open, and maybe category counts.
Questions we’re trying to answer:
- Is it acceptable for an ILMessageFilterExtension to persist aggregate scan stats for later display in the main app?
- If so, what is the recommended storage pattern for lightweight counters/metadata?
- Can extension-side classification results be surfaced to the app only as summary data, not raw message content?
- If using deferred network classification, what is the best way to reflect those results back into user-facing counts like “messages blocked since last check-in”?
Our desired user experience is:
- unwanted message hits the filter
- filter classifies it locally or via deferred server lookup
- message is junked if appropriate
- aggregate counters are updated
- when the user opens the app, they see something like:
- 12 messages blocked since your last check-in
- 8 likely wholesalers
- 3 scams
- 1 unclear
We’re mainly looking for guidance on the correct Apple-supported architecture here, especially around what data can be retained/shared between the extension and the containing app.