Highlight
iOS 16 为 SMS 消息过滤扩展新增了 12 个子分类能力,开发者可以将未知发件人的短信自动归类到 Transactional 和 Promotional 的细分子文件夹中,而不是只能简单标记为垃圾信息。
核心内容
短信收件箱的混乱问题
(01:08)
在很多国家,短信已经成为企业通知客户的主要渠道——银行交易提醒、营销活动、快递通知、预约提醒。这些消息来自短码、字母数字码和普通电话号码,混杂在收件箱中,让用户很难找到家人朋友的个人消息。
iOS 提供了”过滤未知发件人”功能,但如果每天收到多条消息,即使过滤后的文件夹也会迅速堆积。
Message Filter Extension 的工作方式
(02:04)
iOS 提供了基于沙盒的扩展模型来分类未知发件人的消息。用户从 App Store 安装过滤应用后,在设置 > 信息 > 未知与垃圾信息中开启过滤并选择一个过滤器。注意,同一时间只能激活一个过滤器。
iOS 14 开始,信息应用会显示三个文件夹:Transactions(交易)、Promotions(推广)和 Junk(垃圾)。无论使用哪个过滤器,这个分类结构都保持一致。
iOS 16 的子分类增强
(03:37)
iOS 16 之前,开发者只能将消息分类到三个顶层类别。iOS 16 新增了 12 个子分类,让分类更精细:
Transactional 子分类:
- Finance(财务)
- Orders(订单)
- Health(健康)
- Public Services(公共服务)
- Weather(天气)
- Reminders(提醒)
- Rewards(奖励)
Promotional 子分类:
- Coupons(优惠券)
- Offers(优惠)
以印度市场为例,用户经常收到大量金融交易短信。这些消息现在可以被整理到 Transactions 下的 Finance 子文件夹中。
两阶段过滤流程
(04:44)
过滤流程分为两个阶段:
配置阶段:用户在设置中选择过滤器时,iOS 16 新 API 会请求过滤器支持的能力。过滤器返回支持的类别和子类别列表,iOS 验证后更新信息应用的收件箱文件夹。
运行时分类阶段:每次收到未知发件人的短信时,iOS 查询过滤器,确定消息属于哪个类别和子类别。过滤器必须返回在配置阶段声明过的能力。
详细内容
创建 Message Filter Extension
(06:32)
在 Xcode 中,为项目添加 Message Filter Extension target。创建后,MessageFilterExtension.swift 会自动生成所需的函数模板。
声明支持的子分类
(07:02)
实现 handle(_capabilitiesRequest:context:completion:) 方法声明能力:
func handle(
_ capabilitiesRequest: ILMessageFilterCapabilitiesQueryRequest,
context: ILMessageFilterExtensionContext,
completion: @escaping (ILMessageFilterCapabilitiesQueryResponse) -> Void
) {
let response = ILMessageFilterCapabilitiesQueryResponse()
// 最多选择 5 个子分类
response.transactionalSubActions = [
.transactionalFinance,
.transactionalOrders,
.transactionalHealth
]
response.promotionalSubActions = [
.promotionalCoupons,
.promotionalOffers
]
completion(response)
}
关键点:
- 最多声明 5 个子分类
transactionalSubActions设置交易类子分类promotionalSubActions设置推广类子分类- 声明后,信息应用会显示对应的子文件夹
消息分类逻辑
(08:16)
实现 handle(_queryRequest:context:completion:) 方法处理 incoming 消息:
func handle(
_ queryRequest: ILMessageFilterQueryRequest,
context: ILMessageFilterExtensionContext,
completion: @escaping (ILMessageFilterQueryResponse) -> Void
) {
guard let message = queryRequest.messageBody else { return }
let response = ILMessageFilterQueryResponse()
switch message {
case _ where message.contains("debited"):
response.filterAction = .transaction
response.filterSubAction = .transactionalFinance
case _ where message.contains("coupon"):
response.filterAction = .promotion
response.filterSubAction = .promotionalCoupons
default:
response.filterAction = .allow
}
completion(response)
}
关键点:
queryRequest.messageBody获取消息正文filterAction设置顶层分类(.transaction、.promotion、.junk、.allow)filterSubAction设置子分类- 如果返回的 action 和 sub-action 组合不匹配,iOS 会忽略 sub-action,只使用 action
- 无法分类的消息返回
.allow,让它进入普通收件箱
分类结果展示
配置完成后,信息应用会显示子文件夹。例如:
- Transactions > Finance:包含 “debited” 关键词的银行短信
- Transactions > Orders:包含订单信息的短信
- Promotions > Coupons:包含 “coupon” 关键词的营销短信
Apple 印度 SMS 过滤器的更新
(11:03)
Apple 在印度的 SMS 过滤器也使用了 iOS 16 的新能力,新增 Finance、Orders 和 Reminders 子文件夹。银行交易进入 Finance,外卖/快递消息进入 Orders,重要事件和待办事项进入 Reminders。
核心启发
-
做什么:为特定市场(如印度、东南亚)开发本地化短信分类工具
-
为什么值得做:这些市场短信使用量大,银行、电商、公共服务都依赖短信通知,分类需求强烈
-
怎么开始:创建 Message Filter Extension,根据当地常见的短信模板关键词配置分类规则
-
做什么:构建智能财务助手,自动整理银行交易短信
-
为什么值得做:Finance 子分类让银行短信有了专门的去处,可以进一步提取交易数据
-
怎么开始:在 Extension 中识别银行短信格式,提取金额、时间、商户信息,存入 App 的数据库生成消费报告
-
做什么:开发促销信息聚合工具
-
为什么值得做:Coupons 和 Offers 子分类让用户不再错过优惠,同时保持收件箱整洁
-
怎么开始:将促销短信分类到对应文件夹,在 App 中提供统一的优惠码管理和过期提醒
-
做什么:创建企业级短信管理方案
-
为什么值得做:企业内部系统(OA、ERP、监控告警)经常通过短信发送通知,需要与营销短信区分
-
怎么开始:为企业定制过滤器,将内部系统短信归类到 Reminders 或 Public Services,确保重要通知不被淹没
关联 Session
- What’s new in Foundation — Foundation 框架新特性
- What’s new in Swift — Swift 语言新特性
- Create your Privacy Nutrition Label — 隐私营养标签创建指南
评论
GitHub Issues · utterances