@@ -49,10 +49,13 @@ final class OneSignalService {
4949 // MARK: - Initialization
5050
5151 /// Mirrors the Capacitor demo's `useOneSignal` init order: feed cached
52- /// consent into the SDK BEFORE `initialize`, then restore IAM-paused,
53- /// location-shared, and a previously-logged-in external user id once the
54- /// SDK is ready. Without this, toggles flip back to defaults on every
55- /// cold launch.
52+ /// consent into the SDK BEFORE `initialize`, then restore IAM-paused and
53+ /// location-shared once the SDK is ready. Without this, toggles flip back
54+ /// to defaults on every cold launch.
55+ ///
56+ /// No login here. The SDK restores the user from its own cache, and the stored JWT
57+ /// stays with the demo so the SDK's own ask through `OSUserJwtInvalidatedListener`
58+ /// stays observable on cold start.
5659 func initialize ( launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) {
5760 OneSignal . Debug . setLogLevel ( . LL_VERBOSE )
5861
@@ -63,10 +66,6 @@ final class OneSignalService {
6366
6467 OneSignal . InAppMessages . paused = prefs . getIamPaused ( )
6568 OneSignal . Location . isShared = prefs . getLocationShared ( )
66-
67- if let storedExternalId = prefs . getExternalUserId ( ) {
68- OneSignal . login ( storedExternalId )
69- }
7069 }
7170
7271 // MARK: - Identity
@@ -96,13 +95,32 @@ final class OneSignalService {
9695
9796 // MARK: - User
9897
99- func login ( externalId : String ) {
98+ func login ( externalId : String , jwtToken : String ? = nil ) {
99+ // Demo REST fetch only. Not replayed to the SDK at launch. A same-user login
100+ // without a token keeps the stored one, matching the SDK, which keeps its own.
101+ if jwtToken != nil || externalId != OneSignal . User . externalId {
102+ prefs . setSessionJwtToken ( jwtToken )
103+ }
100104 prefs . setExternalUserId ( externalId )
101- OneSignal . login ( externalId )
105+ if let jwtToken = jwtToken {
106+ OneSignal . login ( externalId : externalId , token : jwtToken )
107+ } else {
108+ OneSignal . login ( externalId )
109+ }
110+ }
111+
112+ func updateUserJwt ( externalId : String , token : String ) {
113+ // The demo's REST bearer belongs to the current user. A token for anyone else
114+ // still goes to the SDK, which owns the parked work for that id.
115+ if externalId == OneSignal . User . externalId {
116+ prefs . setSessionJwtToken ( token )
117+ }
118+ OneSignal . updateUserJwt ( externalId : externalId , token : token )
102119 }
103120
104121 func logout ( ) {
105122 prefs . setExternalUserId ( nil )
123+ prefs . setSessionJwtToken ( nil )
106124 OneSignal . logout ( )
107125 }
108126
@@ -111,6 +129,22 @@ final class OneSignalService {
111129 OneSignal . User . setLanguage ( language )
112130 }
113131
132+ /// Called when the SDK rejects the token, so the REST fetch stops sending it.
133+ func clearSessionJwtToken ( ) {
134+ prefs . setSessionJwtToken ( nil )
135+ }
136+
137+ // MARK: - Identity Verification (demo REST fetch)
138+
139+ /// Demo toggle for addressing the REST user fetch by `external_id`. Persisted across launches.
140+ var useIdentityVerification : Bool {
141+ get { prefs . getUseIdentityVerification ( ) }
142+ set { prefs . setUseIdentityVerification ( newValue ) }
143+ }
144+
145+ /// Token from the last login / updateUserJwt, for the demo REST fetch only. Cleared when the SDK rejects it.
146+ var sessionJwtToken : String ? { prefs . getSessionJwtToken ( ) }
147+
114148 // MARK: - Aliases
115149
116150 func addAlias ( label : String , id : String ) { OneSignal . User . addAlias ( label : label , id : id ) }
@@ -227,6 +261,14 @@ final class OneSignalService {
227261 OneSignal . Notifications . addPermissionObserver ( observer )
228262 }
229263
264+ func addUserJwtInvalidatedListener ( _ listener : OSUserJwtInvalidatedListener ) {
265+ OneSignal . addUserJwtInvalidatedListener ( listener )
266+ }
267+
268+ func removeUserJwtInvalidatedListener ( _ listener : OSUserJwtInvalidatedListener ) {
269+ OneSignal . removeUserJwtInvalidatedListener ( listener )
270+ }
271+
230272 func addNotificationClickListener ( _ listener : OSNotificationClickListener ) {
231273 OneSignal . Notifications . addClickListener ( listener )
232274 }
0 commit comments