2011-03-16 78 views
25

我想知道如果我的应用程序在后台运行时是否可以发送一些web服务调用。 Skype如何做到这一点?即使我按下主页按钮,我的电话仍保持连接状态。iOS应用程序在后台执行任务

+6

如果你读的背景苹果的文件运行,你会看到你只允许运行你的应用程序在后台,如果,你是播放音频,监控位置或您的应用程序是VOIP客户端。如果你的应用程序不属于上述类别之一,那么你运气不好。 http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html – rckoenes 2011-03-16 10:08:54

+0

@rckoenes这是不正确的。有限的任务可以获得*一些* CPU时间*(通常在10分钟左右)*。请参阅[文档](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html) – webo80 2016-02-17 16:23:58

+0

@ webo80 true您可以获得一些时间,在iOS 9中它是一种方式少于10分钟。但总的来说,你可以在后台完成一些任务。 – rckoenes 2016-02-18 10:39:40

回答

33

根据rckoenes的说法,允许应用程序在用户点击home按钮后注册后台任务。完成这些任务需要10或15分钟的时间限制。同样,你可以注册一个任务,在用户点击家后立即完成,这不允许你在退出应用程序一小时后执行代码。

UIApplication* app = [UIApplication sharedApplication]; 
task = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:task]; 
     task = UIBackgroundTaskInvalid; 
    }]; 
// Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do the work associated with the task. 
     NSLog(@"Started background task timeremaining = %f", [app backgroundTimeRemaining]); 
     if (connectedToNetwork) { 
      // do work son... 
     } 

     [app endBackgroundTask:task]; 
     task = UIBackgroundTaskInvalid; 
    }); 

更新:如果您的应用支持的iOS版本以前的为iOS 4,您也应该检查,以确保注册后台任务之前多任务支持。使用的东西沿线︰

UIDevice* device = [UIDevice currentDevice]; 

BOOL backgroundSupported = NO; 

if ([device respondsToSelector:@selector(isMultitaskingSupported)]) 

    backgroundSupported = device.multitaskingSupported; 
+0

从iOS 7开始,后台执行时间从10分钟减少到3分钟。 – user3847320 2016-04-19 19:51:31

+0

@ user3847320,任何文档请... – 2017-08-09 13:21:43

+0

@GaneshGuturi没有直接的文档,并且苹果明确指出背景时间是基于许多变量机会性分配的。跟踪和错误(通过记录UIApplication.shared.backgroundTimeRemaining)指示3分钟的执行时间。这当然可以根据苹果的判断改变。 – user3847320 2017-08-10 14:30:34

29

试试这个...在后台运行应用程序的优秀代码没有时间限制。 (我测试了从Web服务下载超过600点MB的数据。)

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 
    UIBackgroundTaskIdentifier bgTask; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
    }]; 
} 

更新::

,你可以找到关于这个苹果文档Background Execution.

multitaksing更多信息,请在设备上测试。

+4

我正在使用它,但10分钟后任务结束。 – Salim 2013-10-07 10:50:18

+0

这不工作iOS 4,5,6.仅适用于iOS 7 – Salim 2014-01-15 05:28:58

+0

超级。非常感谢你做的这些。它真的帮了我很多。 – Karun 2014-01-27 06:55:55

1

这取决于您想要编写什么样的应用程序。 Skype已注册为VoIP(长时间运行的应用)应用,这就是为什么它可以保持“运行”,尽管它在后台。

苹果在三个分离的应用程序:

  • 执行有限长度的任务(你可以运行的时间有限的任务)
  • 在后台下载内容(你可以下载的内容提交给当应用程序反复活跃成为
  • 实现长时间运行的任务(这是最有趣的背景的用户)应用程式类别,与开发者应该定义为你的应用中的一些子类)

    • 应用程式播放音频内容给用户,同时在后台运行,如音乐播放器应用程序
    • 应用该记录的音频内容,而在后台
    • 应用程序,使用户了解其位置的时刻,这样的作为导航应用
    • 应用,支持互联网语音协议(VoIP)(SKYPE是这里)
    • 应用程序需要下载和处理新的内容,从外部附件接收定期更新定期
    • 应用

因此,您需要评估您的应用程序在哪个类别以及您的服务操作执行的内容。也许如果你正在向服务发送一些小的东西,最好的方法只是在后台请求一些额外的时间来完成这项工作。所有的这

更多信息此链接:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

相关问题