Skip to content

Commit 460a83f

Browse files
committed
fix(demo): retry on invalid_player_ids race condition
1 parent 7e46932 commit 460a83f

4 files changed

Lines changed: 65 additions & 21 deletions

File tree

examples/demo/Assets/Scripts/Services/OneSignalApiService.cs

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -180,22 +180,66 @@ private JObject BuildBasePayload(string title, string body, string subscriptionI
180180
["contents"] = new JObject { ["en"] = body },
181181
};
182182

183+
// Retry once on `invalid_player_ids` to absorb the brief race where the
184+
// subscription has been created locally but is not yet visible to the
185+
// /notifications endpoint.
183186
private async Task<bool> PostNotification(string jsonPayload)
184187
{
185-
var request = new UnityWebRequest("https://onesignal.com/api/v1/notifications", "POST");
186-
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonPayload));
187-
request.downloadHandler = new DownloadHandlerBuffer();
188-
request.SetRequestHeader("Content-Type", "application/json");
189-
request.SetRequestHeader("Accept", "application/vnd.onesignal.v1+json");
188+
for (var attempt = 0; attempt < 2; attempt++)
189+
{
190+
var request = new UnityWebRequest(
191+
"https://onesignal.com/api/v1/notifications",
192+
"POST"
193+
);
194+
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonPayload));
195+
request.downloadHandler = new DownloadHandlerBuffer();
196+
request.SetRequestHeader("Content-Type", "application/json");
197+
request.SetRequestHeader("Accept", "application/vnd.onesignal.v1+json");
198+
199+
var tcs = new TaskCompletionSource<bool>();
200+
var operation = request.SendWebRequest();
201+
operation.completed += _ => tcs.TrySetResult(true);
202+
await tcs.Task;
203+
204+
if (request.result != UnityWebRequest.Result.Success)
205+
{
206+
request.Dispose();
207+
return false;
208+
}
190209

191-
var tcs = new TaskCompletionSource<bool>();
192-
var operation = request.SendWebRequest();
193-
operation.completed += _ => tcs.TrySetResult(true);
194-
await tcs.Task;
210+
var responseText = request.downloadHandler.text;
211+
request.Dispose();
195212

196-
bool success = request.result == UnityWebRequest.Result.Success;
197-
request.Dispose();
198-
return success;
213+
if (HasInvalidPlayerIds(responseText))
214+
{
215+
if (attempt == 0)
216+
{
217+
await Task.Delay(3000);
218+
continue;
219+
}
220+
return false;
221+
}
222+
223+
return true;
224+
}
225+
226+
return false;
227+
}
228+
229+
private static bool HasInvalidPlayerIds(string responseJson)
230+
{
231+
if (string.IsNullOrWhiteSpace(responseJson))
232+
return false;
233+
try
234+
{
235+
var parsed = JObject.Parse(responseJson);
236+
var invalidIds = parsed["errors"]?["invalid_player_ids"] as JArray;
237+
return invalidIds != null && invalidIds.Count > 0;
238+
}
239+
catch
240+
{
241+
return false;
242+
}
199243
}
200244
}
201245
}

examples/demo/Assets/Scripts/UI/Sections/PushSectionController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ private VisualElement BuildSection()
3535

3636
var pushIdRow = SectionBuilder.CreateInlineKeyValue(
3737
"Push ID",
38-
_viewModel.PushSubscriptionId ?? "\u2013",
38+
_viewModel.PushSubscriptionId ?? "",
3939
"push_id"
4040
);
4141
_pushIdLabel = pushIdRow.Q<Label>("push_id_value");
@@ -71,7 +71,7 @@ private VisualElement BuildSection()
7171

