Skip to content

Commit 5d1e43c

Browse files
authored
Merge pull request #284 from OneSignal/feature/add_external_user_id_callback
Feature/add external user id callback
2 parents 9264480 + b49f59a commit 5d1e43c

File tree

10 files changed

+165
-40
lines changed

10 files changed

+165
-40
lines changed

OneSignalExample/Assets/OneSignal/Example/GameControllerExample.cs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,35 @@ void Start() {
7171
OneSignalOutcomeEventsExamples();
7272
}
7373

74+
75+
// Examples of using OneSignal External User Id
76+
private void OneSignalExternalUserIdCallback(Dictionary<string, object> results)
77+
{
78+
// The results will contain push and email success statuses
79+
Console.WriteLine("External user id updated with results: " + Json.Serialize(results));
80+
81+
// Push can be expected in almost every situation with a success status, but
82+
// as a pre-caution its good to verify it exists
83+
if (results.ContainsKey("push"))
84+
{
85+
Dictionary<string, object> pushStatusDict = results["push"] as Dictionary<string, object>;
86+
if (pushStatusDict.ContainsKey("success"))
87+
{
88+
Console.WriteLine("External user id updated for push with results: " + pushStatusDict["success"] as string);
89+
}
90+
}
91+
92+
// Verify the email is set or check that the results have an email success status
93+
if (results.ContainsKey("email"))
94+
{
95+
Dictionary<string, object> emailStatusDict = results["email"] as Dictionary<string, object>;
96+
if (emailStatusDict.ContainsKey("success"))
97+
{
98+
Console.WriteLine("External user id updated for email with results: " + emailStatusDict["success"] as string);
99+
}
100+
}
101+
}
102+
74103
// Examples of using OneSignal In-App Message triggers
75104
private void OneSignalInAppMessageTriggerExamples() {
76105
// Add a single trigger
@@ -301,17 +330,13 @@ void OnGUI() {
301330
count++;
302331

303332
if (GUI.Button(new Rect(itemOriginX, itemStartY + (count * itemHeightOffset), itemWidth, itemHeight), "SetExternalId", customTextSize)) {
304-
extraMessage = "Setting External User Id";
305-
306-
OneSignal.SetExternalUserId(externalId);
333+
OneSignal.SetExternalUserId(externalId, OneSignalExternalUserIdCallback);
307334
}
308335

309336
count++;
310337

311338
if (GUI.Button(new Rect(itemOriginX, itemStartY + (count * itemHeightOffset), itemWidth, itemHeight), "RemoveExternalId", customTextSize)) {
312-
extraMessage = "Removing External User Id";
313-
314-
OneSignal.RemoveExternalUserId();
339+
OneSignal.RemoveExternalUserId(OneSignalExternalUserIdCallback);
315340
}
316341

317342
if (requiresUserPrivacyConsent) {
Binary file not shown.

OneSignalExample/Assets/OneSignal/Platforms/iOS/OneSignal.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,13 @@ typedef void (^OSEmailSuccessBlock)();
507507

508508

509509
// External user id
510+
// Typedefs defining completion blocks for updating the external user id
511+
typedef void (^OSUpdateExternalUserIdBlock)(NSDictionary* results);
512+
510513
+ (void)setExternalUserId:(NSString * _Nonnull)externalId;
514+
+ (void)setExternalUserId:(NSString * _Nonnull)externalId withCompletion:(OSUpdateExternalUserIdBlock _Nullable)completionBlock;
511515
+ (void)removeExternalUserId;
516+
+ (void)removeExternalUserId:(OSUpdateExternalUserIdBlock _Nullable)completionBlock;
512517

513518
// In-App Messaging triggers
514519
+ (void)addTrigger:(NSString * _Nonnull)key withValue:(id _Nonnull)value;

OneSignalExample/Assets/OneSignal/Platforms/iOS/OneSignalUnityRuntime.m

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -432,12 +432,22 @@ void _setLocationShared(bool shared) {
432432
[OneSignal setLocationShared:shared];
433433
}
434434

435-
void _setExternalUserId(const char *externalId) {
436-
[OneSignal setExternalUserId:CreateNSString(externalId)];
435+
void _setExternalUserId(const char* delegate, const char *externalId) {
436+
NSString* delegateId = CreateNSString(delegate);
437+
[OneSignal setExternalUserId:CreateNSString(externalId) withCompletion:^(NSDictionary *results) {
438+
NSString* response = dictionaryToNSString(results);
439+
NSDictionary* data = @{ @"delegate_id" : delegateId, @"response" : response };
440+
UnitySendMessage(unityListener, "onExternalUserIdUpdateCompletion", dictionaryToJsonChar(data));
441+
}];
437442
}
438443

439-
void _removeExternalUserId() {
440-
[OneSignal removeExternalUserId];
444+
void _removeExternalUserId(const char* delegate) {
445+
NSString* delegateId = CreateNSString(delegate);
446+
[OneSignal removeExternalUserId:^(NSDictionary *results) {
447+
NSString* response = dictionaryToNSString(results);
448+
NSDictionary* data = @{ @"delegate_id" : delegateId, @"response" : response };
449+
UnitySendMessage(unityListener, "onExternalUserIdUpdateCompletion", dictionaryToJsonChar(data));
450+
}];
441451
}
442452

443453
void _addTriggers(char *triggers) {
Binary file not shown.

OneSignalExample/Assets/OneSignal/src/OneSignal.cs

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ public class OneSignal : MonoBehaviour {
226226
// notification = The Notification dictionary filled from a serialized native OSNotification object
227227
public delegate void NotificationReceived(OSNotification notification);
228228

229+
// OnExternalUserIdUpdateCompletion - Delegate is called when exteranl user id for push or email channel is set or removed
230+
// results - The dictionary payload containing the success status for the channels updating exteranl user id
231+
public delegate void OnExternalUserIdUpdateCompletion(Dictionary<string, object> results);
232+
229233
public delegate void OnSetEmailSuccess();
230234
public delegate void OnSetEmailFailure(Dictionary<string, object> error);
231235

@@ -730,13 +734,31 @@ public static void SetRequiresUserPrivacyConsent(bool required) {
730734

731735
public static void SetExternalUserId(string externalId) {
732736
#if ONESIGNAL_PLATFORM
733-
oneSignalPlatform.SetExternalUserId(externalId);
737+
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
738+
oneSignalPlatform.SetExternalUserId(delegateGuidCompletion, externalId);
739+
#endif
740+
}
741+
742+
public static void SetExternalUserId(string externalId, OnExternalUserIdUpdateCompletion completion) {
743+
#if ONESIGNAL_PLATFORM
744+
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
745+
delegates.Add(delegateGuidCompletion, completion);
746+
oneSignalPlatform.SetExternalUserId(delegateGuidCompletion, externalId);
734747
#endif
735748
}
736749

737750
public static void RemoveExternalUserId() {
738751
#if ONESIGNAL_PLATFORM
739-
oneSignalPlatform.RemoveExternalUserId();
752+
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
753+
oneSignalPlatform.RemoveExternalUserId(delegateGuidCompletion);
754+
#endif
755+
}
756+
757+
public static void RemoveExternalUserId(OnExternalUserIdUpdateCompletion completion) {
758+
#if ONESIGNAL_PLATFORM
759+
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
760+
delegates.Add(delegateGuidCompletion, completion);
761+
oneSignalPlatform.RemoveExternalUserId(delegateGuidCompletion);
740762
#endif
741763
}
742764

@@ -1008,6 +1030,30 @@ private void onPostNotificationFailed(string jsonString) {
10081030
}
10091031
}
10101032

1033+
// Called from the native SDK
1034+
private void onExternalUserIdUpdateCompletion(string jsonString) {
1035+
if (string.IsNullOrEmpty(jsonString))
1036+
return;
1037+
1038+
// Break part the jsonString which might contain a 'delegate_id' and a 'response'
1039+
var jsonObject = Json.Deserialize(jsonString) as Dictionary<string, object>;
1040+
1041+
// Check if the delegate should be processed
1042+
if (!isValidDelegate(jsonObject))
1043+
return;
1044+
1045+
var delegateId = jsonObject["delegate_id"] as string;
1046+
1047+
var response = jsonObject["response"] as string;
1048+
var results = Json.Deserialize(response) as Dictionary<string, object>;
1049+
1050+
if (delegates.ContainsKey(delegateId)) {
1051+
var externalUserIdUpdateCompletionDelegate = (OnExternalUserIdUpdateCompletion) delegates[delegateId];
1052+
delegates.Remove(delegateId);
1053+
externalUserIdUpdateCompletionDelegate(results);
1054+
}
1055+
}
1056+
10111057
// Called from the native SDK
10121058
private void onSetEmailSuccess(string jsonString) {
10131059
if (string.IsNullOrEmpty(jsonString))

OneSignalExample/Assets/OneSignal/src/OneSignalAndroid.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,12 @@ public void SetRequiresUserPrivacyConsent(bool required) {
142142
mOneSignal.Call("setRequiresUserPrivacyConsent", required);
143143
}
144144

145-
public void SetExternalUserId(string externalId) {
146-
mOneSignal.Call("setExternalUserId", externalId);
145+
public void SetExternalUserId(string delegateId, string externalId) {
146+
mOneSignal.Call("setExternalUserId", delegateId, externalId);
147147
}
148148

149-
public void RemoveExternalUserId() {
150-
mOneSignal.Call("removeExternalUserId");
149+
public void RemoveExternalUserId(string delegateId) {
150+
mOneSignal.Call("removeExternalUserId", delegateId);
151151
}
152152

153153
public OSPermissionSubscriptionState GetPermissionSubscriptionState() {

OneSignalExample/Assets/OneSignal/src/OneSignalIOS.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ public class OneSignalIOS : OneSignalPlatform {
122122
extern static public void _setLocationShared(bool enable);
123123

124124
[System.Runtime.InteropServices.DllImport("__Internal")]
125-
extern static public void _setExternalUserId(string externalId);
125+
extern static public void _setExternalUserId(string delegateId, string externalId);
126126

127127
[System.Runtime.InteropServices.DllImport("__Internal")]
128-
extern static public void _removeExternalUserId();
128+
extern static public void _removeExternalUserId(string delegateId);
129129

130130
[System.Runtime.InteropServices.DllImport("__Internal")]
131131
extern static public void _addTriggers(string triggers);
@@ -263,12 +263,12 @@ public void SetRequiresUserPrivacyConsent(bool required) {
263263
_setRequiresUserPrivacyConsent(required);
264264
}
265265

266-
public void SetExternalUserId(string externalId) {
267-
_setExternalUserId(externalId);
266+
public void SetExternalUserId(string delegateId, string externalId) {
267+
_setExternalUserId(delegateId, externalId);
268268
}
269269

270-
public void RemoveExternalUserId() {
271-
_removeExternalUserId();
270+
public void RemoveExternalUserId(string delegateId) {
271+
_removeExternalUserId(delegateId);
272272
}
273273

274274
public void AddTrigger(string key, object value) {

OneSignalExample/Assets/OneSignal/src/OneSignalPlatform.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public interface OneSignalPlatform {
5959
bool UserProvidedConsent();
6060
void SetRequiresUserPrivacyConsent(bool required);
6161

62-
void SetExternalUserId(string externalId);
63-
void RemoveExternalUserId();
62+
void SetExternalUserId(string delegateId, string externalId);
63+
void RemoveExternalUserId(string delegateId);
6464

6565
void AddPermissionObserver();
6666
void RemovePermissionObserver();

OneSignalExample/Assets/Plugins/Android/OneSignalConfig.meta

Lines changed: 55 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)