Как сохранить выполнение задачи, когда приложение работает на iOS с помощью Xamarin? - PullRequest
1 голос
/ 10 октября 2019

Итак, у меня есть вспомогательный метод, который я запускаю на iOS для выполнения фоновой задачи в моем приложении. Вызов отправляет сообщение нашему бэкэнду, который отправляет на устройство уведомление об открытии отдельного приложения, которое пользователь нажимает, чтобы выполнить двухфакторную аутентификацию.

Проблема заключается в том, что при запуске SimpleCall пользователь нажимает на уведомление (или на домашнюю страницу), и задача немедленно отменяется. Логика используется для работы в предыдущих версиях iOS / Xamarin, но больше не работает. Я пытался запустить фоновый помощник на более низких уровнях кода, но результаты остались прежними.

Есть ли лучший способ реализовать задачи такого типа, возможно, потому, что он выполняет блокирующий сетевой вызов?

Вызов выглядит примерно так:

public async Task<Response> SimpleCall()
    {
        return await GetNetworkResponseAsync(() => {
                var response = _loginHelper.Tasks.User.WaitForAppPush(...);             
            return response;
        });
    }
public override async Task RunInBackground(string name, Func<Task> taskToKeepRunning)
    {

        nint taskId = 0;
        taskId = UIApplication.SharedApplication.BeginBackgroundTask(name, new Action(() =>
        {
            Debug.WriteLine("Exhausted time");
            UIApplication.SharedApplication.EndBackgroundTask(taskId);
        }));
        await taskToKeepRunning.Invoke();

        Debug.WriteLine("Completed task");
        UIApplication.SharedApplication.EndBackgroundTask(taskId);
    }

public void Run(){
     Response result = null;
        var act = new Func<Task>(async () =>
        { 

                try
                {
                    var pushResult = await _authService.SimpleCall();
                    result = pushResult?.Data ?? null;
                }
                catch(Exception ex)
                {
                Debug.WriteLine("Act Call:" + ex.Message);
                }

        });

        if (Device.RuntimePlatform == Device.iOS)
        {
            await _backgroundService.RunInBackground("Login", act); 

        }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...