在后台运行时从Xamarin iOS提交数据

时间:2019-07-05 12:55:31

标签: xamarin.ios nsurlsession backgrounding

我在当前的Xamarin项目中有一个奇怪的问题。随着应用向服务器发送更大的数据块以保护其在后台运行时,我们开始执行一项长期运行的任务(使用UIApplication.SharedApplication.BeginBackgroundTask / UIApplication.SharedApplication.EndBackgroundTask API)。奇怪的是,当我使用计算机进行构建和运行时,这种方法效果很好,但是当从他们的计算机构建/部署应用程序时,在运行完全相同的场景时,我的一些同事会遇到超时错误。

据我了解,在像这样长时间运行的任务中运行东西应该可以。我不必在 info.plist 中指定背景功能。另外,由于HttpClient使用NSUrlSession进行发送/接收,应该保护它在应用程序后台运行时不受干扰,对吗?

我无法弄清楚为什么使用不同的Mac构建相同的代码会在同一设备上产生不同的行为。在VS中某个地方可能存在某些可能会影响此行为的机器本地设置吗?

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

这是一个代码示例,该代码能否正常工作/取决于构建/部署它的Mac:

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.

1 个答案:

答案 0 :(得分:1)

您的两个假设似乎都是错误的。

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

https://developer.apple.com/documentation/uikit/uiapplication/1623031-beginbackgroundtaskwithexpiratio?language=objc

  

运行后台任务的应用在有限的时间内需要   运行它们

第二,NSURLSession默认情况下未启用HttpClient,默认情况下,总体NSURLSession并不是在后台处理传输的东西,这只是可能,它将HttpClient自然不使用此模式。再次检查文档:https://developer.apple.com/documentation/foundation/nsurlsession