关于PushKit VoIP推送下App运行时长及剩余时间查询的技术问询
我结合官方文档和实际开发经验,来解答你关于VoIP推送后台运行的几个问题:
1. 运行时长的官方说明
苹果在PushKit的官方文档里没有明确给出具体的秒数或分钟数,只提到“即使App在后台运行,也会获得处理推送的运行时间”。实际开发中,这个时长会比普通后台任务的30秒要长,但具体数值会根据系统当前的资源状态(比如内存、CPU占用)动态调整,没有固定值。
需要注意的是,VoIP推送唤醒的App处于专门的VoIP后台模式,和普通静默推送触发的后台任务逻辑完全不同——普通静默推送依赖content-available:1,可以通过beginBackgroundTask()获取30秒时长,但VoIP推送是系统直接赋予的特殊运行权限,不适用这套机制。
2. 能否查询剩余时长?
不行。正如你实验发现的,当VoIP推送唤醒App后,调用beginBackgroundTask()是失效的,对应的UIApplication.shared.backgroundTimeRemaining也无法返回有效数值。因为这个属性只针对通过beginBackgroundTask申请的普通后台任务,而VoIP的后台运行不属于这个范畴。
3. 有没有时长即将到期的警告?
苹果没有提供专门针对VoIP推送运行时长的到期回调或警告。不过你可以通过监听App的生命周期事件来间接判断:当系统准备挂起App时,会触发applicationWillResignActive(_:)或applicationDidEnterBackground(_:)方法,但这不是专门针对VoIP推送时长的通知,只是App状态变化的通用回调。
另外,在PushKit的pushRegistry(_:didReceiveIncomingPushWith:for:completion:)方法中,你必须在完成VoIP推送处理后调用传入的completion handler,否则系统可能会提前终止你的App——这是确保App行为合规的关键,但和时长到期不是同一回事。
补充一点:如果用户接听了VoIP来电,App会切换到前台,此时就不受后台运行时长的限制了;如果是未接听的情况,系统会根据设备资源情况决定何时挂起App,没有固定的终止时间点。
内容的提问来源于stack exchange,提问作者Piepants

