1

我在我的应用程序中注意到,当应用程序在加载时进入后台时会导致错误,例如 "timeout" 或 "host name not found" 。

这是由于进程不允许连接在后台运行很长时间。

但是这种错误信息会影响用户体验。那么我应该怎么做才能取消交易呢?我应该取消所有连接吗?我试图在这里搜索 SO 中的问答,但找不到答案。

有关更多信息,我的应用程序使用 NSURLConnectionDelegate 方法。我有一个存储单例来管理与我的服务器的所有连接。NSURLConnection 也在自定义对象中被调用和管理。

我试图只是 [connection cancel] in - applicationDidEnterBackground: 但这会使 UI 损坏,因为我加载数据以放入 UITableViewCell 等。谁能指出解决此类问题的示例?

更新代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
 __block UIBackgroundTaskIdentifier backgroundTask; backgroundTask = 
[application      beginBackgroundTaskWithExpirationHandler: ^ { 
[application endBackgroundTask:backgroundTask]; 
backgroundTask = UIBackgroundTaskInvalid; }]; } 

  }

我可以把这段代码放在 appDelegate 吗?与将 beginBackgroundTaskWithExpirationHandler 放在我想在后台继续运行的任务之前和 endBackgroundTask 在该任务完成后放置相比,这样做的缺点是什么?我的代码有一个直接处理 NSURLConnection 的对象。

4

2 回答 2

3

进入后台后,您可以继续运行NSURLConnection一段时间。苹果没有公布确切的时间段,但它是 10 分钟。有关如何使用请求更多时间来完成下载的详细信息,请参阅在后台执行有限长度任务。beginBackgroundTaskWithExpirationHandler:

在大多数情况下,您不应主动取消下载。您应该等到系统使您过期,然后在那时处理错误。如果您的下载时间很短,则没有理由取消它(在大多数情况下,连接最昂贵的事情就是首先设置它)。如果这是一个很长的下载,那么如果它不在后台继续,用户会很生气。(这假设您正在下载东西,因为用户请求它。)

于 2013-08-03T17:47:14.353 回答
1

首先,最好在应用程序委托上进行此调用,以便可以关闭 NavigationController 中的 View。其次,标记后台处理的开始beginBackgroundTaskWithExpirationHandler:和结束,endBackgroundTask:如下所示:

。H:

UIBackgroundTaskIdentifier bgTask;

米:

- (void)sendPhoto:(UIImage *)image
{
  UIApplication *app = [UIApplication sharedApplication];

  bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid;
  }];


  NSLog(@"Sending picture...");

  // Init async NSURLConnection

  // ....
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

  NSLog(@"Picture sent.");

  UIApplication *app = [UIApplication sharedApplication];

  if (bgTask != UIBackgroundTaskInvalid) {
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid;
  }
}

还要记住一件很重要的事情:

You have 10 minutes before iOS terminates your app. You can check this time with[ app backgroundTimeRemaining]

于 2013-08-03T17:52:21.320 回答