iOS应用程序在后台执行任务

时间:2011-03-16 10:00:28

标签: ios objective-c web-services background-process

我想知道在应用程序处于后台时是否可以发送一些webservice调用。 skype是如何做到的?即使我按下主页按钮,我的通话也会保持连接状态。

3 个答案:

答案 0 :(得分:34)

根据rckoenes的说法,允许应用程序在用户点击主页按钮后注册后台任务。完成这些任务的时间限制为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 4之前的iOS版本,则还应检查以确保在注册后台任务之前支持多任务处理。使用以下内容:

UIDevice* device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

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

   backgroundSupported = device.multitaskingSupported;

答案 1 :(得分:30)

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

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

更新::

您可以在此苹果文档Background Execution.

中找到有关多重过程的更多信息

请在设备上测试。

答案 2 :(得分:2)

这取决于您尝试编码的应用程序类型。 Skype已注册为VoIP(长期运行的应用程序)应用程序,这就是为什么它可以保持"运行"虽然它是在背景上。

Apple将应用分为三个部分:

  • 执行有限长任务(您可以在有限的时间内运行任务)
  • 在后台下载内容(您可以下载内容,以便在应用再次激活时将其呈现给用户)
  • 实施长期运行的任务(这是最有趣的后台应用类别,开发人员应为您的应用定义一些子类别)

    • 在后台播放用户可听内容的应用,例如音乐播放器应用
    • 在后台录制音频内容的应用
    • 随时向用户通知其位置信息的应用,例如导航应用
    • 支持互联网协议语音(VoIP)的应用程序(SKYPE在这里)
    • 需要定期下载和处理新内容的应用
    • 从外部附件接收定期更新的应用

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

有关所有这些的更多信息,请访问此链接:

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