iOS 本地通知与后台任务设计
iOS 本地通知与后台任务设计
本地通知可以在应用不活跃时提醒用户,后台任务则让系统在合适时机提供有限执行机会。两者都由系统调度,不能保证精确到某一秒,也不能被当成长时间常驻服务。设计时要把用户提醒、业务数据刷新和即时执行需求区分开。
一、先判断是否需要通知
通知会打断用户,只应用于用户明确关注且具有时效的信息。应用内红点、页面状态更新不一定需要系统通知。
请求通知权限前,应说明通知类型和价值,并允许用户在应用内控制不同业务类别。
二、系统权限与业务订阅分离
系统授权决定应用能否显示通知,业务订阅决定用户想接收什么。两者组合形成最终能力:
struct NotificationCapability {
let systemAllowed: Bool
let orderUpdatesEnabled: Bool
var canNotifyOrderUpdates: Bool {
systemAllowed && orderUpdatesEnabled
}
}
用户关闭订单提醒时,不应再次请求系统权限;系统拒绝时,应用内消息仍可正常展示。
三、使用稳定标识调度
同一业务提醒更新时,应使用稳定请求标识先替换旧计划,避免重复通知。
struct ReminderPlan {
let identifier: String
let title: String
let body: String
let fireDate: Date
}
具体通知中心封装负责创建内容与触发器。业务层不需要直接依赖所有系统类型。
四、取消过期提醒
订单完成、用户删除日程或退出账户后,相关待发通知应立即取消。取消范围必须基于稳定业务标识,不能无条件清除其他功能的提醒。
应用还应清理不再有价值的已投递通知,避免通知中心长期堆积旧状态。
五、通知内容保护隐私
锁屏可能被他人看到,高敏感详情不应直接出现在标题和正文中。可以显示通用提示,用户进入应用并完成必要校验后查看完整内容。
通知附带数据只保存打开目标所需的最小业务标识,不传递完整用户对象或敏感信息。
六、处理用户点击
用户点击通知后,应用可能处于前台、后台或完全未启动。入口应统一解析业务标识,等待账户和路由准备完成后再打开目标页面。
如果对象已经删除、账户不匹配或权限失效,应显示明确结果,而不是跳转到空页面。必填参数缺失则按通知契约记录问题,无需猜测目标。
七、理解后台刷新限制
后台刷新由系统根据使用习惯、电量和网络状况选择时机。应用只能提交任务请求,不能依赖固定周期。
适合后台刷新的工作包括少量内容预取、同步待办状态和维护缓存。不适合精确定时倒计时、持续定位或长时间计算。
八、任务要短小且可取消
后台任务开始后,应立即执行核心工作,并设置到期处理:
final class BackgroundRefreshOperation {
private var task: Task<Void, Never>?
func start(completion: @escaping (Bool) -> Void) {
task?.cancel()
task = Task {
do {
try await repository.refreshSummary()
guard !Task.isCancelled else {
completion(false)
return
}
completion(true)
} catch is CancellationError {
completion(false)
} catch {
completion(false)
}
}
}
func expire() {
task?.cancel()
task = nil
}
}
系统完成回调必须按框架要求调用一次。示例把取消视为未完成,真实项目还应通过统一封装保证回调线程和单次调用约束。
九、保存可恢复进度
后台任务可能随时到期。大量同步应按小批次提交,每批成功后记录进度,下一次从稳定位置继续。不要等所有工作完成后才保存结果。
非幂等操作不能在后台无条件重试。需要服务端稳定标识和明确重放规则。
十、兼容与测试
后台任务 API 和通知能力有系统版本要求,应通过项目现有调度组件使用,不直接调用最低版本不支持的接口。
测试重点包括:
- 权限允许、拒绝和设置变更。
- 同标识提醒更新后只有一条。
- 业务完成后待发通知被取消。
- 冷启动点击能够恢复正确路由。
- 后台任务到期后立即停止。
- 进程重启后同步进度仍可继续。
- 敏感内容不会出现在锁屏通知中。
总结
本地通知负责提醒,后台任务负责系统允许时的有限维护,两者都不是精确定时服务。通过系统权限与业务订阅分离、稳定标识更新通知、短小可取消的后台工作和可恢复进度,应用才能在系统限制下保持可靠且不过度打扰用户。
- 点赞
- 收藏
- 关注作者
评论(0)