【问题标题】:iOS Background Mode: After running location updates in the background, the app never terminatesiOS后台模式:在后台运行位置更新后,应用程序永远不会终止
【发布时间】:2020-02-19 14:49:07
【问题描述】:

我正在后台运行位置更新。一切正常:

  • 在重要位置,应用在后台启动

- appDidFinishLaunching(options:) 按预期调用。

  • 我开始LocationManager startUpdatingLocation()startMonitoringSignificantLocationChanges()

  • 位置收集正确。

  • 一段时间后,我打电话给stopUpdatingLocation()

  • 我的程序在这个阶段不需要做任何事情,也不会执行进一步的代码

此时程序处于空闲状态。 applicationWillTerminate 再也不会被调用。这是预期的吗?我希望该应用程序会再次关闭,因为不需要位置更新。

预期的行为是什么?应用程序应该关闭还是应该永远保持空闲状态?

一旦发生这种情况,如果用户用户打开应用或再次收到重要位置,则不会调用 appDidFinishLaunching(options:),而是调用 applicationDidBecomeActive

我可以遵循任何支持预期行为的文档吗?

【问题讨论】:

  • 你是否终止了调用 'applicationWillTerminate' 的应用程序?
  • 什么意思?

标签: ios core-location


【解决方案1】:

请查看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 在应用从后台终止时很少被实际调用。如果应用程序被挂起(这很常见),那么它不会被唤醒只是为了终止;它会被默默地终止。
【解决方案2】:

是的,这里的一切都是预期的。 J.D. Wooder 删除了一个正确链接文档的答案:"Managing Your App's Life Cycle." 通常,后台 iOS 应用程序不会被主动杀死。它们仅在需要系统资源时才被杀死。这是不可预知的,当它发生时应用程序通常不会收到applicationWillTerminate 消息(因为应用程序通常不会在此时运行,并且不会仅仅为了杀死它而被唤醒)。您的应用应同时处理冷启动 (appDidFinishLaunching) 和热启动 (applicationDidBecomeActive)。

从头开始重新启动应用程序的成本很高,因此如果没有资源压力,iOS 更喜欢将最近使用的东西保存在内存中。什么都不做的应用程序非常便宜。留下来。

请注意,iOS 13 在后台杀死应用程序方面变得更加激进,并且新手机上的大型摄像头导致内存压力也会更快地杀死应用程序,所以不要太适应在后台运行背景很久了。但也很正常。

【讨论】:

  • 请参阅“响应基于应用程序的生命周期事件”部分以及该部分中的链接。特别注意那里的图片显示了应用程序生命周期在 iOS 13 之前的工作方式(在 13 中略有不同,但非常相似)
  • 我的评论不应该在那里。删除了它。我找到了链接并编辑了您的答案。
  • @daleijn 我不明白这个问题。通常会给您一小段时间,然后暂停。除非您违反协议(例如,通过不处理到期事件),否则您通常不会被终止。
  • @daleijn 这看起来与这个问题相同。应用程序被终止的情况非常罕见。刚被唤醒是完全正常的。
  • --“它只是在不可预知的时间内被唤醒是完全正常的,当系统决定它需要更多资源时它会杀死应用程序?”是的。确切地。 --“系统保证至少执行10秒。”不,你被承诺“一小段时间(大约 10 秒)”。 ——“在那之后它可能会被杀死,或者可能不会被杀死并且可以存活几个小时?”正确的。 --“10秒后必须被系统强制杀死。”没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多