【问题标题】:Multipath TCP for iOS using Xamarin使用 Xamarin 的 iOS 多路径 TCP
【发布时间】:2019-12-20 12:05:28
【问题描述】:

我在 Xamarin 中有一个多平台应用程序,它出于某些目的连接到互联网(使用手机的蜂窝网络),然后出于其他目的与本地 WIFI 网络(没有互联网访问权限)通信。我想从用户那里无缝地进行这个网络切换(不需要用户交互)。

对于我的应用程序的 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 中收到以下警告:

最终工作更新: 经过多次尝试,我发现由于某种原因,Xamarin 没有正确地将 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();
}

【问题讨论】:

  • "用本机编程" :/
  • 嗨@Fattie 我刚刚更新了工作代码。现在一切都很好。
  • 我很高兴听到这个消息,伙计!

标签: ios xamarin networking tcp wifi


【解决方案1】:

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

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

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

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

附:这与您在 Android 上执行的操作不同,并且确实需要您的服务器(更有可能是服务器前面的路由器)启用多路径 TCP 以处理传入路径之间的自动切换

【讨论】:

  • 感谢您的建议,但它不起作用,我在 Xamarin 中收到警告(并且“显示潜在修复”未显示任何建议)。请在我的问题中查看上面的更新。
  • @PawanPillai iOS 11.0+
  • 是的,我使用的是 iOS 12.4 SDK 版本。尽管如此,它仍然在传递这个信息。我尝试了许多其他选择,但没有任何效果。作为一种解决方法,我还尝试使用以下方法在某些情况下连接到本地 wifi(其余工作使用蜂窝互联网):spin.atomicobject.com/2018/02/15/connecting-wifi-xamarin-forms 但这总是给出 NEHotspotConfigurationErrorDomain Code=8 “内部错误”。即使我尝试了很多基于谷歌的东西,我也无法解决这个错误。请看看你是否仍然可以指导任何方向。提前致谢。
  • 最后我能够修复它。由于某种原因,Xamarin 没有正确转换 ENUM 值。请参阅上面的最终更新,了解它是如何工作的。但是您的解决方案有所帮助。所以标记就是答案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多