Xamarin iOS DidReceiveRemoteNotification приостанавливает вызовы HttpClient SendAsync()

У меня есть проект Xamarion для iOS, и я обнаружил, что DidReceiveRemoteNotification() будет приостанавливать вызовы HttpClient.SendAsync, если они запускаются из фона.

Использование VS 2017 Community на Win10, с удаленным подключением к MacMini+xCode/Mono и тестированием на iPhone7 @11.4.1.

Вот код:

public override async void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
        Debug.WriteLine("Calling getMyRestData()");

        getMyRestData();

        Debug.WriteLine("Completed getMyRestData()");

        completionHandler(UIBackgroundFetchResult.NewData);
}

public async void getMyRestData()
{
        var request = new HttpRequestMessage(HttpMethod.Get, "https://www.yahoo.com");

        HttpClient client = new HttpClient();

        Debug.WriteLine("getRestTest send request");

        var response = await client.SendAsync(request);

        Debug.WriteLine("getRestTest got request ");
 }

Push-уведомление молчит, как показано ниже:{"aps":{"content-available": 1}}

С приложением на переднем плане я получаю ожидаемые результаты в представлении Отладка

[0:] Calling getMyRestData()
[0:] getRestTest send request
[0:] Completed getMyRestData()
[0:] getRestTest got request 

Однако, если приложение находится в фоновом режиме, хотя DidReceiveRemoteNotification запущено, оно приостанавливает вызов HttpClient.sendAsync, что приводит к представлению Debug:

[0:] Calling getMyRestData()
[0:] getRestTest send request
[0:] Completed getMyRestData()

И если я затем верну приложение на передний план, вызов завершится:

Thread started: <Thread Pool> #12
[0:] getRestTest got request 

Такое поведение все происходит менее чем за 30 секунд.

Вопрос: это ожидаемое поведение? В идеале я хотел бы, чтобы приложение извлекало данные из API Rest и обновляло базу данных приложения при получении push-уведомления.

Я копал в течение нескольких дней и нашел только один подобный вопрос, рекомендация там - использовать beginBackgroundTask* + endBackgroundTask. Я попытался обернуть getMyRestData() в фоновую задачу, но проблема осталась.

Буду признателен за любые указатели.

0 ответов

Другие вопросы по тегам