在后台将数据发送到服务器/重试请求的选项

时间:2015-09-04 20:26:58

标签: ios xamarin background-fetch

我们正在开发一个企业应用程序,用于将用户输入的表单数据发送到服务器。应用程序尝试在用户点击“保存”后立即发送数据。如果发送数据时出现问题(例如没有网络连接),我们希望在X分钟后再次尝试,并定期重试,直到数据成功发送。请求通常不是很大或长时间运行,但用户经常处于没有网络访问权限的环境中,因此重试很重要。

在应用程序运行时重试API请求非常简单,但理想情况下,我们希望在应用程序处于后台时定期重试。 iOS后台执行功能可以实现的最佳效果是什么?以下是我看到的一些选项:

  • 使用beginBackgroundTaskWithExpirationHandler:一次性请求额外时间。这将基本上给我们一个额外的尝试,即在应用程序进入后台后发送数据,但不会重复尝试
  • 使用“后台获取”功能,并在应用程序被唤醒以进行后台获取时尝试将任何新数据发送到服务器。理论上听起来不错,但我担心这可能是滥用后台获取功能?

这是我最好的选择之一吗?我还缺少另一种方法吗?

这是一款支持iOS和Android实现的Xamarin应用,但我认为这不会对我的问题产生重大影响。我可以根据需要编写iOS特定代码。

1 个答案:

答案 0 :(得分:1)

我认为您错过了一种方法:background NSURLSessions。而且我认为这是你应该使用的。

我真的不知道你可以用多少枪。这是我的建议:

  • 当您开始后台下载时,也开始后台任务(使用beginBackgroundTaskWithExpirationHandler:)。
  • 只要您的后台任务没有过期,您就可以重新开始下载,即使是在后台也是如此。
  • 如果调用后台任务到期处理程序,则需要立即结束后台任务。此时,您的应用将停止执行,您的下载将在外部流程中继续。
  • 当下载完成或失败时,您的应用将在后台重新启动,并有机会处理结果。我不知道的是,此时您是否能够开始新的后台下载。你应该试着或者等待比我更了解的人......

另外,请务必检查-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes;委托方法,以便在失败时重新启动下载,而不是重新开始。