我想检测用户何时在线或离线。
我正在使用CrossConnectivity
软件包来检测连接性更改。
我必须连接到 VPN(确切地说是Sonic Wall),才能连接到我的服务器。
我的问题是这样的:当我连接到服务器时,我需要切换应用程序才能连接到服务器。当我切换回我的应用程序时,功能SyncFunction.SyncUser(host, database, contact, ipaddress, pingipaddress)
未执行。连接更改功能不在我的App.xaml.cs
上,而是在我的Main Menu Content page
上,因为我需要在主菜单中而不是整个应用程序中执行同步功能。我该如何解决?
CrossConnectivity.Current.ConnectivityChanged += async (sender, args) =>
{
var appdate = Preferences.Get("appdatetime", String.Empty, "private_prefs");
if (string.IsNullOrEmpty(appdate))
{
Preferences.Set("appdatetime", DateTime.Now.ToString(), "private_prefs");
}
else
{
if (DateTime.Now >= DateTime.Parse(Preferences.Get("appdatetime", String.Empty, "private_prefs")))
{
Preferences.Set("appdatetime", DateTime.Now.ToString(), "private_prefs");
if (CrossConnectivity.Current.IsConnected)
{
var ping = new Ping();
var reply = ping.Send(new IPAddress(pingipaddress), 5000);
if (reply.Status == IPStatus.Success)
{
lblStatus.Text = "Syncing data to server";
lblStatus.BackgroundColor = Color.FromHex("#2bcbba");
await Task.Delay(5000);
SyncFunction.SyncUser(host, database, contact, ipaddress, pingipaddress);
lblStatus.Text = "Online - Connected to server";
lblStatus.BackgroundColor = Color.FromHex("#2ecc71");
}
else
{
lblStatus.Text = "Online - Server unreachable. Connect to VPN";
lblStatus.BackgroundColor = Color.FromHex("#e67e22");
}
}
else
{
lblStatus.Text = "Offline - Connect to internet";
lblStatus.BackgroundColor = Color.FromHex("#e74c3c");
}
}
else
{
await DisplayAlert("Application Error", "It appears you change the time/date of your phone. Please restore the correct time/date", "Got it");
await Navigation.PopToRootAsync();
}
}
};
答案 0 :(得分:0)
检测整个VPN的连接更改并不容易。
一种解决方法是将Web服务用作ping。 如果您有使用API的后端,则可以定期执行此“ ping”操作,以确保可以访问网络和API。
除了连接检查之外,还将使用此解决方案
通常在mob应用程序中,此“ ping端点”可能类似于“ / about”。 此外,可以使用此特定服务来执行App Mob版本和API版本之间的兼容性版本检查。
(另请参阅Xamarin.Essentials,以Xamarin.Essentials:Connectivity,https://docs.microsoft.com/fr-fr/xamarin/essentials/connectivity?context=xamarin%2Fxamarin-forms&tabs=android代替CrossConnectivity)