7272
public void Refresh()
7373
{
74-
_pushIdLabel.text = _viewModel.PushSubscriptionId ?? "\u2013";
74+
_pushIdLabel.text = _viewModel.PushSubscriptionId ?? "";
7575
_enabledToggle.SetValueWithoutNotify(_viewModel.PushOptedIn);
7676
_enabledToggle.SetEnabled(_viewModel.HasPermission);
7777
_promptButton.style.display = _viewModel.HasPermission

examples/demo/Assets/Scripts/UI/Sections/UserSectionController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ private VisualElement BuildSection()
4343

4444
var extIdRow = SectionBuilder.CreateInlineKeyValue(
4545
"External ID",
46-
_viewModel.IsLoggedIn ? _viewModel.ExternalUserId : "\u2013",
46+
_viewModel.IsLoggedIn ? _viewModel.ExternalUserId : "\u2014",
4747
"user_external_id"
4848
);
4949
_externalIdValue = extIdRow.Q<Label>("user_external_id_value");
@@ -75,7 +75,7 @@ public void Refresh()
7575
_statusValue.text = _viewModel.IsLoggedIn ? "Logged In" : "Anonymous";
7676
_statusValue.EnableInClassList("status-value-green", _viewModel.IsLoggedIn);
7777

78-
_externalIdValue.text = _viewModel.IsLoggedIn ? _viewModel.ExternalUserId : "\u2013";
78+
_externalIdValue.text = _viewModel.IsLoggedIn ? _viewModel.ExternalUserId : "\u2014";
7979

8080
_loginButton.text = _viewModel.IsLoggedIn ? "SWITCH USER" : "LOGIN USER";
8181
_logoutButton.style.display = _viewModel.IsLoggedIn

examples/demo/Assets/Scripts/ViewModels/AppViewModel.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public void Init(PreferencesService prefs, OneSignalApiService apiService)
9898
}
9999

100100
private static string MaskValue(string value) =>
101-
string.IsNullOrEmpty(value) ? value : new string('\u2022', value.Length);
101+
IsE2EMode && value != "—" ? new string('\u2022', value.Length) : value;
102102

103103
private void OnDestroy()
104104
{
@@ -113,15 +113,15 @@ private void OnDestroy()
113113
public void LoadInitialState()
114114
{
115115
var rawAppId = _apiService?.GetAppId() ?? "";
116-
_appId = IsE2EMode ? MaskValue(rawAppId) : rawAppId;
116+
_appId = MaskValue(rawAppId);
117117
_consentRequired = _prefs.ConsentRequired;
118118
_privacyConsentGiven = _prefs.PrivacyConsent;
119119
_inAppMessagesPaused = _prefs.IamPaused;
120120
_locationShared = _prefs.LocationShared;
121121
_externalUserId = _prefs.ExternalUserId;
122122

123123
var rawPushId = OneSignal.User.PushSubscription.Id ?? "";
124-
_pushSubscriptionId = IsE2EMode ? MaskValue(rawPushId) : rawPushId;
124+
_pushSubscriptionId = MaskValue(rawPushId);
125125
_pushOptedIn = OneSignal.User.PushSubscription.OptedIn;
126126
_hasPermission = OneSignal.Notifications.Permission;
127127

@@ -583,7 +583,7 @@ public async Task FetchUserDataFromApi()
583583
}
584584

585585
var rawPushId = OneSignal.User.PushSubscription.Id ?? "";
586-
_pushSubscriptionId = IsE2EMode ? MaskValue(rawPushId) : rawPushId;
586+
_pushSubscriptionId = MaskValue(rawPushId);
587587
_pushOptedIn = OneSignal.User.PushSubscription.OptedIn;
588588
_hasPermission = OneSignal.Notifications.Permission;
589589

@@ -652,7 +652,7 @@ private static void MergeUnique(List<string> target, IEnumerable<string> source)
652652
private void OnPushSubscriptionChanged(object sender, PushSubscriptionChangedEventArgs e)
653653
{
654654
var rawPushId = OneSignal.User.PushSubscription.Id ?? "";
655-
_pushSubscriptionId = IsE2EMode ? MaskValue(rawPushId) : rawPushId;
655+
_pushSubscriptionId = MaskValue(rawPushId);
656656
_pushOptedIn = OneSignal.User.PushSubscription.OptedIn;
657657
Debug.Log($"[{Tag}] Push subscription changed: {rawPushId}");
658658
NotifyStateChanged();

0 commit comments

Comments
 (0)