Apple允许后台任务运行多长时间?

时间:2015-02-02 10:19:04

标签: ios iphone

我必须将一组图像文件上传到数据库,因此,我偶然发现Apple's background execution guide以确保在用户暂停或终止我的应用时应用仍会上传数据。

但是在解释中,如果我们调用giving it a little extra time to finish its workbeginBackgroundTaskWithName:expirationHandler:来启动后台任务,则会显示beginBackgroundTaskWithExpirationHandler:

little extra time准确多久了?

5 个答案:

答案 0 :(得分:14)

如果我错了,请纠正我,但我偶然发现了来自Xamarin的a perfect article讨论iOS背景功能。

我将简单分为两部分,ios pre 7和ios 7 +:

iOS版本7之前

  

答案只是600秒(10分钟),原因由提供   上面的文章。

iOS版本7 +

  

答案是时间系统分配给你的是机会主义。您   将不得不使用@Gary Riches的建议

     

NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
     

找出答案。它是机会主义的原因是iOS 7+的方式   处理后台任务是完全不同的,当然是优化的。至   确切地说,它具有间歇性行为,因此,如果您需要   后台任务,如下载一大堆数据,它将是   如果您改用NSURLSession,效果会更好。

但是,在我的特殊情况下,我正在上传一个包含一个文件的单个对象。我不必考虑NSURLSession上传少量数据。此外,它是上传任务,它可能需要花费尽可能多的时间。 : - )

对于这些TL;DR访客,上述答案应该足够了。有关详细信息,请参阅上面的文章。

答案 1 :(得分:7)

根据许多不同的变量,时间量会有所不同,但可以通过引用backgroundTimeRemaining上的UIApplication属性来检查该值:

NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);

答案 2 :(得分:5)

如果您想在应用程序处于后台时上传文件,则应使用Apple的后台服务。 iOS会给你的应用时间约。 3分钟(根据一些经验)完成您的任务,然后它将杀死您的应用程序。

Apple允许在特殊情况下长时间运行应用程序。为此,您需要在info.plist文件中使用UIBackgroundModes。有关这些特殊情况的更多信息,请参阅此link上的表3-1。

修改
这是一篇很好的文章,描述了后台任务运行时以及如何在iOS中实现长时间运行的后台任务 https://gooddevbaddev.wordpress.com/2013/10/22/ios-7-running-location-based-apps-in-the-background/

答案 3 :(得分:1)

理论上,你有5秒的时间来关闭你想要在后台完成的任务,如果你不这样做,你的应用程序就会被杀死。

之后,你可以调用'beginBackgroundTaskWithExpirationHandler',你必须做好准备,以防万一Apple提供的“额外时间”不足以完成你需要完成的任务。

编辑:

When an iOS application goes to the background, are lengthy tasks paused?

从iOS应用程序编程指南:

  

你的app delegate的applicationDidEnterBackground:方法有   大约5秒钟完成任务并返回。在实践中,   这种方法应该尽快返回。如果方法有   在时间用完之前没有返回,你的应用程序被杀死并被清除   记忆。如果您还需要更多时间来执行任务,请致电   beginBackgroundTaskWithExpirationHandler:请求背景的方法   执行时间然后启动辅助中的任何长时间运行的任务   线。无论你是否开始任何后台任务,都可以   applicationDidEnterBackground:方法必须仍然在5内退出   秒。

来自Raywenderlich:'再一次,没有保证,API文档甚至没有给出一个球场号码 - 所以不要依赖这个数字。您可能需要5分钟或5秒,因此您的应用需要为任何事情做好准备!':

http://www.raywenderlich.com/29948/backgrounding-for-ios

您的应用获得背景后获得的时间取决于iOS。您获得授权的时间无法保证,但您始终可以检查UIApplication的backgroundTimeRemaining属性。这会告诉你你还剩多少时间。 一般的,基于观察的共识是,通常,你得到10分钟。同样,没有任何保证,API文档甚至没有给出一个球场号码 - 所以不要依赖这个号码。您可能需要5分钟或5秒,因此您的应用需要为任何事情做好准备!

答案 4 :(得分:0)

它不是固定的:在Xcode 10和Swift4.1中

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    print(UIApplication.shared.backgroundTimeRemaining)


} 

OP1:166.13057912699878平均约2.7分钟, OP2:177.4997792619979平均约2.95分钟