改善和解决应用后台频繁被杀的问题

晋级 iOS 13.2 后运用在后台频频被杀给大量用户带来困扰。网络上wakeup 剖析日志流传甚广,也有人判定由于运用不恪守 iOS 后台唤醒规矩,所以被杀。

确认的是 wakeup 调用不是 App 被杀掉的直接原因,不能简略归因后台频频被杀是开发者的问题。现在 A} N V 3 wpple 供给了 MetricKit API 能够N z 7 @ 3从体系层面获z ^ ^ 1 X p取运用o u ~ X u r H s后台被杀的原因,并给出了一些改c q X进主张。

体系给出的运用程序后台停止的主M p n h K Q X o :要原因 :

  • 溃散
  • CPU资源约束
  • Watchdog
  • 内存资源约束
  • 内存压力退出
  • 后台任务超时

新的MetricKit API 供给后台被杀的原因

改善和解决应用后台频繁被杀的问题

MXBackgroue u z ( j ? | qndExitData经过供给每次运用程序被停止时的退出计数,了解为什么运用程序会被杀死。

Crashes

溃散是最直接的停止类型。可能发生的原因有以下3种

  • SIGSEGV
  • SIGILL
  • 断言和反常退出

这些事情将在crashlog上生成,并主动向咱们陈述。除了Xcode organizer之外,Metr* & LicKit还为每个设备添加了更多的API,即 “MXCrashDiagnostic”。

MXCrashDiagnostic将供给以下信息

  • 仓库盯梢
  • 信号
  • 反常代码
  • 停止原因

WC D 5 ~ Y j Katchdog

另一类被杀是由于Watchdog事情而发生的,该事情发生在一些要害的进程中的超时。

  • 要害进程中的超时:在运用程序的要害进程中,如启动、进入后台或再 C L | e U次进入前台时,出现长时刻的挂起。它的时刻约束在20秒左右。
  • 在模拟器和调试器中禁用。
  • 批改Watchdog事情将有助于消除死锁、死循环和主线程上频频的同步作业。
  • “MXCrashDiagnostH x | / h z 6 6ic”中供给陈述。

CPU资源约束

CPU资源约束是指后台CPU持续负载较高。
在Xcode 12中添加了一些解决计划。i o p 0 | Q

  • 经过xcode organizer和MXCPUExceptionDiagnostic实现电量反常陈述。G 8 # v W 9 ^ v /
  • 调用仓库指出代码P I l O v K中的频频调用。
  • 考虑将作业转入BGProcessingTask

内存占用超标

运用程序占用太多内存。一些解决计划 :

  • 前景和背景的约束相同
  • 运用 Instruments 和Memory Debugger
  • 请留意对旧设备的约束

Jetsam (内存压力退出)

留意:这不是你的运用程序的过错,它是最常见的退出原因。发生这种状况是由于体系为活动的运用程序腾出内存。

怎么下降v . 6 $ ( 0 o b内存压力退出率?

  • 争取在后台运用少于50MB的空间。

主张在后台做以下操作。

  • 将状况保存到磁盘
  • 清空image view
  • 删去缓存

还有关于怎么从内存压力退出中康复的主张。

  • 在进入后台时保存状况,如视图控制器仓库、text fields中的草稿输g O a [ 9 9 d入、媒体播放位置以及更多取决于你的事务场景。
  • 运用UIKit状况康复
  • 想办法让用户认识不到运用程序被停止了。

后台任务超时

当进入后台时,咱们] / [ 9 9 r 6能够运用 “begin} i 1 ] 3 W T XBackgroundTask “和I W f “endBackgroundTask “来履行k c B ] e 0 C后台任务(体系会给你30秒的时刻来完成任务)

