检查后台的networking连接并上传数据

我得到一个要求,能够检查是否有失败状态的数据,并通过web服务上传。

stream量将是:

  1. 用户尝试上传数据,但由于没有互联网连接而失败
  2. 用户停止使用应用程序,所以应用程序将背景
  3. 应用程序开始识别互联网连接是否可用
  4. 如果可用,则直接调用Web服务来上传数据
  5. 如果不可用,它将返回到#3

回到我在iOS 7上的最后一次开发,之前的背景时间是10分钟,但是变成了3分钟。

后台取指

当这个方法被调用时,你的应用程序有最多30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。 在实践中,您的应用程序应该在下载所需数据后尽快调用完成处理程序块。 如果您不及时调用完成处理程序,则您的应用程序将被终止。

此外,这些是唯一允许做后台的应用程序:

  1. 在后台播放可听内容的应用,例如音乐播放器应用
  2. 在后台录制audio内容的应用程序。
  3. 随时向用户通知其位置的应用,例如导航应用
  4. 支持网际协议语音(VoIP)的应用
  5. 需要定期下载和处理新内容的应用(后台抓取)
  6. 从外部附件获得定期更新的应用程序

有什么办法可以在iOS中做背景吗?或者至less我可以在后台获取networking状态?

注:我的应用程序只用于内部分发,不需要担心被拒绝。

你需要做的是使用NSURLSession而不是NSURLConnection (如果你还在使用它)

NSURLSession和NSURLConnection之间的区别

  • NSURLConnection:如果我们有一个与NSURLConnection打开连接,系统中断我们的应用程序,当我们的应用程序进入后台模式,我们收到或发送的一切都丢失。 使用NSURLConnection的流程图

  • NSURLSession:解决这个问题,也给我们在进程下载。 即使我们没有访问权限,它也可以pipe理连接过程。 您将需要在AppDelegate中使用application:handleEventsForBackgroundURLSession:completionHandler 用NSURLSession处理图

所以使用NSURLSession,你不需要pipe理或检查你的互联网连接,因为操作系统为你做。

额外:如何检查我的iOS应用程序的互联网连接

免责声明:我不确定以下框架可以在后台模式下运行

您可以使用框架Rechability来检查您的设备是否具有互联网连接。

https://github.com/tonymillion/Reachability

这是苹果Reachability类的一个替代品,它支持当您收到NSNotification更改可达性时执行操作的块。

您可以在他的repo上检查README.md ,但使用起来非常简单。

使用NSNotification

1

在你的AppDelegate你必须打电话

 [Reachability reachabilityWithHostname:@"www.google.com"]; 

此外,您将需要声明一个属性来存储该值

 @property (strong, nonatomic) Reachability *reach; 

所以现在你将不得不把下面的代码放在你的application:didFinishLaunchingWithOptions:

 _reach = [Reachability reachabilityWithHostname:@"www.google.com"]; 

2

在Controller中,您需要检查是否可达状态,您必须订阅该通知

 [[NSNotificationCenter defaultCenter] addObserver:_sharedInstance selector:@selector(reachabilityDidChange:) name:@"kReachabilityChanged" object:nil]; 

3

现在你可以实现select器reachabilityDidChange:你在哪里检查现在连接与否。 把它放在同一个控制器。

 - (void)reachabilityDidChange:(NSNotification *)note { Reachability * reach = (Reachability *)[note object]; if (self.appDelegate.wasConnected != [reach isReachable]){ if ([reach isReachable]){ NSLog(@"Notification Says Reachable"); [[NSNotificationCenter defaultCenter] postNotificationName:@"ConnectionIsReachable" object:nil]; [self sendPendingOperations]; }else{ [[NSNotificationCenter defaultCenter] postNotificationName:@"ConnectionIsUnreachable" object:nil]; NSLog(@"Notification Says Unreachable"); } self.appDelegate.wasConnected = [reach isReachable]; } } As you can see, we store the last connection state also in a AppDelegate property `@property BOOL wasConnected;` 

4

现在,您必须订阅这些新的通知( ConnectionIsReachableConnectionIsUnreachable )并执行您需要执行的操作。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showNoConnectionAlert) name:@"ConnectionIsUnreachable" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideNoConnectionAlert) name:@"ConnectionIsReachable" object:nil]; 

使用块

我没有testing它的function,但我复制给你的官方文档

 // Allocate a reachability object Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; // Set the blocks reach.reachableBlock = ^(Reachability*reach) { // keep in mind this is called on a background thread // and if you are updating the UI it needs to happen // on the main thread, like this: dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"REACHABLE!"); }); }; reach.unreachableBlock = ^(Reachability*reach) { NSLog(@"UNREACHABLE!"); }; // Start the notifier, which will cause the reachability object to retain itself! [reach startNotifier];