在后台时从 Xamarin iOS 提交数据
Submitting data from Xamarin iOS when backgrounded
我在当前的 Xamarin 项目中遇到了一个奇怪的问题。当应用程序向服务器发送更大的数据块时,为了在应用程序进入后台时保护它,我们开始了一个长 运行ning 任务(使用 UIApplication.SharedApplication.BeginBackgroundTask / UIApplication.SharedApplication.EndBackgroundTask
API)。奇怪的是,当我从我的机器上构建和 运行 时,这很好用,但是当应用程序是 build/deployed 来自他们的 运行 完全相同的场景时,我的几个同事收到超时错误机器。
据我了解 运行ning 像这样的长期 运行ning 任务中的东西应该可以工作。我不必在 info.plist 中指定后台功能。此外,由于 HttpClient
为 sending/receiving 使用 NSUrlSession
,当应用程序进入后台时,应该保护它免受中断,对吗?
我不明白为什么使用不同的 Mac 构建相同的代码在同一设备上会产生不同的行为。 VS 中某处是否存在可能影响此行为的机器本地设置?
我现在没有想法,所以任何提示都将不胜感激。
这是一个代码示例,works/fails 取决于 Mac 那 built/deployed 它:
public async Task Submit()
{
// ... some irrelevant code
BackgroundTask.Run(async () => await submitAsync()); // Form-level encapsulation of the UIApplication.SharedApplication.BeginBackgroundTask API
// ... more irrelevant code
}
private async Task submitAsync()
{
if (!IsSubmitAllowed)
return;
IsBusy = true;
IsGoBackAllowed = IsGoNextAllowed = false;
var statusIndicator = new StatusIndicator();
await PopupNavigation.Instance.PushAsync(statusIndicator);
try
{
statusIndicator.Status = "Saving TI";
statusIndicator.Progress = 0.1;
var submitted = await _service.SubmitAsync(Model); // ERROR! causes timeout exception for some
var submittedId = submitted.BackendId;
// ... etc.
你的两个假设似乎都是错误的。
首先,beginBackgroundTaskWithExpirationHandler:
不授予无限背景 activity。最值得注意的是:
Apps running background tasks have a finite amount of time in which to
run them
其次,NSURLSession
在 HttpClient
中默认未启用,总体而言 NSURLSession
不是默认在后台处理传输的东西,这只是可能性和HttpClient
不使用此模式是很自然的。再次检查文档:https://developer.apple.com/documentation/foundation/nsurlsession
我在当前的 Xamarin 项目中遇到了一个奇怪的问题。当应用程序向服务器发送更大的数据块时,为了在应用程序进入后台时保护它,我们开始了一个长 运行ning 任务(使用 UIApplication.SharedApplication.BeginBackgroundTask / UIApplication.SharedApplication.EndBackgroundTask
API)。奇怪的是,当我从我的机器上构建和 运行 时,这很好用,但是当应用程序是 build/deployed 来自他们的 运行 完全相同的场景时,我的几个同事收到超时错误机器。
据我了解 运行ning 像这样的长期 运行ning 任务中的东西应该可以工作。我不必在 info.plist 中指定后台功能。此外,由于 HttpClient
为 sending/receiving 使用 NSUrlSession
,当应用程序进入后台时,应该保护它免受中断,对吗?
我不明白为什么使用不同的 Mac 构建相同的代码在同一设备上会产生不同的行为。 VS 中某处是否存在可能影响此行为的机器本地设置?
我现在没有想法,所以任何提示都将不胜感激。
这是一个代码示例,works/fails 取决于 Mac 那 built/deployed 它:
public async Task Submit()
{
// ... some irrelevant code
BackgroundTask.Run(async () => await submitAsync()); // Form-level encapsulation of the UIApplication.SharedApplication.BeginBackgroundTask API
// ... more irrelevant code
}
private async Task submitAsync()
{
if (!IsSubmitAllowed)
return;
IsBusy = true;
IsGoBackAllowed = IsGoNextAllowed = false;
var statusIndicator = new StatusIndicator();
await PopupNavigation.Instance.PushAsync(statusIndicator);
try
{
statusIndicator.Status = "Saving TI";
statusIndicator.Progress = 0.1;
var submitted = await _service.SubmitAsync(Model); // ERROR! causes timeout exception for some
var submittedId = submitted.BackendId;
// ... etc.
你的两个假设似乎都是错误的。
首先,beginBackgroundTaskWithExpirationHandler:
不授予无限背景 activity。最值得注意的是:
Apps running background tasks have a finite amount of time in which to run them
其次,NSURLSession
在 HttpClient
中默认未启用,总体而言 NSURLSession
不是默认在后台处理传输的东西,这只是可能性和HttpClient
不使用此模式是很自然的。再次检查文档:https://developer.apple.com/documentation/foundation/nsurlsession