Skip to content

Commit

Permalink
Merge pull request #284 from OneSignal/feature/add_external_user_id_c…
Browse files Browse the repository at this point in the history
…allback

Feature/add external user id callback
  • Loading branch information
mikechoch authored Apr 9, 2020
2 parents 9264480 + b49f59a commit 5d1e43c
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 40 deletions.
37 changes: 31 additions & 6 deletions OneSignalExample/Assets/OneSignal/Example/GameControllerExample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,35 @@ void Start() {
OneSignalOutcomeEventsExamples();
}


// Examples of using OneSignal External User Id
private void OneSignalExternalUserIdCallback(Dictionary<string, object> results)
{
// The results will contain push and email success statuses
Console.WriteLine("External user id updated with results: " + Json.Serialize(results));

// Push can be expected in almost every situation with a success status, but
// as a pre-caution its good to verify it exists
if (results.ContainsKey("push"))
{
Dictionary<string, object> pushStatusDict = results["push"] as Dictionary<string, object>;
if (pushStatusDict.ContainsKey("success"))
{
Console.WriteLine("External user id updated for push with results: " + pushStatusDict["success"] as string);
}
}

// Verify the email is set or check that the results have an email success status
if (results.ContainsKey("email"))
{
Dictionary<string, object> emailStatusDict = results["email"] as Dictionary<string, object>;
if (emailStatusDict.ContainsKey("success"))
{
Console.WriteLine("External user id updated for email with results: " + emailStatusDict["success"] as string);
}
}
}

