Explore SMS message filters
System & Services 进阶 20m

探索 SMS 短信过滤器

Explore SMS message filters

2022年6月6日

在 Apple 官方观看视频

一句话判断

iOS 16 给 SMS 过滤加了个大升级——12 个新的子分类让垃圾短信无处遁形,但前提是你得学会用新的 MessageFilter API。

这场 Session 讲了什么

苹果在 iOS 16 中大幅扩展了 SMS 过滤能力。之前的 MessageFilter 框架只能做”过滤”或”放行”这种二选一的判断,现在苹果给它加了 12 个精细化的子分类(sub-category),比如交易通知、促销信息、财务提醒等。

整个过滤流程是这样的:当一条短信进来,系统先通过本地判断做初步筛选;如果本地无法确定,会把消息发给你的 App Extension 做服务端判断。现在你不仅能决定一条消息是不是垃圾短信,还能告诉系统它具体属于哪个类别——这对用户来说体验好很多,因为他可以在信息 App 里看到分类后的列表,而不是一个笼统的”已过滤”文件夹。

Session 重点讲解了 ILMessageFilterCapabilitiesQueryResponse 这个新 API。通过它,你的 App 可以声明自己支持哪些子分类,系统会据此把对应的消息路由给你处理。

值得深挖的点

子分类的粒度设计值得琢磨。 苹果没有简单地把短信分成”垃圾”和”非垃圾”,而是给出了 12 个类别。这背后反映出苹果对用户场景的理解:用户并不只想屏蔽所有非联系人消息,他可能希望保留快递通知,但屏蔽推销短信。这种细粒度的分类思路,对做内容过滤的开发者来说是很好的参考。

本地过滤和服务端过滤的边界。 苹果明确建议,能用本地规则解决的就不要发到服务端——这既是隐私保护,也是性能考虑。但某些场景(比如需要查数据库的号码验证)就必须走服务端。Session 给出了清晰的判断标准:如果你的判断逻辑依赖外部数据,就走服务端;如果是纯文本匹配或正则,就放本地。

代码片段

// 声明你的 App 支持哪些子分类
class MessageFilterExtension: ILMessageFilterExtension {
    
    override func handle(_ queryRequest: ILMessageFilterQueryRequest,
                         context: ILMessageFilterExtensionContext,
                         completion: @escaping (ILMessageFilterQueryResponse) -> Void) {
        
        let response = ILMessageFilterQueryResponse()
        response.action = .filter
        
        // 使用新的子分类能力
        let capabilities = ILMessageFilterCapabilitiesQueryResponse()
        capabilities.allSubCategories = [
            .transactionalOrders,
            .transactionalFinance,
            .transactionalReminders,
            .promotionalOffers,
            .promotionalCoupons
        ]
        
        completion(response)
    }
}

最佳实践

  • 在 Info.plist 里准确声明你支持的子分类,系统会根据这个决定是否把消息路由给你。
  • 本地过滤优先:纯文本匹配、正则表达式这类逻辑放在 handle() 的本地分支里。
  • 服务端请求要做超时处理,苹果对 Extension 的执行时间有严格限制。
  • 给用户一个清晰的解释——你的 App 为什么要读取短信、怎么保护隐私,这些信息在 App Store 审核时很重要。

还有什么值得关注

  • 子分类的判断结果会影响信息 App 的 UI 展示,用户可以在设置里选择信任哪些分类。
  • 如果你之前已经接入了 MessageFilter API,迁移到新的子分类 API 的工作量不大,主要是增加对 ILMessageFilterCapabilitiesQueryResponse 的支持。
  • 隐私方面:苹果强调所有本地处理的消息内容不会离开设备,只有走服务端分支的消息才会发送——而且只发送必要的信息。
WWDC 2022