【问题标题】:Options for sending data to server/retrying requests in background将数据发送到服务器/在后台重试请求的选项
【发布时间】:2015-09-04 20:26:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios xamarin background-fetch


    【解决方案1】:

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

    我真的不知道你能用这个拍多少张。这是我的建议:

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

    还要确保检查 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes; 委托方法,以便在失败的地方重新开始下载而不是重新开始。

    【讨论】:

    • 是的,我应该将其包含在选项列表中。但是,如果我使用它再次尝试上传数据,但尝试失败,我是否有办法在应用程序仍在后台时尝试另一个请求?还是我基本上得到了一个镜头,必须等待应用返回前台才能尝试第二个请求?
    • 谢谢,很多很好的细节。我们实际需要做的是 POST 数据到服务器,所以这将是一个后台上传任务,但基本思想应该是相同的。如果没有其他内容可以提供更好的解决方案,我会接受您的回答。
    • 还有一个示例代码,应该让您轻松尝试:developer.apple.com/library/ios/samplecode/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多