【问题标题】:Continue a NSURLConnection after the App has been terminated应用程序终止后继续 NSURLConnection
【发布时间】:2015-01-02 20:53:41
【问题描述】:

我想知道当应用程序终止时,如何继续在前台启动的异步 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 的方式,因为当您编写消息并在按下发送后立即终止应用程序时,消息将被传递。

我能想到的唯一方法是通过后台获取来完成,但我认为这不是最好的解决方案,因为我只想在应用程序发送到后台时建立一个连接。

【问题讨论】:

  • 使用 NSURLSession 和后台配置。
  • 我从 NSURLSession 阅读了类参考,我想我会尝试使用 下载会话 的 NSURLSession。谢谢你!

标签: ios objective-c background nsurlconnection


【解决方案1】:

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

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

  1. 按照您的编写方式,您的AnObject 会在超出范围时被提前释放,因此当您的应用程序尝试调用委托方法时会失败。确保保持对AnObject 的强烈引用。

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

顺便说一句,您提到在应用程序终止后继续请求。如果用户手动终止应用程序,则会杀死您问题中考虑的后台任务以及后台 NSURLSession 任务。这些旨在在应用程序离开前台时优雅地处理持续的任务,而不是在用户手动终止应用程序时。 NSURLSession 方法可以优雅地处理由于内存压力而导致的终止,而不是手动终止。

【讨论】:

  • 啊,好的,谢谢你的详细回答 Rob!它适用于 NSURLSession 类!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2015-06-21
  • 2013-10-20
  • 2020-10-10
相关资源
最近更新 更多