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() в фоновую задачу, но проблема осталась.
Буду признателен за любые указатели.