在后台检查网络连接并上传数据

Posted

技术标签:

【中文标题】在后台检查网络连接并上传数据【英文标题】:Check network connection in background and upload data 【发布时间】:2015-09-04 08:23:53 【问题描述】:

我要求能够检查是否有失败状态的数据并通过网络服务上传。

流程将是:

    用户尝试上传数据但由于没有互联网连接而失败 用户停止使用应用,因此应用进入后台 应用开始识别互联网连接是否可用 如果有的话,直接调用web服务上传数据 如果不可用,它将返回到#3

回到我上次在

后台获取

调用此方法时,您的应用最多有 30 秒 挂钟时间来执行下载操作并调用 指定的完成处理程序块。在实践中,您的应用应该调用 完成处理程序块在下载后尽快 需要的数据。如果您没有及时调用完成处理程序,您的 应用程序已终止。

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

    在后台向用户播放有声内容的应用,例如音乐播放器应用 在后台录制音频内容的应用程序。 让用户随时了解其位置的应用,例如导航应用 支持互联网协议语音 (VoIP) 的应用 需要定期下载和处理新内容的应用(后台获取) 从外部附件接收定期更新的应用

有没有什么办法可以在 ios 中做后台,或者至少我可以在后台获取网络状态?

注意:我的应用仅供内部分发,无需担心被拒绝。

【问题讨论】:

我可以帮助您检查您的设备是否有互联网连接,这会解决您的问题吗? 【参考方案1】:

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

NSURLSession 和 NSURLConnection 的区别

NSURLConnection:如果我们与 NSURLConnection 有一个打开的连接并且系统中断了我们的应用程序,当我们的应用程序进入后台模式时,我们接收或发送的所有内容都会丢失。

NSURLSession:解决这个问题,也给我们进程外的下载。即使我们无权访问,它也会管理连接过程。您需要在 AppDelegate 中使用 application:handleEventsForBackgroundURLSession:completionHandler

所以使用 NSURLSession,你不需要管理或检查 您的互联网连接,因为操作系统会为您完成。

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

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

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

https://github.com/tonymillion/Reachability

它是 Apple 的 Reachability 类的直接替代品,它支持在您收到 NSNotification of reachability changed 时执行块来执行操作。

您可以在他的 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

在控制器中你需要检查是否可达状态,你必须订阅那个通知

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

3

现在您可以实现选择器reachabilityDidChange: 来检查现在是否已连接。放在同一个Controller中。

- (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];

使用块

我没有测试过这个功能,但我把官方文档复制给你

// 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];

【讨论】:

嗨,我想了解更多关于 NSURLSession 的信息,并在阅读 Apple 的官方文档后写了另一个线程 ***.com/questions/32423631/ios-background-execution。感谢您的可达性参考,我会测试它。

以上是关于在后台检查网络连接并上传数据的主要内容,如果未能解决你的问题,请参考以下文章

Android 连接时在后台发送数据

iOS NSURLSession 实现网络请求-文件下载-上传-后台下载

iOS NSURLSession 实现网络请求-文件下载-上传-后台下载

Android 网络连接状态的监控

该应用程序需要能够离线工作,以便以后通过 WiFi 或蜂窝连接上传

Jupyter notebook更换Python环境(change kernel)报错:到后台服务的连接没能建立, 我们会继续尝试重连, 请检查网络连接还有服务配置.