应用程序终止后继续NSURLConnection

时间:2015-01-02 20:53:42

标签: ios objective-c background nsurlconnection

我想知道当应用程序终止时,如何继续执行已在前台启动的异步NSURLConnection。 目前,当应用程序进入后台时,我正在启动NSURLConnection。只要用户比连接慢,当他想终止应用程序时,这种方法很好。但是当用户比它快时,就无法建立连接。 这是我的代码:

// AppDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    AnObject *newObject = [[AnObject alloc] init];
    [newObject InactiveApp];
}

// AnObject.m
- (void)InactiveApp
{
    self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];

    // setting up the NSURLRequest
    // [...]

    dispatch_async(dispatch_get_main_queue(), ^
    {
        [NSURLConnection connectionWithRequest:request delegate:self];
    });
}
// delegate functions, endBackgroundTask-closing, etc. is following

不幸的是,这不起作用,我想知道是否有人知道另一种解决方法。必须有一种类似于Snapchat或WhatsApp这样做的方式,因为当您在按下发送后立即编写消息并终止应用程序时,将传递消息。

我能想象的唯一方法就是使用后台获取,但我认为这不是最好的解决方案,因为我只是想在App发送到后台时建立一个单独的连接。 / p>

1 个答案:

答案 0 :(得分:1)

我同意安迪,你应该追求NSURLSession和背景NSURLSessionConfiguration。请参阅App Programming Guide for iOS: Background Execution的背景部分中的下载内容。

顺便说一下,你问题中的想法会正常工作(特别是如果你需要支持7.0之前的iOS版本,其中NSURLSession及其后台会话不可用)。关于您的代码段的两个观察结果:

  1. 您编写它的方式似乎是AnObject在超出范围时会过早解除分配,因此当您尝试调用委托方法时,您的应用会失败。请务必保持对AnObject

  2. 的强烈引用
  3. 下载完成后,别忘了拨打endBackgroundTask。同样(并且更巧妙地),超时处理程序也应该结束后台任务。请参阅上述App Programming Guide执行有限长度任务部分。

  4. 顺便提一下,您提到应用程序终止后继续请求。如果用户手动终止某个应用,则会终止您在问题中考虑的后台任务以及后台NSURLSession任务。如果应用程序离开前台,这些旨在优雅地处理连续任务,而不是用户手动终止应用程序。由于内存压力,NSURLSession方法可以优雅地处理终止,但不能手动终止。