iOS后台模式:在后台运行位置更新之后,应用程序从不终止。

3
我正在后台运行位置更新。 一切正常:
- 在重要的位置变化时,应用程序在后台启动。 - 如预期,调用了 appDidFinishLaunching(options:)。
我开始使用 LocationManager startUpdatingLocation() 和 startMonitoringSignificantLocationChanges()。 位置被正确地收集。 一段时间后,我调用 stopUpdatingLocation()。 在这个阶段,我的程序不需要执行任何操作,也不会执行任何其他代码。 此时,程序保持空闲。 applicationWillTerminate 永远不会再次被调用。这是预期的吗?我希望应用程序因为不需要位置更新而再次关闭。
期望的行为是什么? 应用程序应该关闭还是永久保持空闲?
一旦发生这种情况,如果用户打开应用程序或者再次接收到重要位置变化,则不会调用appDidFinishLaunching(options:),而是调用applicationDidBecomeActive。
有没有任何文档可以支持期望的行为?

你会在调用 'applicationWillTerminate' 时终止应用程序吗? - Vineesh TP
你是什么意思? - user1447414
2个回答

9

没错,这里的一切都是预料中的。J.D. Wooder发布了已被删除的答案,正确地链接了文档: "管理您的应用程序生命周期"。 作为规则,后台运行的iOS应用程序不会主动停止。只有在需要系统资源时才会停止它们。这是不可预测的,并且当发生此情况时,应用程序通常不会收到applicationWillTerminate消息(因为应用程序通常在那时候没有运行,它不会被唤醒只是为了停止它)。您的应用程序应该处理冷启动(appDidFinishLaunching)和热启动(applicationDidBecomeActive)。

从头开始重新启动应用程序是昂贵的,因此iOS更喜欢在没有资源压力的情况下将最近使用的内容保存在内存中。什么都不做的应用程序非常便宜。

请注意,iOS 13在杀死后台应用程序方面变得更加激进,而新手机上的大型摄像头也会导致内存压力增加,导致应用程序更快地停止运行,所以不要太习惯长时间在后台运行。但这也很正常。


1
请查看“响应基于应用程序的生命周期事件”部分以及该部分中的链接。特别注意那里显示的应用程序生命周期如何在iOS 13之前工作的图片(在13中略有不同,但相似)。 - Rob Napier
我的评论不应该在那里。已删除。我找到了链接并编辑了你的答案。 - user1447414
1
@daleijn 我不明白这个问题。通常你会被给予一小段时间,然后暂停。除非你违反协议(例如不处理过期事件),否则通常不会被终止。 - Rob Napier
1
@daleijn 那看起来和这个问题完全相同。应用程序被终止的情况非常罕见。只是让它被唤醒是完全正常的。 - Rob Napier
1
“它被唤醒后不可预测的时间内保持运行状态是完全正常的,当系统决定需要更多资源时,它会终止应用程序?” 是的,完全正确。-- “系统保证至少执行10秒。” 不是的,你只能得到“一小段时间(大约10秒)”的承诺。-- “之后它可能会被杀死,也可能不会,可以存活数小时?” 正确。-- “10秒后,它必须被系统强制终止。” 不是的。 - Rob Napier
显示剩余3条评论

2
请查看iOS应用程序的生命周期。请参考Life Cycle
appDidFinishLaunching will call only when app Launch,
applicationWillTerminate  - called when app terminate from background
applicationDidBecomeActive - Called when app comes to foreground from background

当应用程序从后台终止时,applicationWillTerminate 很少被实际调用。如果应用程序被挂起(这很常见),那么它不会被唤醒只是为了被终止;它将会默默地被终止。 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接