Compare commits

..
Author SHA1 Message Date
Daniel Sogl b2d47104de feat(mobile-messaging): sync wrapper with upstream SDK v8.6.0
Add chat/config APIs introduced in recent plugin releases and mark
stale members as deprecated instead of removing them.
2026-07-27 22:24:57 +02:00
2 changed files with 207 additions and 241 deletions
@@ -1,196 +1,18 @@
import { Cordova, AwesomeCordovaNativePlugin, Plugin } from '@awesome-cordova-plugins/core';
import { Injectable } from '@angular/core';
/**
* Authorization status of the Background Fetch API. Returned by `BackgroundFetch#configure` and `BackgroundFetch#status`.
*
* @since 7.0.0
*/
export enum BackgroundFetchStatus {
/**
* Background fetch updates are unavailable and the user cannot enable them again.
* For example, this status can occur when parental controls are in effect for the current user.
*/
STATUS_RESTRICTED = 0,
/**
* The user explicitly disabled background behavior for this app or for the whole system.
*/
STATUS_DENIED = 1,
/**
* Background fetch is available and enabled.
*/
STATUS_AVAILABLE = 2,
}
/**
* [Android only] Network type constraint for scheduled tasks. Used with `BackgroundFetchConfig#requiredNetworkType`
* and `BackgroundFetchTaskConfig#requiredNetworkType`.
*
* @since 7.0.0
*/
export enum BackgroundFetchNetworkType {
/**
* No network constraint. The task will run regardless of network state.
*/
NONE = 0,
/**
* The task requires any active network connection.
*/
ANY = 1,
/**
* The task requires an unmetered (e.g. Wi-Fi) network connection.
*/
UNMETERED = 2,
/**
* The task requires a non-roaming network connection.
*/
NOT_ROAMING = 3,
/**
* The task requires a cellular (mobile data) network connection.
*/
CELLULAR = 4,
}
/**
* Configuration properties shared by both `BackgroundFetchConfig` and `BackgroundFetchTaskConfig`.
*
* Aside from `stopOnTerminate`, all properties are Android-only. iOS manages background execution
* through its own system-controlled Background Fetch mechanism and does not support these constraints.
*/
export interface BackgroundFetchAbstractConfig {
export interface BackgroundFetchConfig {
/**
* Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
*/
stopOnTerminate?: boolean;
/**
* [Android only] Set `true` to initiate background-fetch events when the device is rebooted. Defaults to `false`.
* NOTE: `startOnBoot` requires `stopOnTerminate: false`.
*
* @since 7.0.0
*/
startOnBoot?: boolean;
/**
* [Android only] Set `true` to enable the Headless mechanism for handling fetch events after app termination.
* Defaults to `false`. NOTE: Requires `stopOnTerminate: false`.
*
* @since 7.0.0
*/
enableHeadless?: boolean;
/**
* [Android only] By default, the plugin uses Android's `JobScheduler` when possible and falls back to
* `AlarmManager` for older devices. Set `true` to always use `AlarmManager` regardless of API level.
* Defaults to `false`.
*
* @since 7.0.0
*/
forceAlarmManager?: boolean;
/**
* [Android only] Specify the kind of network connectivity required to run this task. Defaults to
* `BackgroundFetchNetworkType.NONE`.
*
* @since 7.0.0
*/
requiredNetworkType?: BackgroundFetchNetworkType;
/**
* [Android only] Set `true` to require the device's battery level to be above the "low battery" threshold
* before running this task. Defaults to `false`.
*
* @since 7.0.0
*/
requiresBatteryNotLow?: boolean;
/**
* [Android only] Set `true` to require the device's available storage to be above the "low storage"
* threshold before running this task. Defaults to `false`.
*
* @since 7.0.0
*/
requiresStorageNotLow?: boolean;
/**
* [Android only] Set `true` to require the device to be charging (or connected to permanent power, such
* as an Android TV device) before running this task. Defaults to `false`.
*
* @since 7.0.0
*/
requiresCharging?: boolean;
/**
* [Android only] Set `true` to require the device to be idle (not actively used) before running this task.
* Defaults to `false`.
*
* @since 7.0.0
*/
requiresDeviceIdle?: boolean;
}
export interface BackgroundFetchConfig extends BackgroundFetchAbstractConfig {
/**
* The minimum interval in **minutes** between background-fetch events. Defaults to `15` minutes. The
* minimum allowed value is `15` minutes.
*
* NOTE: The OS does not guarantee fetch events will fire at exactly this interval. iOS adjusts the
* interval based on usage patterns and system conditions. This value is a *minimum*, not a schedule.
*
* @since 7.0.0
*/
minimumFetchInterval?: number;
}
/**
* Configuration for a custom scheduled task, provided to `BackgroundFetch#scheduleTask`.
*
* @since 7.0.0
*/
export interface BackgroundFetchTaskConfig extends BackgroundFetchAbstractConfig {
/**
* A unique identifier for this task. Use the same `taskId` with `BackgroundFetch#finish` to signal
* completion and with `BackgroundFetch#stopTask` to cancel it. Use reverse-domain notation to avoid
* collisions (e.g. `'com.foo.sync'`).
*/
taskId: string;
/**
* The minimum delay in **milliseconds** before this task runs.
*
* NOTE: On iOS, the system may delay the task beyond this value depending on device conditions. On
* Android, `JobScheduler` treats this as a minimum delay.
*/
delay: number;
/**
* Set `true` to schedule a repeating task. Defaults to `false` (one-shot).
*/
periodic?: boolean;
/**
* [iOS only] Set `true` to require a network connection before running this task. On Android, use
* `requiredNetworkType` instead.
*/
requiresNetworkConnectivity?: boolean;
}
/**
* @name Background Fetch
* @description
* Cross-platform Background Fetch implementation. This plugin will execute your provided callbackFn
* whenever a background-fetch event occurs.
*
* ### iOS
* There is no way to increase the rate which a fetch-event occurs and this plugin sets the rate to the
* most frequent possible value -- iOS determines the rate automatically based upon device usage and
* time-of-day (ie: fetch-rate is about ~15min during prime-time hours; less frequently when the user is
* presumed to be sleeping).
*
* ### Android
* Uses `JobScheduler` (API 21+) or `AlarmManager` to schedule periodic callbacks. Additional constraints
* (network, charging, idle) can be set via `BackgroundFetchConfig`.
*
* iOS Background Fetch Implementation. See: https://developer.apple.com/reference/uikit/uiapplication#1657399
* iOS Background Fetch is basically an API which wakes up your app about every 15 minutes (during the user's prime-time hours) and provides your app exactly 30s of background running-time. This plugin will execute your provided callbackFn whenever a background-fetch event occurs. There is no way to increase the rate which a fetch-event occurs and this plugin sets the rate to the most frequent possible value of UIApplicationBackgroundFetchIntervalMinimum -- iOS determines the rate automatically based upon device usage and time-of-day (ie: fetch-rate is about ~15min during prime-time hours; less frequently when the user is presumed to be sleeping, at 3am for example).
* For more detail, please see https://github.com/transistorsoft/cordova-plugin-background-fetch
* @usage
*
@@ -201,23 +23,17 @@ export interface BackgroundFetchTaskConfig extends BackgroundFetchAbstractConfig
* constructor(private backgroundFetch: BackgroundFetch) {
*
* const config: BackgroundFetchConfig = {
* minimumFetchInterval: 15,
* stopOnTerminate: false, // Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
* }
*
* backgroundFetch.configure(config, (taskId: string) => {
* backgroundFetch.configure(config)
* .then(() => {
* console.log('Background Fetch initialized');
*
* console.log('Background Fetch event received', taskId);
* this.backgroundFetch.finish();
*
* this.backgroundFetch.finish(taskId);
*
* }, (taskId: string) => {
* // OS has signalled that remaining background time is about to expire.
* console.log('Background Fetch TIMEOUT', taskId);
* this.backgroundFetch.finish(taskId);
* }).then((status) => {
* console.log('Background Fetch initialized', status);
* }).catch(e => console.log('Error initializing background fetch', e));
* })
* .catch(e => console.log('Error initializing background fetch', e));
*
* // Start the background-fetch API. Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
* backgroundFetch.start();
@@ -231,38 +47,26 @@ export interface BackgroundFetchTaskConfig extends BackgroundFetchAbstractConfig
* ```
* @interfaces
* BackgroundFetchConfig
* BackgroundFetchTaskConfig
*/
@Plugin({
pluginName: 'BackgroundFetch',
plugin: 'cordova-plugin-background-fetch',
pluginRef: 'BackgroundFetch',
repo: 'https://github.com/transistorsoft/cordova-plugin-background-fetch',
platforms: ['Android', 'iOS'],
platforms: ['iOS'],
})
@Injectable()
export class BackgroundFetch extends AwesomeCordovaNativePlugin {
/**
* Configures the plugin's fetch callbackFn.
*
* Calling `configure` automatically starts background-fetch (equivalent to calling `#start` immediately
* after configuration).
* Configures the plugin's fetch callbackFn
*
* @param {BackgroundFetchConfig} config Configuration for plugin
* @param {Function} [onEvent] Callback fired when a background-fetch event is received. The `taskId`
* string identifies which task fired -- pass it to `#finish` when done. Required as of plugin `7.0.0`.
* @param {Function} [onTimeout] Callback fired when the OS signals that remaining background time is
* about to expire. Call `#finish` immediately. Added in plugin `7.0.0`.
* @returns {Promise<any>}
*/
@Cordova({
otherPromise: true,
callbackOrder: 'reverse',
})
configure(
config: BackgroundFetchConfig,
onEvent?: (taskId: string) => void,
onTimeout?: (taskId: string) => void
): Promise<any> {
configure(config: BackgroundFetchConfig): Promise<any> {
return;
}
@@ -306,33 +110,4 @@ export class BackgroundFetch extends AwesomeCordovaNativePlugin {
status(): Promise<any> {
return;
}
/**
* Schedule a custom one-shot or periodic background task in addition to the default fetch callback
* registered with `#configure`.
*
* Custom tasks fire the same callback registered via `#configure`'s `onEvent` argument, with their
* unique `taskId`. Use `#finish` with that `taskId` to signal completion.
*
* @param {BackgroundFetchTaskConfig} config Task configuration, including a unique `taskId` and a
* minimum `delay` in milliseconds.
* @returns {Promise<any>}
* @since 7.0.0
*/
@Cordova()
scheduleTask(config: BackgroundFetchTaskConfig): Promise<any> {
return;
}
/**
* Cancel a specific task previously scheduled via `#scheduleTask`, identified by its `taskId`.
*
* @param taskId The identifier of the scheduled task to stop.
* @returns {Promise<any>}
* @since 7.0.0
*/
@Cordova()
stopTask(taskId: string): Promise<any> {
return;
}
}
@@ -9,6 +9,9 @@ export type Event =
| 'notificationTapped'
| 'tokenReceived'
| 'registrationUpdated'
/**
* @deprecated No longer part of the supported events list in the upstream SDK (confirmed absent as of v8.6.0, and as far back as v5.0.0).
*/
| 'geofenceEntered'
| 'actionTapped'
| 'installationUpdated'
@@ -18,6 +21,9 @@ export type Event =
| 'inAppChat.availabilityUpdated'
| 'inAppChat.unreadMessageCounterUpdated'
| 'deeplink'
/**
* @deprecated No longer part of the supported events list in the upstream SDK (confirmed absent as of v8.6.0, and as far back as v5.0.0).
*/
| 'inAppChat.viewStateChanged';
export interface CustomEvent {
@@ -34,6 +40,14 @@ export interface Configuration {
geofencingEnabled?: boolean;
inAppChatEnabled?: boolean;
fullFeaturedInAppsEnabled?: boolean | undefined;
/**
* Set to true to enable debug logging.
*/
loggingEnabled?: boolean;
/**
* List of trusted domain strings for web views, e.g. ['example.com', 'trusted.org']
*/
trustedDomains?: string[];
/**
* Message storage save callback
*/
@@ -42,12 +56,40 @@ export interface Configuration {
ios?: {
notificationTypes?: string[]; // ['alert', 'badge', 'sound']
forceCleanup?: boolean;
/**
* @deprecated Removed upstream in v7.3.0. Replaced by the top-level `loggingEnabled` option.
*/
logging?: boolean;
/**
* Set to true to disable automatic registration for remote notifications. Default: false
*/
registeringForRemoteNotificationsDisabled?: boolean;
/**
* Set to true to prevent the SDK from overriding UNUserNotificationCenterDelegate. Default: false
*/
overridingNotificationCenterDelegateDisabled?: boolean;
/**
* Set to true to prevent the SDK from unregistering for remote notifications when stopping the SDK or after depersonalization. Default: false
*/
unregisteringForRemoteNotificationsDisabled?: boolean;
/**
* Settings for web view configuration in in-app messages
*/
webViewSettings?: {
title?: string;
barTintColor?: string;
titleColor?: string;
tintColor?: string;
};
};
android?: {
notificationIcon?: string; // a resource name for a status bar icon (without extension), located in '/platforms/android/app/src/main/res/mipmap'
notificationChannelId?: string; // identifier for notification channel
notificationChannelName?: string; // user visible name for notification channel
notificationSound?: string; // a resource name for a notification sound (without extension), located in '/platforms/android/app/src/main/res/raw'
multipleNotifications?: boolean; // set to 'true' to enable multiple notifications
notificationAccentColor?: string; // set to hex color value in format '#RRGGBB' or '#AARRGGBB'
withBannerForegroundNotificationsEnabled?: boolean; // set to true to always display Push notifications as Banner
firebaseOptions?: {
apiKey: string;
applicationId: string;
@@ -78,9 +120,9 @@ export interface Configuration {
icon?: string;
textInputActionButtonTitle?: string;
textInputPlaceholder?: string;
}
},
];
}
},
];
}
@@ -110,7 +152,14 @@ export interface Installation {
deviceModel?: string;
deviceSecure?: boolean;
language?: string;
/**
* @deprecated Renamed upstream in v7.9.1 to `deviceTimezoneOffset`.
*/
deviceTimezoneId?: string;
/**
* UTC-related timezone offset that identifies the current timezone of a device.
*/
deviceTimezoneOffset?: string;
applicationUserId?: string;
deviceName?: string;
customAttributes?: Record<string, string | number | boolean>;
@@ -129,6 +178,14 @@ export interface PersonalizeContext {
userIdentity: UserIdentity;
userAttributes?: Record<string, string | number | boolean | any[]>;
forceDepersonalize?: boolean;
/**
* Set to true if you want to keep the installation as a lead when personalizing it. Default: false
*/
keepAsLead?: boolean;
/**
* Set to true to mark this installation as primary for the personalized user. Default: false
*/
setDeviceAsPrimary?: boolean;
}
export interface GeoData {
@@ -276,6 +333,17 @@ export interface ChatSettingsIOS {
navigationBarTitleColor: string;
}
/**
* Exception raised by the in-app chat widget and passed to the handler registered via `setChatExceptionHandler`.
*/
export interface ChatException {
code: string;
name: string;
message: string;
origin: string;
platform: string;
}
/**
* @name Mobile Messaging
* @description
@@ -665,7 +733,7 @@ export class MobileMessaging extends AwesomeCordovaNativePlugin {
/**
* Updates JWT used for user data fetching and personalization.
*
*
* @name setUserDataJwt
* @param jwt - JWT in a predefined format
* @param {Function} errorCallback will be called on error
@@ -674,4 +742,127 @@ export class MobileMessaging extends AwesomeCordovaNativePlugin {
setUserDataJwt(jwt: string, errorCallback?: (error: MobileMessagingError) => void) {
return;
}
/**
* Un register all handlers for a MobileMessaging library event.
*
* @name unregisterAllHandlers
* @param event
*/
@Cordova({
sync: true,
})
unregisterAllHandlers(event: Event): void {
return;
}
/**
* Sets the JWT provider used to authenticate in-app chat sessions.
*
* The `jwtProvider` callback returns a JSON Web Token (JWT) used for chat authentication,
* either synchronously (returning a string) or asynchronously (returning a Promise<string>).
* It may be invoked multiple times during the widget's lifecycle, so it should always return
* a fresh and valid JWT.
*
* @param jwtProvider A callback function that returns a JWT string or a Promise that resolves to one.
* @param errorCallback Optional error handler for catching exceptions thrown during JWT generation.
*/
@Cordova({
sync: true,
})
setChatJwtProvider(jwtProvider: () => string | Promise<string>, errorCallback?: (error: any) => void): void {
return;
}
/**
* Sets the chat exception handler in case you want to intercept and display errors coming
* from the chat on your own (instead of relying on the prebuilt error banners).
* Passing `null` removes the previously set handler.
*
* @param exceptionHandler A function called with the chat exception when it is triggered, or `null` to remove the handler.
* @param errorCallback Optional error handler for catching exceptions thrown when handling exceptions from the native side.
*/
@Cordova({
sync: true,
})
setChatExceptionHandler(
exceptionHandler: ((exception: ChatException) => void) | null,
errorCallback?: (error: any) => void
): void {
return;
}
/**
* Checks if in-app chat is currently available.
*
* @name isChatAvailable
* @param resultCallback will be called upon completion with the boolean availability value.
*/
@Cordova({ sync: true })
isChatAvailable(resultCallback: (available: boolean) => void): void {
return;
}
/**
* Sets chat language.
*
* @name setLanguage
* @param language to be set
* @param {Function} errorCallback will be called on error
*/
@Cordova()
setLanguage(language: string, errorCallback?: (error: MobileMessagingError) => void) {
return;
}
/**
* Set contextual data of the widget.
*
* @param data contextual data in the form of a JSON string
* @param allMultiThreadStrategy multi-thread strategy flag, true -> ALL, false -> ACTIVE
* @param {Function} errorCallback will be called on error
*/
@Cordova()
sendContextualData(
data: string,
allMultiThreadStrategy: boolean,
errorCallback?: (error: MobileMessagingError) => void
) {
return;
}
/**
* Cleans up the SDK, removing all data and stopping all services.
* After cleanup, you should call `init()` again with a new configuration to restart the SDK.
* The JWT supplier is also cleared during cleanup.
*
* @name cleanup
*/
@Cordova()
cleanup(): Promise<any> {
return;
}
/**
* Sets chat customization.
*
* @name setChatCustomization
* @param customization Chat customization JSON object.
*/
@Cordova()
setChatCustomization(customization: any): Promise<any> {
return;
}
/**
* Sets widget theme.
*
* @name setWidgetTheme
* @param widgetTheme Widget theme name.
* @param {Function} errorCallback will be called on error
*/
@Cordova()
setWidgetTheme(widgetTheme: string, errorCallback?: (error: MobileMessagingError) => void) {
return;
}
}