NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #974 most downloaded on pub.dev
This is the Braze plugin for Flutter. Effective marketing automation is an essential part of successfully scaling and managing your business.
Last release 10 days ago
28 Sep 2026
Release timing varies
gaps range from 2 weeks to 4 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
70 releases · first in 2019
Raises the minimum supported Flutter version from 1.10.0 to 3.44.0 and the minimum Dart version from 2.17.0 to 3.12.0.
getCachedContentCards() never completed if the native cache was null. The method now returns an empty list, matching iOS.getBanner, requestBannersRefresh, and getFeatureFlagByID now complete the method channel with an error when required arguments are missing.BaseContentCardView.bindViewHolder() now takes Card instead of generic type.BrazeNotificationPayload objects via BrazeNotificationPayload().deeplink.One column per quarter.
Updates the native Android bridge from Braze Android SDK 43.0.0 to 43.1.1 .
BrazePlugin.unregisterPush() unregisters the device's push token. On failure, it throws a BrazePushUnregistrationError so integrators can implement their own retry behavior.BrazePlugin.logout() unregisters push (and push-to-start on iOS if present), then wipes local data and disables the SDK on success. On failure, it throws a BrazePushUnregistrationError so integrators can implement their own retry behavior.Updates the native Android bridge from Braze Android SDK 42.3.1 to 43.0.0 .
Appboy.java is now Braze.kt. Kotlin clients will need to update their code to support the use of Kotlin properties on the Braze singleton where needed.
Braze.registerPushToken()/Braze.getRegisteredPushToken() is now Braze.setRegisteredPushToken()/Braze.getRegisteredPushToken(). If using Kotlin, use the property Braze.registeredPushToken.Braze.getDeviceId is now just Braze.deviceId for Kotlin.Braze.enableMockNetworkAppboyRequestsAndDropEventsMode is now Braze.enableMockNetworkRequestsAndDropEventsMode().Appboy.java has been removed. For example, calls like Appboy.getInstance() will need to be Braze.getInstance() moving forward.setCustomAppboyNotificationFactory() with setCustomBrazeNotificationFactory() / customBrazeNotificationFactory.enableMockAppboyNetworkRequestsAndDropEventsMode to enableMockNetworkRequestsAndDropEventsMode.com.appboy.IBrazeEndpointProvider to com.braze.IBrazeEndpointProvider.com.appboy.events.IEventSubscriber to com.braze.events.IEventSubscriber.Appboy.registerAppboyPushMessages() / Appboy.getAppboyPushMessageRegistrationId(). Replaced with getRegisteredPushToken() / setRegisteredPushToken().IAppboyNotificationFactory with IBrazeNotificationFactory.BrazePushReceiver where eager In-App Message test displays and Content Card serializations from push notifications wouldn't work unless notifications were enabled on the device.IBraze.subscribeToPushNotificationEvents() to allow for subscriptions to push notification events without the use of a BroadcastReceiver.
Application.onCreate().com.braze.models.outgoing.BrazeProperties.clone() to return BrazeProperties?.Removes the following deprecated methods:
Braze.init and changeUser(userId:) no longer block the calling thread. Refer to the full release notes for Swift SDK 17.0.0 for more details.logCustomEventWithProperties(). Use logCustomEvent() instead.logPurchaseWithProperties(). Use logPurchase() instead.registerAndroidPushToken(). Use registerPushToken() instead.getInstallTrackingId(). Use getDeviceId() instead.setGoogleAdvertisingId(). Use setAdTrackingEnabled() instead.initialize() was silently dropped because the native Braze instance had not been created yet. The instance is now created synchronously so calls made right after initialize() are applied to a valid instance.changeUser, enableSDK, and disableSDK handlers now return a completion result on both iOS and Android, so awaiting these method channel calls no longer hangs.IAppboy.logContentCardsDisplayed. This method was not part of the recommended Content Cards integration and can be safely removed.Updates the native iOS bridge from Braze Swift SDK 14.1.0 to 16.0.0 .
getCachedContentCards (including removed, viewed, and clicked states) is updated immediately when changes occur. This now matches the iOS behavior with Android.stableKey field to the BrazeBanner model.onDismiss callback to BrazeBannerView, invoked when the banner for that placement is dismissed.BrazePlugin.dismissBanner(placementId) to programmatically dismiss the banner for a given placement.BrazeNotificationStyleFactory to remove deprecated functions.
BrazeNotificationStyleFactory.getBigNotificationStyle(Context, Bundle, Bundle, NotificationCompat.Builder). Use BrazeNotificationStyleFactory.getNotificationStyle(NotificationCompat.Builder, BrazeNotificationPayload) instead.BrazeNotificationStyleFactory.getBigTextNotificationStyle(BrazeConfigurationProvider, Bundle). Use BrazeNotificationStyleFactory.getBigTextNotificationStyle(BrazeNotificationPayload) instead.BrazeNotificationStyleFactory.getStoryStyle(Context, Bundle, Bundle, NotificationCompat.Builder). Use BrazeNotificationStyleFactory.getStoryStyle(NotificationCompat.Builder, BrazeNotificationPayload) instead.BrazeNotificationActionUtils to remove deprecated functions.
BrazeNotificationActionUtils.addNotificationActions(Context, NotificationCompat.Builder, Bundle). Use BrazeNotificationActionUtils.addNotificationActions(NotificationCompat.Builder, BrazeNotificationPayload) instead.BrazeNotificationActionUtils.addNotificationAction(Context, NotificationCompat.Builder, Bundle, Int). Use BrazeNotificationActionUtils.addNotificationAction(BrazeNotificationPayload.ActionButton) instead.AppboyNotificationActionUtils. Use BrazeNotificationActionUtils instead.AppboyHuaweiPushHandler. Use BrazeHuaweiPushHandler instead.AppboyFirebaseMessagingService. Use BrazeFirebaseMessagingService instead.AppboyAdmReceiver. Use BrazeAmazonDeviceMessagingReceiver instead.BrazeFirebaseMessagingService.handleBrazeRemoteMessage() and BrazeFirebaseMessagingService.isBrazePushNotification() now require non-null parameters.UriAction.channel is now Channel.CONTENT_CARD for actions that originate from a Content Card instead of Channel.NEWS_FEED.BrazeProperties.addProperties() to allow adding nested properties via JSONObject or Map<String, *>.@dimen/com_braze_inappmessage_slideup_max_width.com.braze.Constants with constants starting with "BRAZE_" that replace the corresponding "APPBOY_" constants in com.appboy.Constants. The "APPBOY_" constants are deprecated and will be removed in a future release.The minimum supported Dart version is 2.17.0 .
2.17.0.setBrazePluginIsReady could throw a NullPointerException when replaying pending push events containing null entries.
dart:developer's log() function under the name BrazeFlutterSDK, making them visible in the Flutter DevTools Logging tab.BrazeLogLevel with three levels:
BrazeLogLevel.debugBrazeLogLevel.infoBrazeLogLevel.errorBrazePlugin.logLevel to filter out logs below a given level.
BrazeLogLevel or a raw dart:developer integer.BrazeLogLevel.info, which suppresses debug logs.BrazePlugin.logger, an optional callback.
dart:developer output so you can route logs to your own logging infrastructure.BrazeLogger when the Flutter engine attaches.Application.onCreate will be overwritten.BrazePlugin.logLevel from Dart to control the log level instead.AppDelegate already sets a custom configuration.logger.print closure, the plugin will not forward native logs to Dart and BrazePlugin.logLevel will only filter Dart-side logs.configuration.logger.level will be overriden.BrazePlugin.logLevel will only take effect after BrazePlugin.initialize(apiKey, endpoint) is called and a new Braze instance is created.-Xjvm-default=all in your Gradle build options due to the new use of default arguments in the SDK. Without this flag, you may see a compiler warning about "Inheritance from an interface with '@JvmDefault' members". An example is included below: android {
kotlinOptions {
freeCompilerArgs = ['-Xjvm-default=all']
jvmTarget = "1.8"
}
}
BrazeProperties(JSONObject) when Date is part of JSONObject.
Date.toString() (e.g. "Thu Jan 01 03:15:33 CST 1970").BrazeDateFormat.LONG (e.g. "1970-01-01 09:15:33"). This behavior is consistent with BrazeProperties.addProperty(Date).IInAppMessage to Kotlin and changed several methods to no longer allow for null inputs or return boolean statuses on field setters.
IInAppMessage.setClickAction() is renamed to setClickBehavior() and now returns void.MessageButton.setClickAction() is renamed to setClickBehavior() and now returns void.InAppMessageImmersiveBase.setMessageButtons() no longer accepts null. Pass in an empty list to clear.Card to Kotlin, so JVM signatures may have changed.
Card.isEqualToCard(). Please use card.equals(otherCard) instead.Card.isRead() and Card.setIsRead(). Please use Card.isIndicatorHighlighted (Kotlin) or Card.isIndicatorHighlighted() and Card.setIndicatorHighlighted() (Java).com.appboy.AnimationUtils, com.appboy.ViewUtils, com.appboy.UriUtils, com.appboy.IAction, com.appboy.NewsfeedAction and com.appboy.UriAction classes. The Braze namespaced classes remain.BrazeDeeplinkHandler.createUriActionFromUrlString() and BrazeDeeplinkHandler.createUriActionFromUri() now require non-null values for uri/url and channel.
AppboyNavigator has been removed in favor of BrazeDeeplinkHandler.AppboyNotificationUtils in favor of BrazeNotificationUtils.AppboyLifecycleCallbackListener. Please use BrazeActivityLifecycleCallbackListener.
BrazeLifecycleCallbackListener.setInAppMessagingRegistrationBlacklist() in favor of BrazeLifecycleCallbackListener.setInAppMessagingRegistrationBlocklist(). Removed BrazeLifecycleCallbackListener.setSessionHandlingBlacklist() in favor of BrazeLifecycleCallbackListener.setSessionHandlingBlocklist().AppboyContentCardsManager. Please use BrazeContentCardsManager instead.AppboyEmptyContentCardsAdapter. Please use EmptyContentCardsAdapter instead.BrazeUser.setAvatarImageUrl(String).Webview.onRenderProcessGone() could lead to app crashes. Thanks to @ankitsingh08 for finding the issue.BrazeProperties(Map<String, *>) constructor.Appboy.getConfiguredApiKey() to accept a BrazeConfigurationProvider instead of a Context object.AppboyBootReceiver. Please use BrazeBootReceiver instead.APPBOY_WEBVIEW_URL_EXTRA. Please use BRAZE_WEBVIEW_URL_EXTRA instead.Configuration.UI_MODE_TYPE_TELEVISION devices when receiving push notifications.
isPushWakeScreenForNotificationEnabled() is true and the permission Manifest.permission.WAKE_LOCK is granted.Braze.registerPushToken() now explicitly enforces that the device token is a hex-encoded string for the iOS implementation.
Braze.registerPushToken() now explicitly enforces that the device token is a hex-encoded string for the iOS implementation.
__MACOSX folders without a corresponding entry for that folder would cause the in-app message to fail to display.BrazePlugin.initBraze() is deprecated. Use the configure + Dart initialize pattern instead.
braze.contentCards.subscribeToUpdates(), braze.banners.subscribeToUpdates(), braze.notifications.subscribeToUpdates, braze.featureFlags.subscribeToUpdates and braze.inAppMessagePresenter in the AppDelegate.postInitialization closure in BrazePlugin.configure(_:postInitialization:).initialize(apiKey, endpoint) method to create the Braze instance at runtime with the stored configuration. This method can be called multiple times to re-initialize the SDK with a different API key and endpoint mid-session.com_braze_enable_delayed_initialization set to true in your braze.xml.BrazePlugin.configure(_:postInitialization:) to store configurations in your AppDelegate for later use by the new Dart initialize(apiKey, endpoint) method.
BrazePlugin.initBraze() is deprecated. Use the configure + Dart initialize pattern instead.-Xjvm-default=all in your Gradle build options due to the new use of default arguments in the SDK. Without this flag, you may see a compiler warning about "Inheritance from an interface with '@JvmDefault' members". An example is included below: android {
kotlinOptions {
freeCompilerArgs = ['-Xjvm-default=all']
jvmTarget = "1.8"
}
}
This version has a known issue with HTML In-App Message which was fixed in v18.0.1
AppboyLruImageLoader in favor of DefaultBrazeImageLoader.
com.appboy.lrucache.AppboyLruImageLoader -> com.braze.images.DefaultBrazeImageLoader.com.appboy.Appboy.getAppboyImageLoader -> com.appboy.Appboy.getImageLoader.com.appboy.Appboy.setAppboyImageLoader -> com.appboy.Appboy.setImageLoader.IAppboyEndpointProvider in favor of IBrazeEndpointProvider.
Braze.setAppboyEndpointProvider() please use Braze.setEndpointProvider().Braze.changeUser() when the current user id and a new signature is passed in.
Braze.changeUser() would not change the SDK authentication signature if the current user id was used.InAppMessageCloser is deprecated.
BrazeInAppMessageManager.hideCurrentlyDisplayingInAppMessage() to hide currently displayed in-app messages.IInAppMessage.setAnimateOut() to set whether your in-app message should animate on close.IInAppMessageManagerListener.onInAppMessageClicked() and IInAppMessageManagerListener.onInAppMessageButtonClicked() that don't use InAppMessageCloser have been added.
InAppMessageCloser, those will be called.ContentCardsUpdatedEvent.getLastUpdatedInSecondsFromEpoch.
getTimestampSeconds() (Java) or timestampSeconds (Kotlin).Adds support to import the Flutter iOS package via Swift Package Manager (SPM).
3.24.0 or higher.Updates the native iOS bridge from Braze Swift SDK 13.3.0 to 14.0.1 .
BrazeBanner instances.
logBannerClicked(placementId:buttonId:) and logBannerImpression(placementId:) on the BrazePlugin interface.:warning: This version has a known issue with HTML In-App Message which was fixed in v18.0.1
BrazeLogger.setLogLevel() replaced with direct property setter BrazeLogger.logLevel for Kotlin.AppboyLogger, com.appboy.IntentUtils, com.appboy.StringUtils class. The Braze namespaced classes remain.com_braze_locale_api_key_map as a configuration option and BrazeConfig.setLocaleToApiMapping(). If you need to change your API key based on locale, please use BrazeConfig at runtime instead.Braze.isDisabled() to determine whether the SDK is disabled.Braze.addSdkMetadata() to allow self reporting of SDK Metadata fields via the BrazeSdkMetadata enum.
string-array to your braze.xml with the key com_braze_sdk_metadata. The allowed items are the same as the keys found in the BrazeSdkMetadata enum. For example when using Branch: <string-array name="com_braze_sdk_metadata">
<item>BRANCH</item>
</string-array>
Updates the native Android bridge from Braze Android SDK 39.0.0 to 40.0.0 .
setState extraneously if the view component is not mounted.
BrazeBannerView when navigating between screens on AndroidAppboyConfigurationProvider in favor of BrazeConfigurationProvider.
IBrazeNotificationFactory have also been removed.braze.xml configurations to be able to use braze in place of appboy. The Braze namespaced configuration keys will take precedence over the appboy keys.
com_appboy_api_key can be replaced with com_braze_api_key.com_braze_api_key from your default variant might take precedence unexpectedly.com_appboy_* configuration keys in XML will be removed in a future release so it is advised to migrate these configuration keys to their com_braze_* counterparts.Adds support for Banner properties via new public methods for BrazeBanner .
BrazeBanner.
banner.getStringProperty(key:) for accessing String properties.banner.getNumberProperty(key:) for accessing num properties.banner.getTimestampProperty(key:) for accessing int Unix UTC millisecond timestamp properties.banner.getBooleanProperty(key:) for accessing bool properties.banner.getImageProperty(key:) for accessing image URL properties as Strings.banner.getJSONProperty(key:) for accessing JSON properties as Map<String, dynamic>.Updates the native Android bridge from Braze Android SDK 36.0.0 to 39.0.0.
null:
com_appboy_content_cards/com_appboy_content_card were replaced with com_braze_content_cards/com_braze_content_card respectively.
icon_pinned, icon_read, icon_unread are now com_braze_content_card_icon_pinned, com_braze_content_card_icon_read, com_braze_content_card_icon_unread.com_appboy_inappmessage/com_appboy_in_app_message replaced with com_braze_inappmessage.Appboy.* moved to Braze.*.
Appboy.* style overrides must be migrated to Braze.* as there is no backwards compatibility.Appboy.Cards.ImageSwitcher must be renamed to Braze.Cards.ImageSwitcher.com.appboy.models.* moved to com.braze.models.inappmessagecom.appboy.ui.inappmessage.InAppMessageCloser -> com.braze.ui.inappmessage.InAppMessageClosercom.appboy.ui.inappmessage.InAppMessageOperation -> com.braze.ui.inappmessage.InAppMessageOperationcom.appboy.enums.inappmessage.* moved to com.braze.enums.inappmessageIContentCardsUpdateHandler moved to com.braze.ui.contentcards.handlers.IContentCardsUpdateHandlerIContentCardsViewBindingHandler moved to com.braze.ui.contentcards.handlers.IContentCardsViewBindingHandlerAppboyContentCardsActionListener moved to com.braze.ui.contentcards.listeners.DefaultContentCardsActionListenercom.appboy.ui.contentcards.view.* moved to com.braze.ui.contentcards.view.*
com.appboy.events.ContentCardsUpdatedEvent -> com.braze.events.ContentCardsUpdatedEventAppboyBaseFragmentActivity moved to com.braze.ui.activities.BrazeBaseFragmentActivityIInAppMessageManagerListener#onInAppMessageReceived from IInAppMessageManagerListener.AppboyUser in favor of BrazeUser.
Appboy.currentUser? and Braze.currentUser? are valid due to the removal of generics on the Braze.getCurrentUser() method.<action android:name="${applicationId}.intent.APPBOY_PUSH_RECEIVED" /> should be replaced with <action android:name="com.braze.push.intent.NOTIFICATION_RECEIVED" /><action android:name="${applicationId}.intent.APPBOY_NOTIFICATION_OPENED" /> should be replaced with <action android:name="com.braze.push.intent.NOTIFICATION_OPENED" /><action android:name="${applicationId}.intent.APPBOY_PUSH_DELETED" /> should be replaced with <action android:name="com.braze.push.intent.NOTIFICATION_DELETED" />appboy intents have been deprecated but are still available. They will be removed in a future release so migrating early is highly recommended.appboy and braze intents are sent for backwards compatibility so only one set should be registered at a time.BrazeUser.addToSubscriptionGroup() and BrazeUser.removeFromSubscriptionGroup() to add or remove a user from an email or SMS subscription group.
brazeBridge.getUser().addToSubscriptionGroup() and brazeBridge.getUser().removeFromSubscriptionGroup() to the javascript interface for HTML In-App Messages.com.appboy.push.* moved to com.braze.push.*com.appboy.ui.inappmessage.views moved to com.braze.ui.inappmessage.viewscom.appboy.ui.inappmessage.listeners moved to com.braze.ui.inappmessage.listenerscom.appboy.ui.inappmessage.* moved to com.braze.ui.inappmessage.*com.appboy.AppboyFirebaseMessagingService -> com.braze.push.BrazeFirebaseMessagingServicecom.appboy.AppboyAdmReceiver -> com.braze.push.BrazeAmazonDeviceMessagingReceivercom.appboy.ui.AppboyContentCardsFragment -> com.braze.ui.contentcards.ContentCardsFragmentcom.appboy.ui.activities.AppboyContentCardsActivity -> com.braze.ui.activities.ContentCardsActivitycom.appboy.ui.AppboyWebViewActivity -> com.braze.ui.BrazeWebViewActivitycom.appboy.ui.inappmessage.AppboyInAppMessageManager -> com.braze.ui.inappmessage.BrazeInAppMessageManagercom.appboy.ui.inappmessage.DefaultInAppMessageViewWrapper -> com.braze.ui.inappmessage.DefaultInAppMessageViewWrappercom.appboy.AppboyLifecycleCallbackListener -> com.braze.BrazeActivityLifecycleCallbackListenerContentCardsFragment and BrazeInAppMessageManager to clear their respective caches of messages after wipeData() is called.Fixes missing Braze symbol error in BrazeBannerViewFactory when using dynamically-linked frameworks.
Braze symbol error in BrazeBannerViewFactory when using dynamically-linked frameworks.> This release reverts the increase to the minimum Android SDK version of the Braze Android SDK from API 21 to API 25 introduced in 34.0.0. This allow
[!IMPORTANT] This release reverts the increase to the minimum Android SDK version of the Braze Android SDK from API 21 to API 25 introduced in 34.0.0. This allows the SDK to once again be compiled into apps supporting as early as API 21. However, we are not reintroducing formal support for < API 25. Read more here.
14.0.1 when changing a Banner dynamically.minSdk enforced by the Flutter Android layer is now downgraded from 25 to 21, matching the minSdk in the Android native layer.Fixes a crash on iOS when the app is force-closed while a Banner is visible on the screen.
BrazeProperties not being kept via proguard rules.⚠️ Important: This version has a known issue related to Banners. Upgrade to version 14.0.2 instead.
⚠️ Important: This version has a known issue related to Banners. Upgrade to version 14.0.2 instead.
getUserId() would not return any value if the user was anonymous.
null if the user is anonymous.setDateOfBirth to correctly report dates using the Gregorian calendar instead of the user's device calendar.
html, instead of the default slideup type.full, instead of incorrectly being marked as html_full. HTML full messages will still continue to work as expected.IInAppMessageViewWrapperFactory changed to use BrazeConfigurationProvider.IAppboyImageLoader/IBrazeImageLoader changed to use com.braze.enums.BrazeViewBounds.com.appboy.configuration.AppboyConfig is now com.braze.configuration.BrazeConfig. The original class has been removed and old usages should be updated.com.appboy.enums.AppboyViewBounds is now com.braze.enums.BrazeViewBounds. The original class has been removed and old usages should be updated.com.appboy.push.AppboyNotificationUtils#bundleOptString.Braze.logPurchase() and Braze.logEvent() now impose a 50KB limit on event properties. If the supplied properties are too large, the event is not logged.
BrazeProperties.isInvalid().AppboyHtmlViewFactory now require the device to be in touch mode to display.
getIsTouchModeRequiredForHtmlInAppMessages() in the #added section for configuration on disabling this behavior.Appboy.currentUser? calls must be migrated to Braze.getCurrentUser<BrazeUser>() due to updated generics resolution.com.appboy.Appboy -> com.braze.Brazecom.appboy.configuration.AppboyConfig -> com.braze.configuration.BrazeConfigcom.braze.AppboyUser -> com.braze.BrazeUsercom.appboy.lrucache.AppboyLruImageLoader -> com.braze.images.DefaultBrazeImageLoadercom.appboy.configuration.AppboyConfigurationProvider -> com.braze.configuration.BrazeConfigurationProvidercom.appboy.models.outgoing.AppboyProperties -> com.braze.models.outgoing.BrazePropertiescom.appboy.support.AppboyImageUtils -> com.braze.support.BrazeImageUtilscom.appboy.support.AppboyFileUtils -> com.braze.support.BrazeFileUtilsAppboyInAppMessageWebViewClientListener to use an Activity context when following a deeplink in IInAppMessageWebViewClientListener.onOtherUrlAction.AppboyInAppMessageHtmlBaseView.APPBOY_BRIDGE_PREFIX.Braze.registerPushToken() and Braze.getRegisteredPushToken().
Appboy.registerAppboyPushMessages() and Appboy.getAppboyPushMessageRegistrationId().brazeBridge which replaces appboyBridge to be used as the javascript interface for HTML In-App Messages. appboyBridge is deprecated and will be removed in a future version of the SDK.AppboyInAppMessageHtmlBaseView.BRAZE_BRIDGE_PREFIX.View#isInTouchMode() is required to show HTML In-App Messages via BrazeConfig.setIsTouchModeRequiredForHtmlInAppMessages().
com_braze_require_touch_mode_for_html_in_app_messages in your braze.xml.setIsInAppMessageAccessibilityExclusiveModeEnabled() not being respected if set via runtime configuration. Setting this value via XML was unaffected.⚠️ Important: This version has a known issue related to Banners. Upgrade to version 14.0.2 instead.
⚠️ Important: This version has a known issue related to Banners. Upgrade to version 14.0.2 instead.
BrazeBannerView widget to display a Banner Card directly in Dart.
BrazeBannerView(placementId:) into your Dart view hierarchy with the relevant placementId.BrazePlugin.requestBannersRefresh(List<String> placementIds) - to request a refresh of the banners associated with the provided placement IDs. This must be called at least once to set the list of banners to retrieve. On iOS only, failures will be logged if unsuccessful.BrazePlugin.getBanner(String placementId) - to get a banner with the provided placement ID if available in cache, otherwise returns null.BrazePlugin.subscribeToBanners(void Function(List<BrazeBanner>) onEvent) - to subscribe to the stream of banners and call [onEvent] when it receives the list of banners.Button to com.appboy.ui.inappmessage.views.InAppMessageButton.
MaterialComponentsViewInflater does not interfere with standard In-App Message display when using a MaterialComponents theme.Material theme should test to ensure their In-App Messages appear as expected.com.appboy.ui.inappmessage.AppboyInAppMessageImageView to com.appboy.ui.inappmessage.views.InAppMessageImageView.AppboyConfig. Access to the underlying data is now directly possible via the variables of the object, e.g. appboyConfig.getApiKey() is now appboyConfig.mApiKey.getEmptyCardsAdapter(), getContentCardUpdateRunnable(), getNetworkUnavailableRunnable() to protected methods in AppboyContentCardsFragment for easier customizability."Appboy.Push.InlineImage.TextArea.TitleContent.ContentText"AppboyContentCardsFragment.ContentCardsUpdateRunnable to determine network unavailability and feed emptiness based on the filtered list of cards and not the original input list of cards.Updates the native iOS bridge from Braze Swift SDK 11.6.0 to 11.6.1.
Updates the native iOS bridge from Braze Swift SDK 11.3.0 to 11.6.0.
Updates the native iOS bridge from Braze Swift SDK 10.3.1 to 11.3.0.
getIntentFlags to the IAppboyNavigator interface to more easily allow for customizing Activity launch behavior.
@Override
public int getIntentFlags(IntentFlagPurpose intentFlagPurpose) {
return new AppboyNavigator().getIntentFlags(intentFlagPurpose);
}
firebase_messaging_service_automatically_register_on_new_token to com_appboy_firebase_messaging_service_automatically_register_on_new_token in appboy.xml configuration.AppboyInAppMessageManager.ensureSubscribedToInAppMessageEvents() method wouldn't properly resubscribe after disabling and re-enabling the SDK.AppboyNotificationStyleFactory to use BrazeNotificationPayload.Updates the native iOS bridge from Braze Swift SDK 10.2.0 to 10.3.1.
Updates the native Android bridge from Braze Android SDK 30.4.0 to 32.1.0.
wipeData() on Android to retain external subscriptions (like subscribeToContentCards()) after being called.featureFlag.getTimestampProperty(String key) for accessing Int Unix UTC millisecond timestamps as int?s.featureFlag.getJSONProperty(String key) for accessing JSON objects as Map<String, dynamic>? types.featureFlag.getImageProperty(String key) for accessing image URLs as String?s.getUserId() method to get the ID of the current user. This method will return null if the current user is anonymous.hideCurrentInAppMessage() method, which dismisses the currently displayed in-app message.MessageType.HTML and not MessageType.HTML_FULL) to not automatically log analytics clicks on url follows in IInAppMessageWebViewClientListener.
appboyBridge.logClick().IContentCardsUpdateHandler and IContentCardsViewBindingHandler interfaces now extend android.os.Parcelable.
Parcelable can be found in DefaultContentCardsUpdateHandler and DefaultContentCardsViewBindingHandler.AppboyFcmReceiver to BrazePushReceiver.AppboyInAppMessageManager.getIsCurrentlyDisplayingInAppMessage().AppboyFirebaseMessagingService will automatically register tokens in its onNewToken method.
firebase_messaging_service_automatically_register_on_new_token in your appboy.xml, or at runtime by setting AppboyConfig.setIsFirebaseMessagingServiceOnNewTokenRegistrationEnabled().onNewToken() is based on the app's default Firebase Project rather than the explicitly configured Sender ID on the Braze SDK. These should generally be the same value.AppboyLifecycleCallbackListener.setInAppMessagingRegistrationBlacklist() in favor of AppboyLifecycleCallbackListener.setInAppMessagingRegistrationBlocklist().AppboyConfig.Builder.setDeviceObjectWhitelist() in favor of AppboyConfig.Builder.setDeviceObjectAllowlist().AppboyConfig.Builder.setDeviceObjectWhitelistEnabled() in favor of AppboyConfig.Builder.setDeviceObjectAllowlistEnabled().AppboyContentCardsFragment would not transition a custom IContentCardsUpdateHandler or IContentCardsViewBindingHandler implementation in onSaveInstanceState(), which caused the defaults for both to be used instead.Updated the Android Gradle plugin from 8.0.2 to 8.1.1.
8.0.2 to 8.1.1.BrazeInAppMessage.isTestSend property, which indicates whether an in-app message was triggered as part of a test send.AppboyWebViewActivity to extend FragmentActivity for better fragment management.
AppboyWebViewActivity now no longer performs session and in-app message registration on its own.AppboyLifecycleCallbackListener will see no effect.AppboyWebViewActivity to add back this registration and set the new Activity via AppboyConfig.Builder#setCustomWebViewActivityClass() or com_appboy_custom_html_webview_activity_class_name in the appboy.xml file.Adds the getDeviceId method to replace getInstallTrackingId, which is now deprecated.
getDeviceId method to replace getInstallTrackingId, which is now deprecated.IAppboyNotificationFactory.createNotification(BrazeNotificationPayload).
BrazeNotificationPayload is a data object that performs the task of extracting and surfacing values from the Braze push payload in a far more convenient way.IAppboyNotificationFactory will have no breaking changes.IAppboyNotificationFactory are recommended to switchover to their non-deprecated counterparts in AppboyNotificationUtils.java.com_appboy_inapp_show_inapp_messages_automatically boolean configuration for Unity.AppboyWebViewActivity for deeplinks via the prefers-color-scheme: dark css style.
com.appboy.IAppboyImageLoader.renderUrlIntoCardView() was null for Content Cards.com.appboy.push.AppboyNotificationUtils.handleContentCardsSerializedCardIfPresent().Deprecates setGoogleAdvertisingId(id, adTrackingEnabled) in favor of setAdTrackingEnabled(adTrackingEnabled, id).
2.15.0.subscribeToPushNotificationEvents(void Function(BrazePushEvent) onEvent). This allows you to run custom Dart code after a push is received or when a push is clicked.
replayCallbacksConfigKey to replay the push event callback for any notifications that were received prior to calling subscribeToPushNotificationEvents.updateTrackingPropertyAllowList(allowList) method to dynamically configure Braze tracking properties.setGoogleAdvertisingId(id, adTrackingEnabled) in favor of setAdTrackingEnabled(adTrackingEnabled, id).(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])
ClassCastException on certain devices and prevent display.com.appboy.support.AppboyImageUtils.getBitmap(android.net.Uri) in favor of com.appboy.support.AppboyImageUtils.getBitmap(android.content.Context, android.net.Uri, com.appboy.enums.AppboyViewBounds).com.appboy.AppboyAdmReceiver.CAMPAIGN_ID_KEY.
Constants.APPBOY_PUSH_CAMPAIGN_ID_KEY instead.com.appboy.push.AppboyNotificationUtils.isValidNotificationPriority().Updates the native iOS bridge from Braze Swift SDK 7.3.0 to 7.7.0.
BrazeDelegate in the iOS native layer, allowing for custom implementations to be assigned to the braze instance.
sdkAuthDelegate property for the SDK Authentication feature instead.Updates the native iOS bridge from Braze Swift SDK 7.2.0 to 7.3.0.
@null.AppboyFirebaseMessagingService to override the onNewToken() method to register a Firebase push token when automatic Firebase registration enabled.appboyBridge.getUser().addAlias() to the javascript interface for HTML In-App Messages.Appboy.getConfiguredApiKey() to aid in determining if the SDK has an API key properly configured.IAppboy.getCurrentUser() that adds an asynchronous callback for when the current user is available instead of blocking on the caller thread.
Appboy.getInstance(mContext).getCurrentUser(new IValueCallback<AppboyUser>() {
@Override
public void onSuccess(@NonNull AppboyUser currentUser) {
currentUser.setFirstName("Jared");
}
@Override
public void onError() {}
});
- A convenience class is also provided with `SimpleValueCallback`:
- ```java
Appboy.getInstance(mContext).getCurrentUser(new SimpleValueCallback<AppboyUser>() {
@Override
public void onSuccess(@NonNull AppboyUser currentUser) {
currentUser.setFirstName("Julian");
}
});
AppboyInAppMessageManager.setClickOutsideModalViewDismissInAppMessageView() allow for the dismissal of a Modal In-App Message when tapping on the frame behind the message itself.
AppboyInAppMessageManager.getInstance().setClickOutsideModalViewDismissInAppMessageView(true)com.appboy.ui.AppboyContentCardsFragment to not assign margin of the first card in the feed from the top of the feed.resolveActivity() in the default UriAction logic not returning a valid Activity to handle external deeplinks on Android 11 devices without the QUERY_ALL_PACKAGES permission.AppboyConfig.Builder.setNotificationsEnabledTrackingOn().AppboyImageUtils.getPixelsFromDp().ViewUtils.getDisplayHeight().Updates the native Android bridge from Braze Android SDK 27.0.1 to 29.0.1.
BrazePlugin.getFeatureFlagByID(String id) will now return null if the feature flag does not exist.BrazePlugin.subscribeToFeatureFlags(void Function(List<BrazeFeatureFlag>) onEvent)) will only trigger in the following situations:
compileSDKVersion for Android down to 33 to match Flutter's versioning.InAppMessageHtmlBase.getAssetsZipRemoteUrl(), InAppMessageHtmlBase.setAssetsZipRemoteUrl() to InAppMessageZippedAssetHtmlBase.java.AppboyInAppMessageHtmlFullView.APPBOY_BRIDGE_PREFIX to AppboyInAppMessageHtmlBaseView.APPBOY_BRIDGE_PREFIXIInAppMessage.getRemoteAssetPathForPrefetch to IInAppMessage.getRemoteAssetPathsForPrefetch and changed signature to List<String>.IInAppMessage.setLocalAssetPathForPrefetch to IInAppMessage.setLocalAssetPathsForPrefetch and changed signature to Map<String, String>.IInAppMessageWithImage for slideup, modal, and fulls to hold image based methods. These methods have been refactored out of the IInAppMessage interface.
getImageUrl(), getRemoteImageUrl(), getLocalImageUrl(), getBitmap(), getImageDownloadSuccessful(), setImageUrl(), setLocalImageUrl(), setImageDownloadSuccessful(), setRemoteImageUrl(), and setBitmap()./android-sdk-ui/src/main/res/drawable-nodpi/com_appboy_content_card_background.xml.@color/com_appboy_card_background_border is now @color/com_appboy_content_card_background_border for Content Cards.@color/com_appboy_card_background_shadow is now @color/com_appboy_content_card_background_shadow for Content Cards.@color/com_appboy_card_background is now @color/com_appboy_content_card_background for Content Cards.AppboyContentCardsFragment, @color/com_appboy_title is now @color/com_appboy_content_card_empty_text_color.@dimen/com_appboy_card_background_border_left is now @dimen/com_appboy_content_card_background_border_left.@dimen/com_appboy_card_background_border_right is now @dimen/com_appboy_content_card_background_border_right.@dimen/com_appboy_card_background_border_top is now @dimen/com_appboy_content_card_background_border_top.@dimen/com_appboy_card_background_border_bottom is now @dimen/com_appboy_content_card_background_border_bottom.@dimen/com_appboy_card_background_shadow_bottom is now @dimen/com_appboy_content_card_background_shadow_bottom.@dimen/com_appboy_card_background_corner_radius is now @dimen/com_appboy_content_card_background_corner_radius.@dimen/com_appboy_card_background_shadow_radius is now @dimen/com_appboy_content_card_background_shadow_radius.AppboyInAppMessageHtmlJavascriptInterface(Context) in favor of AppboyInAppMessageHtmlJavascriptInterface(Context, IInAppMessageHtml).IAppboy.logPushDeliveryEvent() and AppboyNotificationUtils.logPushDeliveryEvent().appboyBridge.logClick(String), appboyBridge.logClick() and appboyBridge.getUser().setLanguage() to the javascript interface for HTML In-App Messages.AppboyWebViewActivity for deeplinks via the prefers-color-scheme: dark css style.
android-sdk-ui/src/main/res/values-night/colors.xml and android-sdk-ui/src/main/res/values-night/dimens.xml.IAppboy.subscribeToSessionUpdates() which allows for the host app to be notified when a session is started or ended.AppboyConfig.Builder.setCustomLocationProviderNames() for more information.
LocationManager.GPS_PROVIDER and LocationManager.NETWORK_PROVIDER. new AppboyConfig.Builder()
.setCustomLocationProviderNames(EnumSet.of(LocationProviderName.GPS, LocationProviderName.NETWORK));
<string-array translatable="false" name="com_appboy_custom_location_providers_list">
<item>GPS</item>
<item>NETWORK</item>
</string-array>
com.appboy.ui.AppboyContentCardsFragment to not double the margin of the first card in the feed from the top of the feed.wipeData() or disableSdk() could result in not being able to set runtime configuration afterwards.com.appboy.models.IInAppMessageWithImage#setImageUrl() in favor of com.appboy.models.IInAppMessageWithImage#setRemoteImageUrl(String).Deprecates BrazePlugin.registerAndroidPushToken() in favor of this new method.
BrazePlugin.logFeatureFlagImpression(String id) to log a Feature Flag impression.BrazeUser.setNestedCustomUserAttribute()BrazeUser.setCustomUserAttributeArrayOfObjects()BrazeUser.setNestedCustomUserAttribute(string, Map<string, dynamic>, true)BrazeUser.setCustomUserAttributeArrayOfStrings() to set arrays of strings as a custom attribute.BrazePlugin.getCachedContentCards() to get the most recent content cards from the cache.BrazePlugin.registerPushToken() to send a push token to Braze's servers.
BrazePlugin.registerAndroidPushToken() in favor of this new method.Appboy.ContentCards.BannerImage.ImageContainer.Image to Appboy.ContentCards.BannerImage.Image.com.appboy.ui.contentcards.view.ContentCardViewHolder.createCardImageWithStyle().android-sdk-base-jetified and android-sdk-ui-jetified to reference jetified SDK AAR artifacts from the artifact repository.
android-sdk-ui-x and is a more complete integration path for using the Braze SDK with AndroidX.dependencies {
implementation "com.appboy:android-sdk-ui-jetified:${BRAZE_SDK_VERSION}"
}
android-sdk-ui-x module, you must replace any imports under the com.appboy.uix.push package to be under com.appboy.ui.push.android.enableJetifier=true and android.useAndroidX=true are no longer required when using androidX libraries with the Braze SDK.-keepnames class android.support.design.button.MaterialButton
-keepnames class com.google.android.material.button.MaterialButton
AppboyCardAdapter where a card index could be out of bounds when marking a card as seen.com_appboy_in_app_message_push_test_eager_display_enabled in your appboy.xml, or at runtime by setting AppboyConfig.setInAppMessageTestPushEagerDisplayEnabled() to false.UriAction to be more easily customizable.android-sdk-ui-x module. See the Added section for more information.Updates the native Android bridge from Braze Android SDK 26.1.0 to 26.1.1.
Updates the native Android bridge from Braze Android SDK 25.0.0 to 26.1.0.
BrazeContentCard.imageAspectRatio would always return 1 for whole-number int values.
imageAspectRatio is now a num type instead of a double type. No changes are required.BrazePlugin.getFeatureFlagByID(String id) - Get a single Feature FlagBrazePlugin.getAllFeatureFlags() - Get all Feature FlagsBrazePlugin.refreshFeatureFlags() - Request a refresh of Feature FlagsBrazePlugin.subscribeToFeatureFlags(void Function(List<BrazeFeatureFlag>) onEvent)) - Subscribe to Feature Flag updatesfeatureFlag.getBooleanProperty(String key)featureFlag.getNumberProperty(String key)featureFlag.getStringProperty(String key)IInAppMessageViewFactory default implementations.
ViewUtils.setFocusableInTouchModeAndRequestFocus().AppboyUnityPlayerNativeActivity, AppboyOverlayActivity, AppboyUnityNativeInAppMessageManagerListener, AppboyUnityPlayerNativeActivity, AppboyUnityPlayerNativeActivity, and IAppboyUnityInAppMessageListener have been removed from the android-sdk-unity project.
UnityPlayerNativeActivity was deprecated in 2015. See https://unity3d.com/unity/beta/unity5.4.0b1.@dimen/com_appboy_in_app_message_button_corner_radius.@dimen/com_appboy_in_app_message_button_border_stroke.
@dimen/com_appboy_in_app_message_button_border_stroke_focused.Activity#getCurrentFocus().The native Android bridge uses Braze Android SDK 25.0.0.
BrazeInAppMessageUIDelegate method inAppMessage(_:willPresent:view:) with a custom implementation of BrazeInAppMessagePresenter or a BrazeInAppMessageUI subclass. This is relevant if you are caching asset URLs outside of the Braze SDK.IInAppMessageView.hasAppliedWindowInsets().appboyBridge.logClick() and appboyBridge.getUser().setLanguage() to the javascript interface for HTML In-App Messages.Appboy.requestGeofences() to request a Braze Geofences update for a manually provided GPS coordinate. Automatic Braze Geofence requests must be disabled to properly use this method.
com_appboy_automatic_geofence_requests_enabled in your appboy.xml.AppboyConfig.setAutomaticGeofenceRequestEnabled().ViewCompat.setOnApplyWindowInsetsListener() could result in in-app messages margins getting applied multiple times instead of exactly once.#ffffffff in a dark theme in-app message would not be used when the device was in dark mode.
Fixes an issue in 4.0.0 where the version in braze_plugin.podspec was not incremented correctly.
4.0.0 where the version in braze_plugin.podspec was not incremented correctly.> Starting with this release, this SDK will use Semantic Versioning.
Starting with this release, this SDK will use Semantic Versioning.
3.0.0 when logging clicks for in-app messages and content cards. Calling logClick now only sends a click event for metrics, instead of both sending a click event as well as redirecting to the associated url field.
braze.logContentCardClicked(contentCard);
// Your own custom implementation
Linking.openUrl(contentCard.url);
2.x and bring parity with Android's behavior.setBrazeInAppMessageCallback() and setBrazeContentCardsCallback() in favor of subscribing via streams.
subscribeToInAppMessages() or subscribeToContentCards().replayCallbacksConfigKey alongside having subscriptions to in-app messages or content cards via streams."Appboy.ContentCards" style containing the "clickable=true" style. This is fixed in SDK version 4.0.2.beforeInAppMessageViewOpened(), afterInAppMessageViewOpened(), beforeInAppMessageViewClosed(), afterInAppMessageViewClosed() to the IInAppMessageManagerListener interface.
Card.getIsDismissible() to Card.getIsDismissibleByUser().com_appboy_in_app_message_push_test_eager_display_enabled in your appboy.xml. The default value is false.AppboyConfig.setInAppMessageTestPushEagerDisplayEnabled() to true. The default value is false.IInAppMessageViewWrapperFactory.
AppboyInAppMessageManager.setCustomInAppMessageViewWrapperFactory().DefaultInAppMessageViewWrapper and overriding getParentViewGroup(), getLayoutParams(), and addInAppMessageViewToViewGroup().Card.setIsDismissibleByUser() to allow for integrators to disable the default swipe-to-dismiss behavior on a per-card basis.AppboyLogger log level via appboy.xml.
appboy.xml, set an integer value for com_appboy_logger_initial_log_level. The integer should correspond to a constant in Log, such as Log.VERBOSE which is 2.AppboyLogger.setLogLevel() take precedence over values set in appboy.xml.AppboyWebViewActivity.
com_appboy_custom_html_webview_activity_class_name in your appboy.xml. Note that the class name used appboy.xml must be the exact class name string as returned from YourClass.class.getName().AppboyConfig.setCustomWebViewActivityClass().final Bundle extras = getIntent().getExtras();
if (extras.containsKey(Constants.APPBOY_WEBVIEW_URL_EXTRA)) {
String url = extras.getString(Constants.APPBOY_WEBVIEW_URL_EXTRA);
}
selectable and focusable attributes set to true.AppboyInAppMessageHtmlUserJavascriptInterface.setCustomAttribute() in the HTML javascript bridge to not coerce Double into Float.@dimens/com_appboy_content_cards_max_width now accurately sets the maximum possible width of a Content Card.@dimens/com_appboy_content_cards_divider_left_margin and @dimens/com_appboy_content_cards_divider_right_margin are now used to provide a margin for Content Cards when the width of the Content Card does not exceed the max width of @dimens/com_appboy_content_cards_max_width.InAppMessageImmersiveBase.getMessageButtons() is now guaranteed to be non-null. When buttons are not set on the message, this list will be non-null and empty.
InAppMessageImmersiveBase.setMessageButtons() with null will instead clear the MessageButton listandroid-sdk-ui consumer proguard rules to keep javascript interface methods.setDomStorageEnabled(true).TextView's visibility is changed to GONE in the view hierarchy.Constants.APPBOY_WEBVIEW_URL_KEY.The native Android bridge uses Braze Android SDK 24.2.0.
AppboyNotificationUtils.wakeScreenIfHasPermission() to AppboyNotificationUtils.wakeScreenIfAppropriate(). Wakelocks can now be configured to not wake the device screen for push notifications.
AppboyConfig.setIsPushWakeScreenForNotificationEnabled() and also com_appboy_push_wake_screen_for_notification_enabled in your appboy.xml.AppboyContentCardsActivity class has been added which can be used to display Braze Content Cards. <script type="text/javascript">
function logMyCustomEvent() {
appboyBridge.logCustomEvent('My Custom Event');
}
window.addEventListener('ab.BridgeReady', logMyCustomEvent, false);
</script>
Constants.TRAFFIC_STATS_THREAD_TAG to identify the Braze network traffic with the TrafficStats API.AppboyLifecycleCallbackListener.setActivityClassInAppMessagingRegistrationBlacklist(), AppboyLifecycleCallbackListener.setActivityClassSessionHandlingBlacklist(), and constructor AppboyLifecycleCallbackListener(boolean, boolean, Set<Class>, Set<Class>).AppboyNotificationUtils.isUninstallTrackingPush() method. Note that uninstall tracking notifications will not be forwarded to registered receivers.Updates the braze_plugin.podspec file to statically link the iOS framework by default. This prevents the need to do a manual step when migrating to 3.
braze_plugin.podspec file to statically link the iOS framework by default. This prevents the need to do a manual step when migrating to 3.x.x.2.2.0 where the content cards callback was not being called when receiving an empty list of content cards.Card.isRead() and Card.setIsRead(). Please use Card.isIndicatorHighlighted() and Card.setIndicatorHighlighted() instead.Card.isClicked(). Clicks made through Card.logClick() are now saved locally on the device for Content Cards.AppboyConfig.setIsInAppMessageAccessibilityExclusiveModeEnabled() which forces accessibility readers to only be able to read currently displaying in-app messages and no other screen contents.
com_appboy_device_in_app_message_accessibility_exclusive_mode_enabled in your appboy.xml.The native iOS bridge now uses the new Braze Swift SDK, version 5.6.4.
configuration object. Then, add this code to complete the setup:let braze = BrazePlugin.initBraze(configuration)
changeUser method on the Braze instance for non-anonymous users. You can read more about it here.SDWebImage as a dependency, add this line to your project's /ios/Podfile:pod 'SDWebImage', :modular_headers => true
AppDelegate.swift.isControl field to BrazeContentCard.subscribeToInAppMessages() and subscribeToContentCards().AppboyConfig, removed getEnableBackgroundLocationCollection(), getLocationUpdateTimeIntervalSeconds(), and getLocationUpdateDistance() and their respective setters in AppboyConfig.Builder.AppboyInAppMessageImmersiveBaseView.getMessageButtonsView().IAppboy#setAppboyImageLoader(IAppboyImageLoader).
AppboyConfig.Builder.setFrescoLibraryEnabled() has been removed.AppboyConfigurationProvider.getIsFrescoLibraryUseEnabled() has been removed.AppboyContentCardsFragment.com.appboy.push package. These classes are commonly used in conjunction with an IAppboyNotificationFactory. To use these compatible classes, add the following gradle import: implementation 'com.appboy:android-sdk-ui-x:VERSION' and replace your imports to fall under the com.appboy.uix.push package.android.enableJetifier=true and android.useAndroidX=true are required when using androidX libraries with the Braze SDK.Appboy and AppboyUser for better Kotlin interoperability.AppboyConfig.Builder.setDeviceObjectWhitelistEnabled() and AppboyConfig.Builder.setDeviceObjectWhitelist() for more information.
new AppboyConfig.Builder()
.setDeviceObjectWhitelistEnabled(true)
.setDeviceObjectWhitelist(EnumSet.of(DeviceKey.ANDROID_VERSION, DeviceKey.LOCALE));
Adds support to replay the onEvent method for queued in-app messages and content cards when subscribing via streams.
onEvent method for queued in-app messages and content cards when subscribing via streams.
replayCallbacksConfigKey: true in customConfigs for the BrazePlugin.subscribeToInAppMessages() and subscribeToContentCards() to accept a Function instead of a void.Deprecates setBrazeInAppMessageCallback() and setBrazeContentCardsCallback() in favor of subscribing via streams.
process(inAppMessage) is renamed to processInAppMessage(inAppMessage) in the iOS layer.subscribeToInAppMessages() and subscribeToContentCards(), respectively.BrazePlugin.h and BrazePlugin.m are now consolidated to BrazePlugin.swift.setBrazeInAppMessageCallback() and setBrazeContentCardsCallback() in favor of subscribing via streams.AppboyUser.setLocationCustomAttribute() and AppboyUser.unsetLocationCustomAttribute().The native Android bridge uses Braze Android SDK 21.0.0.
logContentCardsDisplayed(). This method was not part of the recommended Content Cards integration and can be safely removed.setBrazeSdkAuthenticationErrorCallback(), and use setSdkAuthenticationSignature() to update the signature. When calling changeUser(), be sure to pass in the sdkAuthSignature parameter.setLastKnownLocation() to set the last known location for the user.isControl() to the IInAppMessage interface.logDisplayFailure() to the IInAppMessage interface. In-app message display failures may affect campaign statistics so care should be taken when logging display failures.InAppMessageControl class to represent control in-app messages. Control in-app messages should not be displayed to users and should only call logImpression() at render time.
AppboyInAppMessageManager.setCustomControlInAppMessageManagerListener() to modify the lifecycle behavior for control in-app messages.logInAppMessageClick, logInAppMessageButtonClick, and logInAppMessageImpression from Appboy Unity player subclasses and AppboyUnityActivityWrapper.AppboyConfigurationProvider.getIsUilImageCacheDisabled() and AppboyConfig.Builder.setDisableUilImageCache().Appboy.wipeData() or Appboy.disableSdk() could potentially lead to null instances being returned from Appboy.getInstance().The native Android bridge uses Braze Android SDK 20.0.0.
setAvatarImageUrl().Appboy.wipeData() would throw an uncaught exception when the Google Play location services library was not present.AppboyGcmReceiver via the action suffix AppboyNotificationUtils.APPBOY_NOTIFICATION_DELETED_SUFFIX.AppboyGcmReceiver. This allows for calculating the duration of a notification. Intents will contain Constants.APPBOY_PUSH_RECEIVED_TIMESTAMP_MILLIS in the intent extras bundle.AppboyNotificationUtils.isUninstallTrackingPush() to always return false. Uninstall tracking no longer requires sending a silent push notification to devices.The native Android bridge uses Braze Android SDK 17.0.0.
braze.xml configuration:<string name="com_braze_flutter_automatic_integration_iam_operation">DISCARD</string>
DISPLAY_NOW or DISCARD. If this entry is ommitted, the default is DISPLAY_NOW.Appboy.wipeData() will throw an uncaught exception.appboyInAppMessageCustomFontFile custom xml attribute. Custom font typefaces must now be located in the res/font directory.
android:fontFamily and fontFamily style attributes must be set to maintain compatibility across all SDK versions. Example below:<item name="android:fontFamily">@font/YOUR_CUSTOM_FONT_FAMILY</item>
<item name="fontFamily">@font/YOUR_CUSTOM_FONT_FAMILY</item>
AppboyInAppMessageButtonView.java and AppboyInAppMessageTextView.java.AppboyGeofenceService. Geofence integration no longer requires a manifest registration. Any reference to AppboyGeofenceService can safely be removed from your manifest.AppboyUnityPlayerNativeActivityWrapper to AppboyUnityActivityWrapper.com_appboy_firebase_cloud_messaging_registration_enabled boolean attribute in XML or via AppboyConfig.Builder.setIsFirebaseCloudMessagingRegistrationEnabled().com_appboy_firebase_cloud_messaging_sender_id string attribute in XML or via AppboyConfig.Builder.setFirebaseCloudMessagingSenderIdKey().The native Android bridge uses Braze Android SDK 16.0.0.
registerActivityLifecycleCallbacks(), subscribeToContentCardsUpdates(), and setCustomInAppMessageManagerListener().com_braze_flutter_enable_automatic_integration_initializer to false in your braze.xml configuration.BrazePlugin.customConfigs map in the BrazePlugin constructor:replayCallbacksConfigKey : true
BrazePlugin.addToSubscriptionGroup() and BrazePlugin.removeFromSubscriptionGroup() to manage SMS/Email Subscription Groups.Appboy.requestInAppMessageRefresh() and removed support for Original in-app messages. Note that all customers on version 2.2.0 and newer should use triggered in-app messages.IAppboy interface. Methods that logged values now return void instead of boolean.
IAppboy.openSession() now returns void.IAppboy.closeSession now returns void.IAppboy.changeUser() now returns void. To get the current user, please call IAppboy.getCurrentUser().IAppboy.logCustomEvent() and all method overloads now return void.IAppboy.logPurchase() and all method overloads now return void.IAppboy.submitFeedback() now returns void.IAppboy.logPushNotificationOpened() now returns void.IAppboy.logPushNotificationActionClicked() now returns void.IAppboy.logFeedDisplayed() now returns void.IAppboy.logFeedbackDisplayed() now returns void.AppboyFeedbackFragment.FeedbackResult.ERROR.AppboyFeedbackFragment.FeedbackFinishedListener to AppboyFeedbackFragment.IFeedbackFinishedListener.AppboyFeedbackFragment.FeedbackResult.SENT to AppboyFeedbackFragment.FeedbackResult.SUBMITTED.Appboy.fetchAndRenderImage(). Please use getAppboyImageLoader().renderUrlIntoView() instead.AppboyFileUtils.getExternalStorage().DecoratedCustomViewStyle to display multiple images in a single notification. We recommend posting push stories to a notification channel with vibration disabled to avoid repeated vibrations as the user navigates through the story.Appboy singleton.The native iOS bridge uses Braze iOS SDK 4.3.2.
logContentCardsDisplayed() to manually log an impression when displaying Content Cards in a custom UI.AppboyLifecycleCallbackListener instance using Application.registerActivityLifecycleCallbacks().AppboyLogger.LogLevel. Please use AppboyLogger.setLogLevel() and AppboyLogger.getLogLevel() instead.build.gradle repositories block:maven {
url "https://maven.google.com"
}
AppboyConfig.setDefaultNotificationChannelName().AppboyConfig.setDefaultNotificationChannelDescription().logEventWithProperties and logPurchaseWithProperties are now deprecated in favor of logEvent and logPurchase.
null as a value for user attributes is no longer supported.
email by passing in null into setEmail.logEvent and logPurchase now take an optional properties parameter.2.12.0.logEventWithProperties and logPurchaseWithProperties are now deprecated in favor of logEvent and logPurchase.Appboy.logShare().Appboy.logPurchase(String, int).Appboy.logFeedCardImpression() and Appboy.logFeedCardClick(). Please use Card.logClick() and Card.logImpression() instead.Appboy.getAppboyResourceEndpoint().IAppboyEndpointProvider.getResourceEndpoint(). Please update your interface implementation if applicable.Appboy.registerAppboyGcmMessages(). Please use Appboy.registerAppboyPushMessages() instead.AppboyInAppMessageBaseView.resetMessageMargins(). Please use AppboyInAppMessageBaseView.resetMessageMargins(boolean) instead.com.appboy.unity.AppboyUnityGcmReceiver. To open Braze push deep links automatically in Unity, set the boolean configuration parameter com_appboy_inapp_show_inapp_messages_automatically to true in your appboy.xml.AppboyUser.setBio().AppboyUser.setIsSubscribedToEmails(). Please use AppboyUser.setEmailNotificationSubscriptionType() instead.Constants.APPBOY_PUSH_CUSTOM_URI_KEY. Please use Constants.APPBOY_PUSH_DEEP_LINK_KEY instead.Constants.APPBOY_CANCEL_NOTIFICATION_TAG.com.appboy.ui.actions.ViewAction and com.appboy.ui.actions.WebAction.CardCategory.ALL_CATEGORIES. Please use CardCategory.getAllCategories() instead.AppboyImageUtils.storePushBitmapInExternalStorage().AppboyFileUtils.canStoreAssetsLocally() and AppboyFileUtils.getApplicationCacheDir().InAppMessageModal.getModalFrameColor() and InAppMessageModal.setModalFrameColor(). Please use InAppMessageModal.getFrameColor() and InAppMessageModal.setFrameColor() instead.com.appboy.enums.SocialNetwork.AppboyNotificationUtils.getAppboyExtras(). Please use AppboyNotificationUtils.getAppboyExtrasWithoutPreprocessing() instead.AppboyNotificationUtils.setLargeIconIfPresentAndSupported(Context, AppboyConfigurationProvider, NotificationCompat.Builder). Please use AppboyNotificationUtils.setLargeIconIfPresentAndSupported(Context, AppboyConfigurationProvider, NotificationCompat.Builder, Bundle) instead.AppboyInAppMessageManager.hideCurrentInAppMessage(). Please use AppboyInAppMessageManager.hideCurrentlyDisplayingInAppMessage() instead.gotoNewsFeed() and gotoURI() in IAppboyNavigator. Please update your interface implementation if applicable.Appboy.unregisterAppboyPushMessages(). Please use AppboyUser.setPushNotificationSubscriptionType() instead.getAppboyNavigator() and setAppboyNavigator() from Appboy.java to AppboyNavigator.java.channelId as the push token. Please update your push token registration code to pass channelId instead of userId into Appboy.registerAppboyPushMessages(). The China Push sample has been updated.wearboy and wear-library modules. Android Wear 1.0 is no longer supported. Please remove AppboyWearableListenerService from your AndroidManifest.xml if applicable.IAppboyNavigator interface and be set using AppboyNavigator.setAppboyNavigator().
AppboyNavigator.executeNewsFeedAction(context, uriAction);.AppboyNavigator was only used when opening in-app messages.AppboyFeedActivity and AppboyWebViewActivity) to the app AndroidManifest.xml. If you have these declarations in your manifest, they can be safely removed.The native iOS bridge uses Braze iOS SDK 4.0.2.
logFeedCardImpression() and logFeedCardClick() methods to the card objects themselves.AppboyGcmReceiver in the UI project. When the WAKE_LOCK permission is set, the screen will be turned on when a notification is received.AppboyGcmReceiver (ie: APPBOY_GCM_NOTIFICATION_TITLE_ID, etc.) into new AppboyNotificationUtils class.Appboy.logPurchase().The native Android bridge uses Braze Android SDK 13.0.0.
BrazePlugin.setGoogleAdvertisingId() to set the Google Advertising ID and the associated Ad-Tracking Enabled field for Android. This is a no-op on iOS.Appboy.setLogLevel() method wasn't respected.appboy xml.None.The native Android bridge uses Braze Android SDK 12.0.0.
The native iOS bridge uses Braze iOS SDK 3.30.0.
The native Android bridge uses Braze Android SDK 11.0.0.
The native iOS bridge uses Braze iOS SDK 3.27.0. This release adds support for iOS 14 and requires XCode 12. Please read the Braze iOS SDK changelog f
The native iOS bridge uses Braze iOS SDK 3.26.1.
The native Android bridge uses Braze Android SDK 8.1.0.
setBoolCustomUserAttribute always set the attribute to true on iOS.The native Android bridge uses Braze Android SDK 7.0.0.
The native iOS bridge uses Braze iOS SDK 3.21.3.
IInAppMessageManagerListener, then you will need to define new methods added to that interface in Braze Android SDK 4.0.0. See the MainActivity.kt file of our sample app for a reference example.Added BrazePlugin.launchContentCards() and BrazePlugin.refreshContentCards() to natively display and refresh Content Cards.
BrazePlugin.launchContentCards() and BrazePlugin.refreshContentCards() to natively display and refresh Content Cards.List<BrazeContentCard> instance.BrazePlugin.setBrazeContentCardsCallback() from your Flutter app with a function that takes a List<BrazeContentCard> instance.
BrazeContentCard object supports a subset of fields available in the native model objects, including description, title, image, url, extras, and more.IEventSubscriber<ContentCardsUpdatedEvent> instance and pass returned Content Card objects to the Dart layer using BrazePlugin.processContentCards(contentCards).
MainActivity.kt file of our sample app for a reference example.NSNotificationCenter listener for ABKContentCardsProcessedNotification events and pass returned Content Card objects to the Dart layer using BrazePlugin.processContentCards(contentCards).
AppDelegate.swift file of our sample app for a reference example.BrazeContentCard instances. See logContentCardClicked(), logContentCardImpression(), and logContentCardDismissed() on the BrazePlugin interface.Fixed an issue where the Braze Kotlin plugin file's directory structure did not match its package structure.
The native Android bridge uses Braze Android SDK 3.8.0.
Important: This patch updates the Braze iOS SDK Dependency from 3.20.1 to 3.20.2, which contains important bugfixes. Integrators should upgrade to thi
Important: This patch updates the Braze iOS SDK Dependency from 3.20.1 to 3.20.2, which contains important bugfixes. Integrators should upgrade to this patch version. Please see the Braze iOS SDK Changelog for more information.
Your coding agent can read these notes before it upgrades. Set up the MCP server →