Отправка данных из Xamarin iOS в фоновом режиме - PullRequest
0 голосов
/ 05 июля 2019

У меня странная проблема в нашем текущем проекте 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 Ответ

1 голос
/ 05 июля 2019

Кажется, что оба ваших предположения неверны.

Во-первых, beginBackgroundTaskWithExpirationHandler: не предоставляет неограниченной фоновой активности. В частности:

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

Приложения, выполняющие фоновые задачи, имеют ограниченное время, в течение которого запустить их

Во-вторых, NSURLSession не включен по умолчанию в HttpClient, и общий NSURLSession не является чем-то, что обрабатывает переводы в фоновом режиме по умолчанию, это просто возможность, и было бы естественно, что HttpClient не использует этот режим. Еще раз проверьте документацию: https://developer.apple.com/documentation/foundation/nsurlsession

...