diff --git a/Runtime/Aptabase.cs b/Runtime/Aptabase.cs index fc9e39d..f763f2e 100644 --- a/Runtime/Aptabase.cs +++ b/Runtime/Aptabase.cs @@ -103,7 +103,7 @@ public static void OnApplicationFocus(bool hasFocus) } else { - Flush(); + _dispatcher.FlushOrSaveToDisk(); StopPolling(); } } diff --git a/Runtime/Dispatcher/Dispatcher.cs b/Runtime/Dispatcher/Dispatcher.cs index c38ed68..5ca039d 100644 --- a/Runtime/Dispatcher/Dispatcher.cs +++ b/Runtime/Dispatcher/Dispatcher.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using AptabaseSDK.TinyJson; using UnityEngine; @@ -8,6 +9,7 @@ namespace AptabaseSDK public class Dispatcher: IDispatcher { private const string EVENTS_ENDPOINT = "/api/v0/events"; + private const string APTABASE_KEY = "aptabase_key"; private const int MAX_BATCH_SIZE = 25; @@ -21,14 +23,19 @@ public class Dispatcher: IDispatcher public Dispatcher(string appKey, string baseURL, EnvironmentInfo env) { + var cachedEventsJson = PlayerPrefs.GetString(APTABASE_KEY); + var cacheEvents = string.IsNullOrEmpty(cachedEventsJson) ? new List() : cachedEventsJson.FromJson>(); + //create event queue - _events = new Queue(); + _events = new Queue(cacheEvents); //web request setup information _apiURL = $"{baseURL}{EVENTS_ENDPOINT}"; _appKey = appKey; _environment = env; _webRequestHelper = new WebRequestHelper(); + + PlayerPrefs.DeleteKey(APTABASE_KEY); } public void Enqueue(Event data) @@ -42,7 +49,7 @@ private void Enqueue(List data) _events.Enqueue(eventData); } - public async void Flush() + public async Task Flush() { if (_flushInProgress || _events.Count <= 0) return; @@ -75,9 +82,18 @@ public async void Flush() _flushInProgress = false; } - + + public async Task FlushOrSaveToDisk() + { + await Flush(); + + PlayerPrefs.SetString(APTABASE_KEY, _events.Take(1000).ToList().ToJson()); + } + private static async Task SendEvents(List events) { + if(Application.internetReachability == NetworkReachability.NotReachable) return false; + var webRequest = _webRequestHelper.CreateWebRequest(_apiURL, _appKey, _environment, events.ToJson()); var result = await _webRequestHelper.SendWebRequestAsync(webRequest); return result; diff --git a/Runtime/Dispatcher/IDispatcher.cs b/Runtime/Dispatcher/IDispatcher.cs index c7c34bc..d604147 100644 --- a/Runtime/Dispatcher/IDispatcher.cs +++ b/Runtime/Dispatcher/IDispatcher.cs @@ -1,9 +1,13 @@ +using System.Threading.Tasks; + namespace AptabaseSDK { public interface IDispatcher { - public void Enqueue(Event data); + void Enqueue(Event data); - public void Flush(); + Task Flush(); + + Task FlushOrSaveToDisk(); } } \ No newline at end of file diff --git a/Runtime/Dispatcher/WebGLDispatcher.cs b/Runtime/Dispatcher/WebGLDispatcher.cs index 020b830..39ddd63 100644 --- a/Runtime/Dispatcher/WebGLDispatcher.cs +++ b/Runtime/Dispatcher/WebGLDispatcher.cs @@ -1,12 +1,15 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using AptabaseSDK.TinyJson; +using UnityEngine; namespace AptabaseSDK { public class WebGLDispatcher: IDispatcher { private const string EVENT_ENDPOINT = "/api/v0/event"; + private const string APTABASE_KEY = "aptabase_key"; private static string _apiURL; private static WebRequestHelper _webRequestHelper; @@ -18,20 +21,24 @@ public class WebGLDispatcher: IDispatcher public WebGLDispatcher(string appKey, string baseURL, EnvironmentInfo env) { + var cachedEventsJson = PlayerPrefs.GetString(APTABASE_KEY); + var cacheEvents = string.IsNullOrEmpty(cachedEventsJson) ? new List() : cachedEventsJson.FromJson>(); + //create event queue - _events = new Queue(); + _events = new Queue(cacheEvents); //web request setup information _apiURL = $"{baseURL}{EVENT_ENDPOINT}"; _appKey = appKey; _environment = env; _webRequestHelper = new WebRequestHelper(); + + PlayerPrefs.DeleteKey(APTABASE_KEY); } public void Enqueue(Event data) { _events.Enqueue(data); - Flush(); } private void Enqueue(List data) @@ -40,7 +47,7 @@ private void Enqueue(List data) _events.Enqueue(eventData); } - public async void Flush() + public async Task Flush() { if (_flushInProgress || _events.Count <= 0) return; @@ -69,9 +76,18 @@ public async void Flush() _flushInProgress = false; } + + public async Task FlushOrSaveToDisk() + { + await Flush(); + + PlayerPrefs.SetString(APTABASE_KEY, _events.Take(1000).ToList().ToJson()); + } private static async Task SendEvent(Event eventData) { + if(Application.internetReachability == NetworkReachability.NotReachable) return false; + var webRequest = _webRequestHelper.CreateWebRequest(_apiURL, _appKey, _environment, eventData.ToJson()); var result = await _webRequestHelper.SendWebRequestAsync(webRequest); return result;