检查后台的networking连接并上传数据
我得到一个要求,能够检查是否有失败状态的数据,并通过web服务上传。
stream量将是:
- 用户尝试上传数据,但由于没有互联网连接而失败
- 用户停止使用应用程序,所以应用程序将背景
- 应用程序开始识别互联网连接是否可用
- 如果可用,则直接调用Web服务来上传数据
- 如果不可用,它将返回到#3
回到我在iOS 7上的最后一次开发,之前的背景时间是10分钟,但是变成了3分钟。
后台取指 :
当这个方法被调用时,你的应用程序有最多30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。 在实践中,您的应用程序应该在下载所需数据后尽快调用完成处理程序块。 如果您不及时调用完成处理程序,则您的应用程序将被终止。
此外,这些是唯一允许做后台的应用程序:
- 在后台播放可听内容的应用,例如音乐播放器应用
- 在后台录制audio内容的应用程序。
- 随时向用户通知其位置的应用,例如导航应用
- 支持网际协议语音(VoIP)的应用
- 需要定期下载和处理新内容的应用(后台抓取)
- 从外部附件获得定期更新的应用程序
有什么办法可以在iOS中做背景吗?或者至less我可以在后台获取networking状态?
注:我的应用程序只用于内部分发,不需要担心被拒绝。
你需要做的是使用NSURLSession
而不是NSURLConnection
(如果你还在使用它)
NSURLSession和NSURLConnection之间的区别
-
NSURLConnection:如果我们有一个与NSURLConnection打开连接,系统中断我们的应用程序,当我们的应用程序进入后台模式,我们收到或发送的一切都丢失。
-
NSURLSession:解决这个问题,也给我们在进程下载。 即使我们没有访问权限,它也可以pipe理连接过程。 您将需要在AppDelegate中使用
application:handleEventsForBackgroundURLSession:completionHandler
所以使用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
现在,您必须订阅这些新的通知( ConnectionIsReachable
, ConnectionIsUnreachable
)并执行您需要执行的操作。
[[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];