diff --git a/Runtime/GuruNetworkMonitor/Runtime/NetworkStatusMonitor.cs b/Runtime/GuruNetworkMonitor/Runtime/NetworkStatusMonitor.cs index 17e2b93..3efb332 100644 --- a/Runtime/GuruNetworkMonitor/Runtime/NetworkStatusMonitor.cs +++ b/Runtime/GuruNetworkMonitor/Runtime/NetworkStatusMonitor.cs @@ -10,7 +10,6 @@ namespace Guru.Network public class NetworkStatusMonitor { private const string Tag = "[NET]"; - private const string NETWORK_STATUS_NOT_SET = "not_set"; private const string NETWORK_STATUS_NONE = "none"; private const string NETWORK_STATUS_MOBILE = "mobile"; @@ -23,16 +22,21 @@ namespace Guru.Network private const int CHECK_STATUS_INTERVAL_SECOND = 10; - private DateTime _lastReportTime; - // TODO: 最好做一下持久化存储 + private DateTime LastReportDate + { + get => _saveData.LastReportDate; + set => _saveData.LastReportDate = value; + } + private string LastNetworkStatus { - get => PlayerPrefs.GetString(nameof(LastNetworkStatus), NETWORK_STATUS_NOT_SET); - set => PlayerPrefs.SetString(nameof(LastNetworkStatus), value); + get => _saveData.LastReportStatus; + set => _saveData.LastReportStatus = value; } private readonly Action _onNetworkStatusChanged; private readonly Action _onReportOffline; + private readonly NetworkMonitorData _saveData; /// /// 构造函数 @@ -43,6 +47,9 @@ namespace Guru.Network { _onNetworkStatusChanged = onNetworkStatusChanged; _onReportOffline = onReportOffline; + + _saveData = new NetworkMonitorData(); // 读取数据 + CoroutineHelper.Instance.StartCoroutine(OnCheckingNetworkStatus(CHECK_STATUS_INTERVAL_SECOND)); } @@ -52,12 +59,13 @@ namespace Guru.Network /// public string GetNetworkStatus() { - switch (Application.internetReachability) + var internetReachability = Application.internetReachability; + switch (internetReachability) { - case NetworkReachability.ReachableViaLocalAreaNetwork: - return NETWORK_STATUS_WIFI; case NetworkReachability.ReachableViaCarrierDataNetwork: return NETWORK_STATUS_MOBILE; + case NetworkReachability.ReachableViaLocalAreaNetwork: + return NETWORK_STATUS_WIFI; } return NETWORK_STATUS_NONE; } @@ -72,12 +80,12 @@ namespace Guru.Network /// 当前是可以打点上报 /// /// - private bool CanSendReport() => DateTime.UtcNow.DayOfYear != _lastReportTime.DayOfYear && DateTime.UtcNow.Year != _lastReportTime.Year; + private bool CanSendReport() => DateTime.UtcNow.DayOfYear != LastReportDate.DayOfYear && DateTime.UtcNow.Year != LastReportDate.Year; /// /// 设置打点时间 /// - private void SetReportTime() => _lastReportTime = DateTime.UtcNow; + private void SetReportTime() => LastReportDate = DateTime.UtcNow; private bool NeedReportOffline() { @@ -97,9 +105,9 @@ namespace Guru.Network if (NeedReportOffline()) { - SetReportTime(); - _onReportOffline?.Invoke(LastNetworkStatus); Debug.Log($"{Tag} --- Report Offline: {LastNetworkStatus}"); + _onReportOffline?.Invoke(LastNetworkStatus); + SetReportTime(); } LastNetworkStatus = status; @@ -119,5 +127,68 @@ namespace Guru.Network } } + + [Serializable] + class NetworkMonitorData + { + private const string K_NETWORK_MONITOR_DATA = "guru_network_monitor_data"; + private const string NETWORK_STATUS_NOT_SET = "not_set"; + + private DateTime _lastReportDate; + public DateTime LastReportDate + { + get => _lastReportDate; + set + { + _lastReportDate = value; + Save(true); + } + } + + private string _lastReportStatus; + public string LastReportStatus + { + get => _lastReportStatus; + set + { + _lastReportStatus = value; + Save(); + } + } + + public NetworkMonitorData() + { + Load(); // 立即加载数据 + } + + private void Load() + { + var raw = PlayerPrefs.GetString(K_NETWORK_MONITOR_DATA, ""); + + _lastReportStatus = NETWORK_STATUS_NOT_SET; + _lastReportDate = new DateTime(1970, 1, 1); + if (!string.IsNullOrEmpty(raw)) + { + try + { + var arr = raw.Split("|"); + if (arr.Length > 0) _lastReportStatus = arr[0]; + if (arr.Length > 1) _lastReportDate = DateTime.Parse(arr[1]); + } + catch (Exception ex) + { + Debug.LogError(ex); + } + } + } + + public void Save(bool force = false) + { + var buffer = $"{_lastReportStatus}|{_lastReportDate:g}"; + PlayerPrefs.SetString(K_NETWORK_MONITOR_DATA, buffer); + if(force) PlayerPrefs.Save(); + } + + } } } \ No newline at end of file