Skip to content

Commit 5ad412f

Browse files
committed
Fire user observer on logout (JWT on)
* Usually, on logout, the user observer will fire once the anonymous user is created to the backend and returns with an OSID. However, when Identity Verification is on, that will not happen, so fire the observer early with `nil` values to represent there is no user in the SDK currently. * Firing the observer will save the state and necessary to know when the user logs back in. This is used by the messaging controller to fetch IAM appropriately. On a new session, it will not fetch IAM if logged out, but as the user observer, it will fetch once a user logs in.
1 parent 0dc2cee commit 5ad412f

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Modeling/OSIdentityModel.swift

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,26 +134,6 @@ class OSIdentityModel: OSModel {
134134
let newExternalId = remoteAliases[OS_EXTERNAL_ID]
135135

136136
internalAddAliases(remoteAliases)
137-
fireUserStateChanged(newOnesignalId: newOnesignalId, newExternalId: newExternalId)
138-
}
139-
140-
/**
141-
Fires the user observer if `onesignal_id` OR `external_id` has changed from the previous snapshot (previous hydration).
142-
*/
143-
private func fireUserStateChanged(newOnesignalId: String?, newExternalId: String?) {
144-
let prevOnesignalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, defaultValue: nil)
145-
let prevExternalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_EXTERNAL_ID, defaultValue: nil)
146-
147-
guard prevOnesignalId != newOnesignalId || prevExternalId != newExternalId else {
148-
return
149-
}
150-
151-
OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, withValue: newOnesignalId)
152-
OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_EXTERNAL_ID, withValue: newExternalId)
153-
154-
let curUserState = OSUserState(onesignalId: newOnesignalId, externalId: newExternalId)
155-
let changedState = OSUserChangedState(current: curUserState)
156-
157-
OneSignalUserManagerImpl.sharedInstance.userStateChangesObserver.notifyChange(changedState)
137+
OSUserUtils.fireUserStateChanged(newOnesignalId: newOnesignalId, newExternalId: newExternalId)
158138
}
159139
}

iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,9 +447,13 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager {
447447

448448
/*
449449
If Identity Verification is on, disable the push subscription.
450+
Since the anonymous placeholder user will not be created to the backend,
451+
fire the user observer here to represent "no user" in the SDK.
452+
This is necessary so internal user observers can know when a user logs out and then back in.
450453
*/
451454
if jwtConfig.isRequired == true {
452455
user.pushSubscriptionModel._isDisabledInternally = true
456+
OSUserUtils.fireUserStateChanged(newOnesignalId: nil, newExternalId: nil)
453457
}
454458
}
455459

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Support/OSUserUtils.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,24 @@ class OSUserUtils {
7171
}
7272
return headers
7373
}
74+
75+
/**
76+
Fires the user observer if `onesignal_id` OR `external_id` has changed from the previous snapshot (previous hydration).
77+
*/
78+
static func fireUserStateChanged(newOnesignalId: String?, newExternalId: String?) {
79+
let prevOnesignalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, defaultValue: nil)
80+
let prevExternalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_EXTERNAL_ID, defaultValue: nil)
81+
82+
guard prevOnesignalId != newOnesignalId || prevExternalId != newExternalId else {
83+
return
84+
}
85+
86+
OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, withValue: newOnesignalId)
87+
OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_EXTERNAL_ID, withValue: newExternalId)
88+
89+
let curUserState = OSUserState(onesignalId: newOnesignalId, externalId: newExternalId)
90+
let changedState = OSUserChangedState(current: curUserState)
91+
92+
OneSignalUserManagerImpl.sharedInstance.userStateChangesObserver.notifyChange(changedState)
93+
}
7494
}

0 commit comments

Comments
 (0)