【问题标题】:Will ios terminate the app running in background after a specific time?ios会在特定时间后终止在后台运行的应用程序吗?
【发布时间】:2012-06-11 04:19:40
【问题描述】:

我在我的应用程序中使用核心位置框架,并在 UIBackgroundMode 或必需的后台模式(在 Xcode 4.2 中)中设置位置字符串,以便在应用程序在后台运行时从 didUpdateToLocation 方法获取更新的位置并发送此更新通过点击核心定位框架的didUpdateToLocation方法内的特定链接定位到服务器。

我的问题是应用程序在后台运行一段时间后是否会终止?

【问题讨论】:

    标签: ios ios5 core-location uiapplicationdelegate background-task


    【解决方案1】:

    不,没有为此定义具体时间。但应用程序肯定会根据某些参数终止 - 电池消耗、内存占用问题等。

    在开发人员文档中明确提到 - “系统尽可能长时间地将暂停的应用程序保留在内存中,仅在可用内存量变低时将其删除。保留在内存中意味着您的应用程序的后续启动速度要快得多。”

    查看完整的详细信息 - http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

    【讨论】:

    • 谢谢,这个链接非常有用。我还想问一个问题,我们是否需要在 didUpdateToLocation 方法中进行任何事件处理,因为当应用程序处于后台状态时,上述链接的给定文档中说明了“不处理事件时睡眠”。
    • 如果你有兴趣获取位置,即使它处于睡眠状态,那么你需要使用它,否则没有什么特别的。
    • 应用何时进入睡眠状态?
    • 在文档中指出,当应用程序处于后台时,UIBackgroundMode(location) 将在位置更新时通知应用程序。我认为如果应用程序睡眠和位置更新然后应用程序通知并再次进入后台状态,这是真的吗?
    • 您也可以使用重大更改位置服务在后台更新位置,也可以在终止状态下更新位置。请参考苹果文档指南了解 SCLS。
    【解决方案2】:

    快速回答几乎是不。请阅读以下内容以深入了解。

    由于已在 iOS 设备上启用多任务处理,因此 a) 您的应用程序获得了分配的内存量,并且 b) 设备限制了在任何给定时间发生的任务量,即使用内存的应用程序。如果您使用 iOS 设备并打开多个应用程序,您会开始注意到您首先打开的应用程序可能已被终止并从 viewDidLoad 重新加载。

    通常可以肯定地说,如果您的应用是最近打开的应用(甚至在有人经常清除多任务菜单的手机上),设备将不会在后台终止您的应用。

    【讨论】:

      【解决方案3】:

      我已经看到后台位置更新将工作几个小时。但是,如果我去一个没有接收的地方,设备将停止发送 GPS 更新,当我去一个有接收的地方时它不会启动。这发生在大约 30 分钟后。

      但如果我添加这个,在 iOS6 中,应用程序不会终止

      [locationManager setPausesLocationUpdatesAutomatically:NO];
      

      【讨论】:

      • 请注意您正在绕过优化。与activityType一起,系统将智能地停止向您的应用程序提供位置数据(如果您设置了健身activityType并且您没有移动超过几分钟,然后暂停设备努力跟踪您,直到您开始移动再次...),这也意味着收音机已断电,从而节省了电池寿命。如果您将管理器设置为永不暂停,它确实会继续提供位置数据,但在这种情况下,您更有可能更快地被 iOS 终止,因为设备正在做更多的工作。
      【解决方案4】:

      iOS 应用程序可能因以下原因而终止:

      1. 看门狗超时

      您可能知道,从 iOS 4.x 开始,大多数时候您 退出 iOS 应用程序,该应用程序并未终止 - 相反,它被发送到 背景。

      However, there are times when the OS will terminate your app and
      generate a crash log if the app didn’t respond fast enough. These
      events correspond with the implementation of the following
      UIApplicationDelegate methods:
      
         - application:didFinishLaunchingWithOptions:
         - applicationWillResignActive:
         - applicationDidEnterBackground:
         - applicationWillEnterForeground:
         - applicationDidBecomeActive:
         - applicationWillTerminate:
      

      在上述所有方法中,应用程序获得的时间都是有限的 完成其处理。如果应用程序耗时过长,操作系统将 终止应用程序。

      1. 用户强制退出

      iOS 4.x 支持多任务处理。如果应用程序阻止 UI 并停止 响应,用户可以从主页双击主页按钮 屏幕并终止应用程序。

      注意:您可能已经注意到,当您双击主页按钮时, 您还将获得您过去运行的所有应用程序的列表。 这些应用程序不一定正在运行,也不一定 暂停。

      通常一个应用会在后台停留大约 10 分钟 用户点击主页按钮,然后它被终止 由操作系统自动执行。所以你看到的应用程序列表 双击 Home 按钮只是过去应用程序运行的列表。

      1. 低内存终止

      当继承 UIViewController 时,你可能已经注意到 didReceiveMemoryWarning 方法。

      在前台运行的任何应用程序在 访问和使用内存的条款。然而,这并不意味着 应用程序获取设备上的所有可用内存——每个应用程序都获得一个 可用内存的一部分。

      当总内存消耗达到一定水平时,操作系统会发出一个 UIApplicationDidReceiveMemoryWarningNotification 通知。在 同时,为应用调用 didReceiveMemoryWarning。

      此时,为了让您的应用继续正常运行,操作系统 开始在后台终止应用程序以释放一些内存。一次 如果您的应用还需要更多后台应用,所有后台应用都将终止 内存,操作系统会终止您的应用程序。

      【讨论】:

        【解决方案5】:

        我确信这对作者没有用,因为这个问题是在 2012 年 6 月提出的,而我在 2019 年 6 月给出了答案。这个答案可能对其他用户有用。

        我发布这个答案是因为每个人都说这是操作系统的默认行为,我们无法更改它....bla..bla.

        最近,我正在处理相同的要求。经过2-3周的努力 工作,我做到了。对于其他用户,我为它创建了一个帮助类。我的 在启用位置跟踪之前,应用程序永远不会被操作系统杀死。

        您还可以验证操作系统永远不会杀死this app tracking app

        在活动和非活动状态下使用HSLocationManager 进行无限位置跟踪。

        参考我在应用商店中可用的应用(如果启用位置跟踪,应用将永远不会被操作系统杀死)

        位置管理器,允许每次获取后台位置更新 n 秒,具有所需的位置精度。

        优势:

        • 如果位置管理器当前是,操作系统将永远不会杀死我们的应用程序 正在运行。

        • 在需要时定期更新位置(范围在 2 - 170 秒(受允许的最大后台任务时间限制))

        • 可自定义的定位精度和时间段。

        • 低内存消耗(单例类)

        【讨论】:

        • 感谢分享。为类似的功能工作并将您的代码转换为可用于跨平台应用程序开发的库。你我的朋友传奇。这需要更多的支持
        • 后台位置更新的有趣用途。我想知道为什么这没有更多的赞成票
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2019-09-08
        相关资源
        最近更新 更多