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 public class NetworkStatusMonitor
{ {
private const string Tag = "[NET]"; 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_NONE = "none";
private const string NETWORK_STATUS_MOBILE = "mobile"; private const string NETWORK_STATUS_MOBILE = "mobile";
@ -23,16 +22,21 @@ namespace Guru.Network
private const int CHECK_STATUS_INTERVAL_SECOND = 10; private const int CHECK_STATUS_INTERVAL_SECOND = 10;
private DateTime _lastReportTime; private DateTime LastReportDate
// TODO: 最好做一下持久化存储 {
get => _saveData.LastReportDate;
set => _saveData.LastReportDate = value;
}
private string LastNetworkStatus private string LastNetworkStatus
{ {
get => PlayerPrefs.GetString(nameof(LastNetworkStatus), NETWORK_STATUS_NOT_SET); get => _saveData.LastReportStatus;
set => PlayerPrefs.SetString(nameof(LastNetworkStatus), value); set => _saveData.LastReportStatus = value;
} }
private readonly Action<string> _onNetworkStatusChanged; private readonly Action<string> _onNetworkStatusChanged;
private readonly Action<string> _onReportOffline; private readonly Action<string> _onReportOffline;
private readonly NetworkMonitorData _saveData;
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@ -43,6 +47,9 @@ namespace Guru.Network
{ {
_onNetworkStatusChanged = onNetworkStatusChanged; _onNetworkStatusChanged = onNetworkStatusChanged;
_onReportOffline = onReportOffline; _onReportOffline = onReportOffline;
_saveData = new NetworkMonitorData(); // 读取数据
CoroutineHelper.Instance.StartCoroutine(OnCheckingNetworkStatus(CHECK_STATUS_INTERVAL_SECOND)); CoroutineHelper.Instance.StartCoroutine(OnCheckingNetworkStatus(CHECK_STATUS_INTERVAL_SECOND));
} }
@ -52,12 +59,13 @@ namespace Guru.Network
/// <returns></returns> /// <returns></returns>
public string GetNetworkStatus() public string GetNetworkStatus()
{ {
switch (Application.internetReachability) var internetReachability = Application.internetReachability;
switch (internetReachability)
{ {
case NetworkReachability.ReachableViaLocalAreaNetwork:
return NETWORK_STATUS_WIFI;
case NetworkReachability.ReachableViaCarrierDataNetwork: case NetworkReachability.ReachableViaCarrierDataNetwork:
return NETWORK_STATUS_MOBILE; return NETWORK_STATUS_MOBILE;
case NetworkReachability.ReachableViaLocalAreaNetwork:
return NETWORK_STATUS_WIFI;
} }
return NETWORK_STATUS_NONE; return NETWORK_STATUS_NONE;
} }
@ -72,12 +80,12 @@ namespace Guru.Network
/// 当前是可以打点上报 /// 当前是可以打点上报
/// </summary> /// </summary>
/// <returns></returns> /// <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>
/// 设置打点时间 /// 设置打点时间
/// </summary> /// </summary>
private void SetReportTime() => _lastReportTime = DateTime.UtcNow; private void SetReportTime() => LastReportDate = DateTime.UtcNow;
private bool NeedReportOffline() private bool NeedReportOffline()
{ {
@ -97,9 +105,9 @@ namespace Guru.Network
if (NeedReportOffline()) if (NeedReportOffline())
{ {
SetReportTime();
_onReportOffline?.Invoke(LastNetworkStatus);
Debug.Log($"{Tag} --- Report Offline: {LastNetworkStatus}"); Debug.Log($"{Tag} --- Report Offline: {LastNetworkStatus}");
_onReportOffline?.Invoke(LastNetworkStatus);
SetReportTime();
} }
LastNetworkStatus = status; 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();
}
}
} }
} }