Многопутевой TCP для iOS с использованием Xamarin

У меня есть мультиплатформенное приложение в Xamarin, которое подключается к Интернету (используя сотовую сеть телефона) для некоторых целей, а затем общается с локальной сетью WIFI (без доступа в Интернет) для некоторых других целей. Я хочу, чтобы этот сетевой коммутатор плавно переходил от пользователя (взаимодействие с пользователем не требуется).

Что касается Android-части моего приложения, мне удалось реализовать это, используя:

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.AddTransportType(TransportType.Cellular);

тогда позже:

ConnectivityManager.BindProcessToNetwork(network)

Полное объяснение, предоставленное мной здесь: Как сначала подключиться к локальной сети вместо Интернета в приложении C# Xamarin для Android?

Но я не могу понять, как добиться того же для iOS в приложении. Я прочитал следующие ссылки:

https://developer.apple.com/documentation/foundation/urlsessionconfiguration/improving_network_reliability_using_multipath_tcp

https://docs.microsoft.com/en-us/xamarin/ios/app-fundamentals/backgrounding/ios-backgrounding-walkthroughs/background-transfer-walkthrough

https://developer.apple.com/documentation/foundation/urlsessionconfiguration/multipathservicetype

И включил многопутевое разрешение TCP для моего приложения.

Может кто-нибудь направить меня в правильном направлении относительно того, как / где установить объект NSUrlSession в NSUrlSessionMultipathServiceType.Handover во всем жизненном цикле приложения iOS.

Я знаю, что не могу предоставить много информации, но любая помощь в правильном направлении очень ценится.

Обновление: после добавления следующего кода согласно ответу @SushiHangover

var config = NSUrlSessionConfiguration.DefaultSessionConfiguration;
config.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;

Я получаю следующее предупреждение в Xamarin:

Окончательное рабочее обновление: после многих попыток я обнаружил, что по какой-то причине Xamarin неправильно отображал значение Enum на его число. Поэтому мне пришлось вручную установить значение Enum, и теперь передача обслуживания (т.е. многопутевой TCP) работает нормально. Обновленный код:

public void GetDataFromInternet(string strURL)
{
    NSUrl url = new NSUrl(strURL);
    NSUrlRequest request = new NSUrlRequest(url);
    NSUrlSession session = null;
    NSUrlSessionConfiguration config = NSUrlSessionConfiguration.DefaultSessionConfiguration;
    //config.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;    //for some reason this does not work!!
    config.MultipathServiceType = (NSUrlSessionMultipathServiceType)2;            //but this works!!
    session = NSUrlSession.FromConfiguration(config);

    NSUrlSessionTask task = session.CreateDataTask(request, (data, response, error) => {
        Console.WriteLine(data);
    });
    task.Resume();
}

1 ответ

Решение

как / где установить объект NSUrlSession в NSUrlSessionMultipathServiceType.Handover во всем жизненном цикле приложения iOS.

Вы можете изменить сеанс NSUrl по умолчанию через DefaultSessionConfiguration:

var config = NSUrlSessionConfiguration.DefaultSessionConfiguration;
config.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;

Примечание. Предполагается, что вы захотите сделать это как можно раньше в жизненном цикле приложения, т.е. AppDelegate.FinishedLaunching переопределения.

PS Это не то же самое, что вы делаете на Android, и требует, чтобы на вашем сервере (и, что более вероятно, на маршрутизаторе перед сервером (серверами)) был включен многопутевой протокол TCP для обработки автоматического переключения между входящими путями.

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