From 9cd72572132151a41928cdbc0ba3a12d7f279668 Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:29:10 -0800 Subject: [PATCH 1/8] Add JWT and event listener to wrapper - Token added as parameter to login - updateUserJwt - UserJwtInvalidatedEvent - Add & Remove Listener methods --- www/index.ts | 58 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/www/index.ts b/www/index.ts index 04a9f2c1..3ff85544 100644 --- a/www/index.ts +++ b/www/index.ts @@ -36,6 +36,10 @@ import LiveActivities from "./LiveActivitiesNamespace"; // Suppress TS warnings about window.cordova declare let window: any; // turn off type checking +export interface UserJwtInvalidatedEvent { + externalId ?: string; +} + export class OneSignalPlugin { User: User = new User(); Debug: Debug = new Debug(); @@ -47,6 +51,14 @@ export class OneSignalPlugin { private _appID = ""; + private _userJwtInvalidatedEventListenerList: ((event:UserJwtInvalidatedEvent)=>void)[] = []; + + private _processFunctionList(array: ((event:any)=>void)[], param: any): void { + for (let i = 0; i < array.length; i++) { + array[i](param); + } + } + /** * Initializes the OneSignal SDK. This should be called during startup of the application. * @param {string} appId @@ -64,23 +76,57 @@ export class OneSignalPlugin { }; /** - * Login to OneSignal under the user identified by the [externalId] provided. The act of logging a user into the OneSignal SDK will switch the [user] context to that specific user. - * @param {string} externalId + * Log in to OneSignal under the user identified by the [externalId] provided. The act of logging a user into the OneSignal SDK will switch the [user] context to that specific user. + * @param {string} externalId + * @param {string} jwtToken * @returns void */ - login(externalId: string): void { - window.cordova.exec(function () { }, function () { }, "OneSignalPush", "login", [externalId]); + login(externalId: string, jwtToken: string): void { + window.cordova.exec(function () { }, function () { }, "OneSignalPush", "login", [externalId, jwtToken]); } /** - * Logout the user previously logged in via [login]. The [user] property now references a new device-scoped user. - * @param {string} externalId + * Log out the user previously logged in via [login]. The [user] property now references a new device-scoped user. * @returns void */ logout(): void { window.cordova.exec(function () { }, function () { }, "OneSignalPush", "logout"); } + /** + * Update the JWT token for a user. + * @param {string} externalId + * @param {string} jwtToken + */ + updateUserJwt(externalId: string, jwtToken: string): void { + window.cordova.exec(function () { }, function () { }, "OneSignalPush", "updateUserJwt", [externalId, jwtToken]); + } + + /** + * Add a callback that fires when the user's JWT is invalidated. + * @param event + * @param listener + */ + addEventListener(event: "userJwtInvalidated", listener: (event: UserJwtInvalidatedEvent) => void) { + this._userJwtInvalidatedEventListenerList.push(listener as (event: UserJwtInvalidatedEvent) => void); + const userJwtInvalidatedCallBackProcessor = (event: UserJwtInvalidatedEvent) => { + this._processFunctionList(this._userJwtInvalidatedEventListenerList, event); + }; + window.cordova.exec(userJwtInvalidatedCallBackProcessor, function(){}, "OneSignalPush", "addUserJwtInvalidatedListener", []); + } + + /** + * Remove a UserJwtInvalidated Listener that has been previously added. + * @param event + * @param listener + */ + removeEventListener(event: "userJwtInvalidated", listener: (event: UserJwtInvalidatedEvent) => void) { + let index = this._userJwtInvalidatedEventListenerList.indexOf(listener); + if (index !== -1) { + this._userJwtInvalidatedEventListenerList.splice(index, 1); + } + } + /** * Determines whether a user must consent to privacy prior to their user data being sent up to OneSignal. This should be set to true prior to the invocation of initialization to ensure compliance. * @param {boolean} required From 266bf60c34d48d4fd1bb612d055d1e616bed0058 Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:34:45 -0800 Subject: [PATCH 2/8] Add iOS implementation - new methods updateUserJwt and addUserJwtInvalidatedListener added to the bridge --- src/ios/OneSignalPush.h | 2 ++ src/ios/OneSignalPush.m | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ios/OneSignalPush.h b/src/ios/OneSignalPush.h index a2d0321b..93e3ae60 100644 --- a/src/ios/OneSignalPush.h +++ b/src/ios/OneSignalPush.h @@ -48,6 +48,8 @@ - (void)login:(CDVInvokedUrlCommand* _Nonnull)command; - (void)logout:(CDVInvokedUrlCommand* _Nonnull)command; +- (void)updateUserJwt:(CDVInvokedUrlCommand* _Nonnull)command; +- (void)addUserJwtInvalidatedListener:(CDVInvokedUrlCommand* _Nonnull)command; - (void)addTags:(CDVInvokedUrlCommand* _Nonnull)command; - (void)removeTags:(CDVInvokedUrlCommand* _Nonnull)command; diff --git a/src/ios/OneSignalPush.m b/src/ios/OneSignalPush.m index 6476d48f..87f2c649 100644 --- a/src/ios/OneSignalPush.m +++ b/src/ios/OneSignalPush.m @@ -47,6 +47,7 @@ NSString* inAppMessageDidDismissCallbackId; NSString* inAppMessageClickedCallbackId; NSString* userObserverCallbackId; +NSString* addUserJwtInvalidatedListenerCallbackId; OSNotificationClickEvent *actionNotification; OSNotification *notification; @@ -367,13 +368,25 @@ - (void)setAlertLevel:(CDVInvokedUrlCommand*)command { } - (void)login:(CDVInvokedUrlCommand*)command { - [OneSignal login:command.arguments[0]]; + [OneSignal login:command.arguments[0] withToken:command.arguments[1]]; } - (void)logout:(CDVInvokedUrlCommand*)command { [OneSignal logout]; } +- (void)updateUserJwt:(CDVInvokedUrlCommand*)command { + [OneSignal updateUserJwt:command.arguments[0] withToken:command.arguments[1]]; +} + +- (void)addUserJwtInvalidatedListener:(CDVInvokedUrlCommand*)command { + bool first = addUserJwtInvalidatedListenerCallbackId == nil; + addUserJwtInvalidatedListenerCallbackId = command.callbackId; + if (first) { + [OneSignal addUserJwtInvalidatedListener:self]; + } +} + - (void)addTags:(CDVInvokedUrlCommand*)command { [OneSignal.User addTags:command.arguments[0]]; } From 4c04a092bd48d5fd58b70ce943132ca8362c3176 Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:40:09 -0800 Subject: [PATCH 3/8] Update example project to test identity verification - iOS v. 5.3.0-beta-01 --- .../IonicCapOneSignal/ios/App/Podfile.lock | 32 +++++++++---------- plugin.xml | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/example/IonicCapOneSignal/ios/App/Podfile.lock b/example/IonicCapOneSignal/ios/App/Podfile.lock index f88ad3ac..cbbf6afe 100644 --- a/example/IonicCapOneSignal/ios/App/Podfile.lock +++ b/example/IonicCapOneSignal/ios/App/Podfile.lock @@ -12,10 +12,10 @@ PODS: - Capacitor - CordovaPluginsStatic (6.0.0): - CapacitorCordova - - OneSignalXCFramework (= 5.2.7) - - OneSignalXCFramework (5.2.7): - - OneSignalXCFramework/OneSignalComplete (= 5.2.7) - - OneSignalXCFramework/OneSignal (5.2.7): + - OneSignalXCFramework (= 5.3.0-beta-01) + - OneSignalXCFramework (5.3.0-beta-01): + - OneSignalXCFramework/OneSignalComplete (= 5.3.0-beta-01) + - OneSignalXCFramework/OneSignal (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalExtension - OneSignalXCFramework/OneSignalLiveActivities @@ -23,38 +23,38 @@ PODS: - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalOutcomes - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalComplete (5.2.7): + - OneSignalXCFramework/OneSignalComplete (5.3.0-beta-01): - OneSignalXCFramework/OneSignal - OneSignalXCFramework/OneSignalInAppMessages - OneSignalXCFramework/OneSignalLocation - - OneSignalXCFramework/OneSignalCore (5.2.7) - - OneSignalXCFramework/OneSignalExtension (5.2.7): + - OneSignalXCFramework/OneSignalCore (5.3.0-beta-01) + - OneSignalXCFramework/OneSignalExtension (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalOutcomes - - OneSignalXCFramework/OneSignalInAppMessages (5.2.7): + - OneSignalXCFramework/OneSignalInAppMessages (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalNotifications - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalOutcomes - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalLiveActivities (5.2.7): + - OneSignalXCFramework/OneSignalLiveActivities (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalLocation (5.2.7): + - OneSignalXCFramework/OneSignalLocation (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalNotifications - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalNotifications (5.2.7): + - OneSignalXCFramework/OneSignalNotifications (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalExtension - OneSignalXCFramework/OneSignalOutcomes - - OneSignalXCFramework/OneSignalOSCore (5.2.7): + - OneSignalXCFramework/OneSignalOSCore (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - - OneSignalXCFramework/OneSignalOutcomes (5.2.7): + - OneSignalXCFramework/OneSignalOutcomes (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - - OneSignalXCFramework/OneSignalUser (5.2.7): + - OneSignalXCFramework/OneSignalUser (5.3.0-beta-01): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalNotifications - OneSignalXCFramework/OneSignalOSCore @@ -97,8 +97,8 @@ SPEC CHECKSUMS: CapacitorHaptics: 9ebc9363f0e9b8eb4295088a0b474530acf1859b CapacitorKeyboard: deacbd09d8d1029c3681197fb05d206b721d5f73 CapacitorStatusBar: 2e4369f99166125435641b1908d05f561eaba6f6 - CordovaPluginsStatic: 44e859961f0bc894ddef3e9ae371a041443e11ec - OneSignalXCFramework: c56f9470a6fb23048baf55e02740a09cfd32863c + CordovaPluginsStatic: ec3f38153034076a0419390445f43486bdca03ce + OneSignalXCFramework: b859cf761f5437ff56a2a9fd158e67d74cd3bcfc PODFILE CHECKSUM: 178e2a2e451311a871c2b4db713ac4b63d0ebeeb diff --git a/plugin.xml b/plugin.xml index 7b507084..301fab26 100644 --- a/plugin.xml +++ b/plugin.xml @@ -85,7 +85,7 @@ - + From 4a6ac89ca9fbd3ead9dbccc9727c3123b89152fc Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Wed, 20 Nov 2024 16:27:17 -0800 Subject: [PATCH 4/8] Make jwt token optional --- src/ios/OneSignalPush.m | 5 ++++- www/index.ts | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ios/OneSignalPush.m b/src/ios/OneSignalPush.m index 87f2c649..4484b3d5 100644 --- a/src/ios/OneSignalPush.m +++ b/src/ios/OneSignalPush.m @@ -368,7 +368,10 @@ - (void)setAlertLevel:(CDVInvokedUrlCommand*)command { } - (void)login:(CDVInvokedUrlCommand*)command { - [OneSignal login:command.arguments[0] withToken:command.arguments[1]]; + NSString *externalId = command.arguments[0]; + NSString *jwtToken = command.arguments.count > 1 ? command.arguments[1] : nil; + + [OneSignal login:externalId withToken:jwtToken]; } - (void)logout:(CDVInvokedUrlCommand*)command { diff --git a/www/index.ts b/www/index.ts index 3ff85544..ba49f17b 100644 --- a/www/index.ts +++ b/www/index.ts @@ -78,11 +78,12 @@ export class OneSignalPlugin { /** * Log in to OneSignal under the user identified by the [externalId] provided. The act of logging a user into the OneSignal SDK will switch the [user] context to that specific user. * @param {string} externalId - * @param {string} jwtToken + * @param {string} jwtToken - Optional * @returns void */ - login(externalId: string, jwtToken: string): void { - window.cordova.exec(function () { }, function () { }, "OneSignalPush", "login", [externalId, jwtToken]); + login(externalId: string, jwtToken?: string): void { + const args = jwtToken ? [externalId, jwtToken] : [externalId]; + window.cordova.exec(function () { }, function () { }, "OneSignalPush", "login", args); } /** From 55f5ba9870f3cfdc5d141df9c8cbdff52403c516 Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:26:19 -0800 Subject: [PATCH 5/8] Make externalId nonoptional for UserJwtInvalidatedEvent --- www/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/index.ts b/www/index.ts index ba49f17b..f617f75a 100644 --- a/www/index.ts +++ b/www/index.ts @@ -37,7 +37,7 @@ import LiveActivities from "./LiveActivitiesNamespace"; declare let window: any; // turn off type checking export interface UserJwtInvalidatedEvent { - externalId ?: string; + externalId: string; } export class OneSignalPlugin { From 020a9c8720623714a91fcdd860e1b47ba057457d Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:28:36 -0800 Subject: [PATCH 6/8] Add inline documentation - Make it clear that null must be passed to native layer --- src/ios/OneSignalPush.m | 1 + www/index.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/ios/OneSignalPush.m b/src/ios/OneSignalPush.m index 4484b3d5..c5c053af 100644 --- a/src/ios/OneSignalPush.m +++ b/src/ios/OneSignalPush.m @@ -369,6 +369,7 @@ - (void)setAlertLevel:(CDVInvokedUrlCommand*)command { - (void)login:(CDVInvokedUrlCommand*)command { NSString *externalId = command.arguments[0]; + // check if jwt token provided NSString *jwtToken = command.arguments.count > 1 ? command.arguments[1] : nil; [OneSignal login:externalId withToken:jwtToken]; diff --git a/www/index.ts b/www/index.ts index f617f75a..a88db14c 100644 --- a/www/index.ts +++ b/www/index.ts @@ -82,6 +82,7 @@ export class OneSignalPlugin { * @returns void */ login(externalId: string, jwtToken?: string): void { + // if no jwt token, pass null const args = jwtToken ? [externalId, jwtToken] : [externalId]; window.cordova.exec(function () { }, function () { }, "OneSignalPush", "login", args); } From 8077f0281ecebf813ef6c7ef97b987c8df63a241 Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:29:20 -0800 Subject: [PATCH 7/8] Change parameter name to match native implementation --- www/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/index.ts b/www/index.ts index a88db14c..647f7844 100644 --- a/www/index.ts +++ b/www/index.ts @@ -98,10 +98,10 @@ export class OneSignalPlugin { /** * Update the JWT token for a user. * @param {string} externalId - * @param {string} jwtToken + * @param {string} token */ - updateUserJwt(externalId: string, jwtToken: string): void { - window.cordova.exec(function () { }, function () { }, "OneSignalPush", "updateUserJwt", [externalId, jwtToken]); + updateUserJwt(externalId: string, token: string): void { + window.cordova.exec(function () { }, function () { }, "OneSignalPush", "updateUserJwt", [externalId, token]); } /** From 087222aec60451cf6165b34ad041a3f599fe82e2 Mon Sep 17 00:00:00 2001 From: Jenna Antilla <46546946+jennantilla@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:30:36 -0800 Subject: [PATCH 8/8] Update iOS header - Explicitly add that this class conforms to OSUserJwtInvalidatedListener protocol --- src/ios/OneSignalPush.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ios/OneSignalPush.h b/src/ios/OneSignalPush.h index 93e3ae60..78fad08f 100644 --- a/src/ios/OneSignalPush.h +++ b/src/ios/OneSignalPush.h @@ -31,7 +31,7 @@ #import -@interface OneSignalPush : CDVPlugin +@interface OneSignalPush : CDVPlugin - (void)setProvidesNotificationSettingsView:(CDVInvokedUrlCommand* _Nonnull)command; - (void)addForegroundLifecycleListener:(CDVInvokedUrlCommand* _Nonnull)command;