Xamarin.ios 在后台从Xamarin iOS提交数据

Xamarin.ios 在后台从Xamarin iOS提交数据,xamarin.ios,nsurlsession,backgrounding,Xamarin.ios,Nsurlsession,Backgrounding,我在我们当前的Xamarin项目中遇到了一个奇怪的问题。当应用程序向服务器发送更大的数据块时,为了在应用程序进入后台时保护它,我们正在使用UIApplication.SharedApplication.BeginBackgroundTask/UIApplication.SharedApplication.EndBackgroundTask API启动一个长时间运行的任务。奇怪的是,当我在自己的机器上构建和运行应用程序时,这种方法非常有效,但我的几个同事在从自己的机器上构建/部署应用程序时,在运行

我在我们当前的Xamarin项目中遇到了一个奇怪的问题。当应用程序向服务器发送更大的数据块时,为了在应用程序进入后台时保护它,我们正在使用UIApplication.SharedApplication.BeginBackgroundTask/UIApplication.SharedApplication.EndBackgroundTask API启动一个长时间运行的任务。奇怪的是,当我在自己的机器上构建和运行应用程序时,这种方法非常有效,但我的几个同事在从自己的机器上构建/部署应用程序时,在运行完全相同的场景时,会出现超时错误

据我所知,在这样一个长时间运行的任务中运行东西应该是可行的。我不必在info.plist中指定背景功能。另外,由于HttpClient使用NSUrlSession进行发送/接收,因此在应用程序后台运行时,应该保护它不受中断,对吗

我不明白为什么相同的代码在同一台设备上使用不同的Mac电脑时会产生不同的行为。在VS中的某个地方是否存在可能影响此行为的机器本地设置

我现在没有主意了,所以任何提示都将不胜感激

这是一个根据构建/部署它的Mac运行/失败的代码示例:

公共异步任务提交 { //…一些不相关的代码 BackgroundTask.Runasync=>Wait submitAsync;//UIApplication.SharedApplication.BeginBackgroundTask API的表单级封装 //…更不相关的代码 } 专用异步任务submitAsync { 如果!我被催眠了 回来 IsBusy=true; IsGoBackAllowed=IsGoNextAllowed=false; var statusIndicator=新的statusIndicator; 等待PopupNavigation.Instance.PushAsyncstatusIndicator; 尝试 { statusIndicator.Status=保存TI; statusIndicator.Progress=0.1; var submitted=wait _service.SubmitAsyncModel;//错误!导致某些服务器出现超时异常 var submittedId=submited.BackendId; //……等等。
你的两个假设似乎都错了

首先,beginBackgroundTaskWithExpirationHandler:不会授予无限的后台活动。最值得注意的是:

运行后台任务的应用程序有有限的时间 运行它们


其次,HttpClient中默认不启用NSURLSession,并且默认情况下,整个NSURLSession不是在后台处理传输的,这只是一种可能性,HttpClient不使用此模式是很自然的。再次查看文档:

让我感到奇怪的是,使用LRT似乎会产生非确定性行为。在我的例子中,当使用不同的机器将相同的代码构建/部署到相同的设备时,我会得到不同的结果。但据我所知,使用LRT回复对于确保安全的服务器往返不是一个好主意。我将阅读NRUrlSession。谢谢!