2015-09-04 35 views
1

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

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

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

是我最好的选择之一吗?我错过了另一种方法吗?

这是一个iOS和Android实现的Xamarin应用程序,但我不认为这对我的问题有重大影响;我可以根据需要编写iOS特定的代码。

回答

1

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

我真的不知道你可以有多少杆。这是我推荐的:

  • 当你开始后台下载时,也开始一个后台任务(与beginBackgroundTaskWithExpirationHandler:)。
  • 只要您的后台任务尚未过期,即使在后台,您也可以重新开始下载。
  • 如果您的后台任务过期处理程序被调用,您需要立即结束后台任务。此时,您的应用将停止执行,并且您的下载将在外部进程中继续。
  • 当下载完成或失败时,您的应用将在后台重新启动,并有机会处理结果。我不知道的是,如果你现在可以开始一个新的后台下载。你应该尝试或等待比我知道得更清楚的人...

此外一定要检查-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes;委托方法,以便重新启动您的下载失败而不重新开始。

+0

是的,我应该把它列入选项列表。但是,如果我使用它来再次尝试上传数据,并且尝试失败,那么当应用程序仍处于后台时,是否有任何方法可以尝试其他请求?或者我基本上只有一个镜头,必须等待应用程序返回到前台才能尝试第二个请求? –

+0

看到我编辑的答案。 – deadbeef

+0

谢谢,很多很好的细节。我们实际需要做的是将数据发布到服务器,所以它将成为后台上传任务,但基本思路应该是相同的。如果没有提供更好的解决方案,我会接受你的回答。 –

相关问题