PAYATHON 2026

IdentityLookupUI 举报后消息被移入“最近删除”,如何保留?

数据阿明

结论

公开 API 中没有专门用于“上报但保留消息原位置”的 ILClassificationAction,也没有文档说明存在这样的 userInfo key。现有依据也不足以认定所有 Unwanted Communication Reporting Extension 在完成举报后都必须删除原消息。

.none 表示不执行后续分类动作,.reportNotJunk 表示上报“非垃圾”分类。两者都不是控制 Messages app 文件夹位置的接口。Apple 的分类动作说明

当前代码需要先澄清什么

示例中,只有 self.type == "spam" 时返回 .reportJunk,其他情况一律返回 .none。因此,“安全”分支没有表达“向后端上报非垃圾消息”的意图。

Apple 的流程说明指出,返回 .none 时,系统关闭扩展界面,不再执行其他动作;返回 .reportJunk 或 .reportNotJunk 时,系统才根据配置生成并发送报告。因此,不能依靠 .none 加上 userInfo 实现系统代发的“安全”报告。Apple 的举报流程说明

response.userInfo 用于携带发送给服务器的附加 JSON 数据,键和值都必须能够进行 JSON 序列化。示例中的 "type" 和 "sender" 是业务数据;没有公开文档表明自行添加 "keepMessage" 一类字段可以控制消息保留或移动。Apple 的 userInfo 说明

如何正确表达“安全”分类

如果界面只有“垃圾”和“安全”两个有效选项,并且两种选择都需要上报,可以采用下面的映射。如果界面还允许未选择、未知或取消状态,应另外处理,不能把所有非垃圾状态都视为安全。

override func classificationResponse(for request: ILClassificationRequest) -> ILClassificationResponse {
    let action: ILClassificationAction =
        (self.type == "spam") ? .reportJunk : .reportNotJunk

    let response = ILClassificationResponse(action: action)
    response.userInfo = [
        "type": self.taggedType,
        "sender": self.sender
    ]

    return response
}

这段修改明确了分类语义,但不能保证消息留在原位置。.reportNotJunk 的公开含义是报告该通信并非垃圾,文档没有将其定义为消息恢复或文件夹移动操作。Apple 的 reportNotJunk 说明

怎样排查“返回 .none 仍然删除”

原始材料没有给出 iOS 版本、完整的进入路径和最小复现结果,目前无法判断这是特定系统版本的问题、Messages app 入口的行为,还是其他处理逻辑造成的。

建议按以下顺序排查:

  1. 暂时让回调只返回 ILClassificationResponse(action: .none),移除 userInfo 和额外业务处理。记录回调是否执行、实际返回值以及消息是否仍被移动。
  2. 记录从 Messages app 的哪个菜单进入,是否经过带有“删除”含义的操作,以及操作对象是单条消息还是整个会话。
  3. 分别测试系统“取消”、完成后返回 .none 和完成后返回 .reportNotJunk 的情况,观察消息位置和后端收件情况。扩展界面关闭不代表报告已经送达。
  4. 记录设备型号、iOS 版本及 build、应用构建方式,并在可用的其他系统版本上对照复现。
  5. 如果最小实现返回 .none 后仍会移动消息,将上述步骤、录屏和相关日志提交给 Apple,说明实际表现与公开流程说明之间的差异。

Apple 工程师说明过,扩展结束后,系统会为保护隐私删除扩展自己的容器。容器清理不能证明 Messages app 中的原短信必须被删除。Apple 工程师对扩展容器清理的说明

必须保留原消息时,有什么替代方案

如果产品要求“提交反馈不能改变原短信的位置”,目前没有已确认的公开参数可以让这个扩展保证该行为,也不能依赖扩展在完成后自动把短信移回去。

可以提供独立的应用内反馈入口,由用户主动复制短信内容、粘贴到应用并确认提交,再由主应用向后端发送。这个方案无需执行 Messages app 的举报流程,但提交内容由用户主动提供,不能假定主应用能够自动读取短信或拿到扩展的完整请求数据。

在目标设备上验证消息去向之前,不宜把扩展里的“安全”按钮描述成“保留消息”或“恢复消息”。它能准确表达的是一次非垃圾分类反馈。

备注:内容仅供参考。