Xamarin.Forms iOS - 当设备连接互联网时开始上传数据,即使应用程序当前未处于活动状态或处于后台也是如此

Posted

技术标签:

【中文标题】Xamarin.Forms iOS - 当设备连接互联网时开始上传数据,即使应用程序当前未处于活动状态或处于后台也是如此【英文标题】:Xamarin.Forms iOS - start uploading data when device gets internet connectivity even when app is not currently active or is in the background 【发布时间】:2019-09-05 23:20:21 【问题描述】:

我有一个 Xamarin.Forms 应用程序,用户在其中创建“列表”,然后将它们发送到服务器(Http api 调用)。我们的一个用例是用户创建了一个列表,但目前没有互联网连接,因此列表将处于“待定”状态。然后用户可以后台应用程序(不再活动)。稍后,用户现在可以连接互联网,我希望应用自动发送这些待处理的列表,而无需用户再次打开应用。

我目前正在 Xamarin.Forms 应用的 ios 实现中寻找一种方法,并且还需要对 android 实现做类似的事情。

我已经查看了 iOS 的 Background Fetch,但目前 PerformFetch 似乎很少被调用,即使我将间隔设置为 backgroundfetchminimum,所以它可能不够可靠。 此外,我在 iOS 文档上读到 PerformFetch 上的代码不应运行超过 30 秒,否则会受到“惩罚”并进一步限制间隔。列表可以附加大图像或视频,发送所有这些肯定需要 30 多秒。

【问题讨论】:

PerformFetch 不是您正在寻找的 API。看看 NSUrlSessionUploadTask.CreateUploadTask,从这里开始有一些好的文档:developer.xamarin.com/guides/ios/application_fundamentals/… 阅读文档,NSUrlSsession 似乎是我在 iOS 用例中所需要的。谢谢你的建议 【参考方案1】:

NSUrlSessionUploadTask 处理连接问题。如果前一个任务出错,您还应该实现 didCompleteWithError 处理程序并再次排队相同的上传。

Rob Gibbens 有一个很好的github example。他实现了 NSUrlSessionDownloadTask 但您将使用 NSUrlSessionUploadTask 以相同的方法代替。

考虑使用MessagingCenter 在您的项目中清理代码。

【讨论】:

感谢有关在 iOS 上使用 NSUrlSessionUploadTasks 的建议以及分享该 github 示例,因为它还有一些关于为 Android 实现某些东西的东西。我试图在 android 上使用 JobScheduler 来做与 NSUrlSession 类似的事情,但它似乎不像 NSUrlSession 那样可靠,因为即使有与 NSUrlSession 不同的网络连接,它也不会立即运行作业

以上是关于Xamarin.Forms iOS - 当设备连接互联网时开始上传数据,即使应用程序当前未处于活动状态或处于后台也是如此的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上的 Xamarin.Forms.Maps 中使用 Xamarin.Essentials Geolocation 获取设备位置的奇怪问题

Xamarin.Forms 无法更改本地设备上 Xamarin.iOS 中的应用程序图标

Xamarin Forms iOS 在唤醒时冻结

Xamarin Forms:在 Android 设备的内部存储中写入文件

Xamarin Forms - IOS - 汉堡菜单标题颜色与状态栏不同

Xamarin Forms Webview html 视频不在 iOS 设备上播放