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 入口的行为,还是其他处理逻辑造成的。
建议按以下顺序排查:
- 暂时让回调只返回
ILClassificationResponse(action: .none),移除userInfo和额外业务处理。记录回调是否执行、实际返回值以及消息是否仍被移动。 - 记录从 Messages app 的哪个菜单进入,是否经过带有“删除”含义的操作,以及操作对象是单条消息还是整个会话。
- 分别测试系统“取消”、完成后返回
.none和完成后返回.reportNotJunk的情况,观察消息位置和后端收件情况。扩展界面关闭不代表报告已经送达。 - 记录设备型号、iOS 版本及 build、应用构建方式,并在可用的其他系统版本上对照复现。
- 如果最小实现返回
.none后仍会移动消息,将上述步骤、录屏和相关日志提交给 Apple,说明实际表现与公开流程说明之间的差异。
Apple 工程师说明过,扩展结束后,系统会为保护隐私删除扩展自己的容器。容器清理不能证明 Messages app 中的原短信必须被删除。Apple 工程师对扩展容器清理的说明
必须保留原消息时,有什么替代方案
如果产品要求“提交反馈不能改变原短信的位置”,目前没有已确认的公开参数可以让这个扩展保证该行为,也不能依赖扩展在完成后自动把短信移回去。
可以提供独立的应用内反馈入口,由用户主动复制短信内容、粘贴到应用并确认提交,再由主应用向后端发送。这个方案无需执行 Messages app 的举报流程,但提交内容由用户主动提供,不能假定主应用能够自动读取短信或拿到扩展的完整请求数据。
在目标设备上验证消息去向之前,不宜把扩展里的“安全”按钮描述成“保留消息”或“恢复消息”。它能准确表达的是一次非垃圾分类反馈。
备注:内容仅供参考。