// Examples of using OneSignal In-App Message triggers
private void OneSignalInAppMessageTriggerExamples() {
// Add a single trigger
Expand Down Expand Up @@ -301,17 +330,13 @@ void OnGUI() {
count++;

if (GUI.Button(new Rect(itemOriginX, itemStartY + (count * itemHeightOffset), itemWidth, itemHeight), "SetExternalId", customTextSize)) {
extraMessage = "Setting External User Id";

OneSignal.SetExternalUserId(externalId);
OneSignal.SetExternalUserId(externalId, OneSignalExternalUserIdCallback);
}

count++;

if (GUI.Button(new Rect(itemOriginX, itemStartY + (count * itemHeightOffset), itemWidth, itemHeight), "RemoveExternalId", customTextSize)) {
extraMessage = "Removing External User Id";

OneSignal.RemoveExternalUserId();
OneSignal.RemoveExternalUserId(OneSignalExternalUserIdCallback);
}

if (requiresUserPrivacyConsent) {
Expand Down
Binary file not shown.
5 changes: 5 additions & 0 deletions OneSignalExample/Assets/OneSignal/Platforms/iOS/OneSignal.h
Original file line number Diff line number Diff line change
Expand Up @@ -507,8 +507,13 @@ typedef void (^OSEmailSuccessBlock)();


// External user id
// Typedefs defining completion blocks for updating the external user id
typedef void (^OSUpdateExternalUserIdBlock)(NSDictionary* results);

+ (void)setExternalUserId:(NSString * _Nonnull)externalId;
+ (void)setExternalUserId:(NSString * _Nonnull)externalId withCompletion:(OSUpdateExternalUserIdBlock _Nullable)completionBlock;
+ (void)removeExternalUserId;
+ (void)removeExternalUserId:(OSUpdateExternalUserIdBlock _Nullable)completionBlock;

// In-App Messaging triggers
+ (void)addTrigger:(NSString * _Nonnull)key withValue:(id _Nonnull)value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,12 +432,22 @@ void _setLocationShared(bool shared) {
[OneSignal setLocationShared:shared];
}

void _setExternalUserId(const char *externalId) {
[OneSignal setExternalUserId:CreateNSString(externalId)];
void _setExternalUserId(const char* delegate, const char *externalId) {
NSString* delegateId = CreateNSString(delegate);
[OneSignal setExternalUserId:CreateNSString(externalId) withCompletion:^(NSDictionary *results) {
NSString* response = dictionaryToNSString(results);
NSDictionary* data = @{ @"delegate_id" : delegateId, @"response" : response };
UnitySendMessage(unityListener, "onExternalUserIdUpdateCompletion", dictionaryToJsonChar(data));
}];
}

void _removeExternalUserId() {
[OneSignal removeExternalUserId];
void _removeExternalUserId(const char* delegate) {
NSString* delegateId = CreateNSString(delegate);
[OneSignal removeExternalUserId:^(NSDictionary *results) {
NSString* response = dictionaryToNSString(results);
NSDictionary* data = @{ @"delegate_id" : delegateId, @"response" : response };
UnitySendMessage(unityListener, "onExternalUserIdUpdateCompletion", dictionaryToJsonChar(data));
}];
}

void _addTriggers(char *triggers) {
Expand Down
Binary file modified OneSignalExample/Assets/OneSignal/Platforms/iOS/libOneSignal.a
Binary file not shown.
50 changes: 48 additions & 2 deletions OneSignalExample/Assets/OneSignal/src/OneSignal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,10 @@ public class OneSignal : MonoBehaviour {
// notification = The Notification dictionary filled from a serialized native OSNotification object
public delegate void NotificationReceived(OSNotification notification);

// OnExternalUserIdUpdateCompletion - Delegate is called when exteranl user id for push or email channel is set or removed
// results - The dictionary payload containing the success status for the channels updating exteranl user id
public delegate void OnExternalUserIdUpdateCompletion(Dictionary<string, object> results);

public delegate void OnSetEmailSuccess();
public delegate void OnSetEmailFailure(Dictionary<string, object> error);

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

public static void SetExternalUserId(string externalId) {
#if ONESIGNAL_PLATFORM
oneSignalPlatform.SetExternalUserId(externalId);
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
oneSignalPlatform.SetExternalUserId(delegateGuidCompletion, externalId);
#endif
}

public static void SetExternalUserId(string externalId, OnExternalUserIdUpdateCompletion completion) {
#if ONESIGNAL_PLATFORM
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
delegates.Add(delegateGuidCompletion, completion);
oneSignalPlatform.SetExternalUserId(delegateGuidCompletion, externalId);
#endif
}

public static void RemoveExternalUserId() {
#if ONESIGNAL_PLATFORM
oneSignalPlatform.RemoveExternalUserId();
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
oneSignalPlatform.RemoveExternalUserId(delegateGuidCompletion);
#endif
}

public static void RemoveExternalUserId(OnExternalUserIdUpdateCompletion completion) {
#if ONESIGNAL_PLATFORM
string delegateGuidCompletion = OneSignalUnityUtils.GetNewGuid();
delegates.Add(delegateGuidCompletion, completion);
oneSignalPlatform.RemoveExternalUserId(delegateGuidCompletion);
#endif
}

Expand Down Expand Up @@ -1008,6 +1030,30 @@ private void onPostNotificationFailed(string jsonString) {
}
}

// Called from the native SDK
private void onExternalUserIdUpdateCompletion(string jsonString) {
if (string.IsNullOrEmpty(jsonString))
return;

// Break part the jsonString which might contain a 'delegate_id' and a 'response'
var jsonObject = Json.Deserialize(jsonString) as Dictionary<string, object>;

// Check if the delegate should be processed
if (!isValidDelegate(jsonObject))
return;

var delegateId = jsonObject["delegate_id"] as string;

var response = jsonObject["response"] as string;
var results = Json.Deserialize(response) as Dictionary<string, object>;

if (delegates.ContainsKey(delegateId)) {
var externalUserIdUpdateCompletionDelegate = (OnExternalUserIdUpdateCompletion) delegates[delegateId];
delegates.Remove(delegateId);
externalUserIdUpdateCompletionDelegate(results);
}
}

// Called from the native SDK
private void onSetEmailSuccess(string jsonString) {
if (string.IsNullOrEmpty(jsonString))
Expand Down
8 changes: 4 additions & 4 deletions OneSignalExample/Assets/OneSignal/src/OneSignalAndroid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,12 @@ public void SetRequiresUserPrivacyConsent(bool required) {
mOneSignal.Call("setRequiresUserPrivacyConsent", required);
}

public void SetExternalUserId(string externalId) {
mOneSignal.Call("setExternalUserId", externalId);
public void SetExternalUserId(string delegateId, string externalId) {
mOneSignal.Call("setExternalUserId", delegateId, externalId);
}

public void RemoveExternalUserId() {
mOneSignal.Call("removeExternalUserId");
public void RemoveExternalUserId(string delegateId) {
mOneSignal.Call("removeExternalUserId", delegateId);
}

public OSPermissionSubscriptionState GetPermissionSubscriptionState() {
Expand Down
12 changes: 6 additions & 6 deletions OneSignalExample/Assets/OneSignal/src/OneSignalIOS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,10 @@ public class OneSignalIOS : OneSignalPlatform {
extern static public void _setLocationShared(bool enable);

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

[System.Runtime.InteropServices.DllImport("__Internal")]
extern static public void _removeExternalUserId();
extern static public void _removeExternalUserId(string delegateId);

[System.Runtime.InteropServices.DllImport("__Internal")]
extern static public void _addTriggers(string triggers);
Expand Down Expand Up @@ -263,12 +263,12 @@ public void SetRequiresUserPrivacyConsent(bool required) {
_setRequiresUserPrivacyConsent(required);
}

public void SetExternalUserId(string externalId) {
_setExternalUserId(externalId);
public void SetExternalUserId(string delegateId, string externalId) {
_setExternalUserId(delegateId, externalId);
}

public void RemoveExternalUserId() {
_removeExternalUserId();
public void RemoveExternalUserId(string delegateId) {
_removeExternalUserId(delegateId);
}

public void AddTrigger(string key, object value) {
Expand Down
4 changes: 2 additions & 2 deletions OneSignalExample/Assets/OneSignal/src/OneSignalPlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ public interface OneSignalPlatform {
bool UserProvidedConsent();
void SetRequiresUserPrivacyConsent(bool required);

void SetExternalUserId(string externalId);
void RemoveExternalUserId();
void SetExternalUserId(string delegateId, string externalId);
void RemoveExternalUserId(string delegateId);

void AddPermissionObserver();
void RemovePermissionObserver();
Expand Down
71 changes: 55 additions & 16 deletions OneSignalExample/Assets/Plugins/Android/OneSignalConfig.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 5d1e43c

Please sign in to comment.