【问题标题】:How to force XAMARIN app to use WIFI only如何强制 XAMARIN 应用仅使用 WIFI
【发布时间】:2020-06-08 08:50:19
【问题描述】:

我正在XAMARIN 中构建一个应用程序,该应用程序必须通过wifi 连接到自定义设备,并且该设备没有互联网连接。所以我的应用程序总是想在移动数据上工作,并且永远不会与设备通信。无论如何强制应用程序只使用WIFI 而从不使用移动数据?我想我不是唯一一个遇到这个问题的人,因为我已经看到了一些关于这个问题的帖子,但在 xamarin 中没有一个是具体的。

编辑: 我发现如果我让应用程序运行大约 50 秒,那么它将使用移动数据的 wifi。这是由于一些超时吗?如果是这样,那我可以缩短超时时间吗?

【问题讨论】:

  • 对于iOS,我们只能在系统设置中设置上网权限。在 Android 中,您可以参考stackoverflow.com/questions/35729617/…
  • @LucasZhang-MSFT 我已经以编程方式连接到设备,这不是问题。问题是,如果启用了移动数据,我的 Android 手机会自动开始通过 wifi 的移动数据执行操作(因为 wifi 未连接到互联网)。 Android 正在让这种类型的连接变得非常痛苦。
  • 恐怕不可能做到这一点。我们只能在系统设置中设置网络。

标签: c# xamarin xamarin.forms xamarin.android xamarin.ios


【解决方案1】:

经过大量出汗后,我找到了解决方案。用这段代码创建一个类:

using Android.Content;
using Android.Net;

namespace Project.Communication
{
    class ForceNetworkType
    {
        public static Context _context = Android.App.Application.Context;

        /// <summary>
        /// Forces the wifi over cellular
        /// </summary>
        public static void ForceWifiOverCellular()
        {
            ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);

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

            var callback = new ConnectivityManager.NetworkCallback();
            connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
        }

        /// <summary>
        /// Forces the cellular over wifi.
        /// </summary>
        public static void ForceCellularOverWifi()
        {
            ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);

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

            connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
        }
    }

    /// <summary>
    /// Custom network available call back.
    /// </summary>
    public class CustomNetworkAvailableCallBack : ConnectivityManager.NetworkCallback
    {
        public static Context _context = Android.App.Application.Context;

        ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);

        public override void OnAvailable(Network network)
        {
            //ConnectivityManager.SetProcessDefaultNetwork(network);    //deprecated (but works even in Android P)
            connection_manager.BindProcessToNetwork(network);           //this works in Android P
        }
    }
}

然后你只需在需要强制某些网络的地方使用:

ForceNetworkType.ForceWifiOverCellular();

通过移动数据强制 wifi。

【讨论】:

    【解决方案2】:

    使用 Xamarin.Essentials。 像这样:

    >

    var profiles = Connectivity.ConnectionProfiles;
    if (profiles.Contains(ConnectionProfile.WiFi))
    {
        // Active Wi-Fi connection.
    }
    

    您可以更改此检查以阻止没有 wifi 连接的用户。

    参考:

    https://docs.microsoft.com/en-us/dotnet/api/xamarin.essentials.connectionprofile?view=xamarin-essentials

    【讨论】:

      【解决方案3】:

      我相信您实际上能做的最好的事情就是设置您希望设备使用的偏好。对于这两种操作系统,除非请求超时,否则它将更喜欢 Wifi 连接而不是蜂窝连接。

      但是,您可以在 iOS 中使用 Reachability 类来表示:

      //伪代码

      if(ReachabilityStatus == ReachableViaWifi)
      {
      //Only do things when WIFI is on
      }
      
      else
      {
      //Only do things when WIFI is not on
      }
      

      在 Android 中,您可以使用 ConnectivityManager 执行以下操作:

      //又是伪代码

      ConnectivityManager connectivityManager = (ConnectivityManager)GetSystemService(Context.ConnectivityService);
      
      NetworkInfo wifi = connectivityManager.GetNetworkInfo(ConnectivityType.Wifi);
      
              if (wifi.IsConnected)
              {
                  //Pretty fly for a wifi
              }
              else
              {
                  //No wifi here!
              }
      

      【讨论】:

      • 这远不能解决我的问题。我知道当我连接到妻子时,我会在连接到 wifi 时做一些事情,但是如果在我连接到 wifi 时移动数据开启,该应用程序将尝试使用移动数据,因为它有互联网连接.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多