update: 完善 guru_offline 打点的本地持久化存储功能, CodeReview

--story=1021173 --user=yufei.hu 【中台】【BI】上报用户离线打点 guru_offline https://www.tapd.cn/33527076/s/1161158

Signed-off-by: huyufei <yufei.hu@castbox.fm>
胡宇飞 2024-08-01 12:44:05 +08:00
parent 720b47dcbf
commit a768b1de90
1 changed files with 83 additions and 12 deletions

View File

@ -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<string> _onNetworkStatusChanged;
private readonly Action<string> _onReportOffline;
private readonly NetworkMonitorData _saveData;
/// <summary>
/// 构造函数
@ -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
/// <returns></returns>
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
/// 当前是可以打点上报
/// </summary>
/// <returns></returns>
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;
/// <summary>
/// 设置打点时间
/// </summary>
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();
}
}
}
}