使用Xamarin

时间:2019-08-13 22:35:01

标签: ios xamarin networking tcp wifi

我在Xamarin中有一个多平台应用程序,出于某些目的,它可以连接到Internet(使用Phone的蜂窝网络),然后出于其他目的,可以与本地WIFI网络(不使用Internet访问)进行通信。我想与用户无缝地进行此网络切换(无需用户交互)。

对于我的应用程序的Android部分,我成功使用以下方法实现了这一点:

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

然后再这样:

ConnectivityManager.BindProcessToNetwork(network)

我在这里提供完整的解释: How to connect to local network first instead of internet in C# Xamarin Android app?

但是我无法理解如何在应用程序中为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授权。

有人可以在整个iOS应用程序生命周期中将NSUrlSession对象设置为NSUrlSessionMultipathServiceType.Handover的方式/位置方面指导我正确的方向。

我知道我无法提供很多信息,但是在正确方向上的任何帮助都将受到赞赏。

更新: 根据@SushiHangover的答案添加以下代码后

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

我在Xamarin中收到以下警告: enter image description here

最终工作更新: 经过大量尝试,我发现由于某种原因,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 个答案:

答案 0 :(得分:1)

  

在整个iOS应用程序生命周期中,如何/在何处将NSUrlSession对象设置为NSUrlSessionMultipathServiceType.Handover。

您可以通过DefaultSessionConfiguration更改默认的NSUrl会话:

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

注意:假设您希望在应用程序生命周期中尽早进行此操作,即在AppDelegate.FinishedLaunching覆盖中进行操作。

P.S。这与您在Android上执行的操作不同,并且确实要求您的服务器(很有可能是服务器前面的路由器)启用了多路径TCP,才能处理传入路径之间的自动切换< / p>