UIApplication.beginBackgroundE J i ? ` R # ` jTask(expertationHandler:)
UIApplication. C  # }endBackgroundTask(_:)
  • 问题是当咱们不调用 “endBackgroundTaskd 7 t“时,会由于无法清晰完毕任务而导致程序被杀死。
  • 经过 “MXBackg~ { uroundExitData “露出的计数。

给Backgroy E B f undTE O # V j x Z V Qask命名来– } R v Y , M k (排查没有完毕后台任务的问题。

UIApplication.beginBackgroundTask(withName:experienceHandler:)

为什么?

  • 在debugger中不会出现停止的状 O 2 H f况。
  • 履行控制台消息并审阅匹配的后台和完毕任务进程的调用

另一个解决办法是运用expirationHandler

  • 实施一个expirationHandler作为保障措施,不要完全依靠它。
  • 在处理程序内调用endBackgroundTD 7 h P Y H 2 4ask
  • 不要在处理程序内开端新B v . 2 H @ N ; –的事务
  • BackgroundTask开端时和期满处理程序中添加数据搜集。
lH  R xet handle = MXMetricManaS / e N | bger.makeLogHandle(ca6 Y ` @ 6 7tegory: "DatabaseExpHandler")
mxSignpost(.event, log: handle# h g ] F / P, name: "Entered")
cancelOpe- h 6 Prations()
closeDatabase()
mxSignpost(.event, log: handle, name: "Exited")
UIAppliQ ; / ^ H E 5c^ # Q Ration.shared.endBackgroundTask(backgroundTaskIdentm u { = k Tifier)

让咱们查H u s a % q u看 “MXMetricPayload”,z 7 V +看看符号数量,并查看符号数量是否有不H T l平衡(非成对出现)。

改善和解决应用后台频繁被杀的问题

另一种改进运用程序2 x g s ] a停止调试的解决计划是在做一些后台作业之~ i + P前查看backgroundTimeRemaining

  • 只要在时刻富余的状况下才开端作业
    *在剩余时刻小于5秒时开端任务是不安全的。

示例代码 :

let miZ f n n J N B D NnimumTimeRemaining = min(5, estimateProcessingTime(inputData))
if UIApplication.shared.backgroundTimeRemainin& d ; sg > minimumTimeRemaining {
// 剩余时刻满足,调用开端后台任务
return UIApplication.shared.beginBackgroundTask { ... }
}else {
// 时刻不行,将这项J t h 8作业推迟到今后进行。
registerProcessingTaskf ^ e } 5 s W I Q(inputData)
return .invalid
}

下一步需求防止内存走漏UIBackgroundTaskIdentifier。运用局部变量而不是实例变量来保存/ ~ Q / UIBackgroundTaskIdentifier,这样能够防B L 2 B U F止内存走漏c } f P T,由于它将在不同的内存上分配。

示例代码 :

@IBAction func beginDataExport(sender: UIButton) {h @ . H V
var taskId.UIBbackgroundTaskIdentifier = .invalid: UIBbackgroundTaskIdentifiI ] g l p ? c tera 0 R { 0 C M F = .in, = V F ~ | E }valid
taskId = UIApplication.shared.begiS C A OnBackgroundTask {...}。
//归档后完毕后台任务,这需求几秒钟的时刻。
ArchiU b v K ] K 7veUA r R ]tility.exportUserData(completion: ()->()) {
UIApB f a V 6 l Splication.shared.endBackgroundTask(taskId)
}
}

总结削减后台exit的解决计划

  • 辨认并解决exit问题
  • 削减内存运用量
  • 实施UI状况康复

参考资料:

wwdc2020/10078x l : $ 为什么我的运用程序被杀死?
developer.apple.com/videos/play…

wwdc2020/10081 MetricKit的新功能:
developer.apple.com/videos/playx G p ) f # ^ @ D

MetricKit API 后台运用程2 I % = 3 5 g w序退出计数文档:
developer.apple.com/documentati…

MetricKit 及它的运用方法,也供给了一个搜集 MetricKit 数据的自建 Web 服务计划:
nshipster.com/metrickit/

UI状况康复文档:
deW B ? z +ve( n V , J +loper.apple.com/documentati…

本文由你的关注/点赞/评论资助宣布