Многопутевой 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/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 для обработки автоматического переключения между входящими путями.