- Updates the native iOS bridge from Braze Swift SDK 10.3.1 to 11.3.0.
- Updates the native Android bridge from Braze Android SDK 32.1.0 to 33.1.0.
- 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.
- Changes the behavior of
wipeData()
on Android to retain external subscriptions (likesubscribeToContentCards()
) after being called.
- Changes the behavior of
- Updates the native iOS bridge from Braze Swift SDK 9.0.0 to 10.2.0.
- Adds support for 3 new Feature Flag property types:
featureFlag.getTimestampProperty(String key)
for accessing Int Unix UTC millisecond timestamps asint?
s.featureFlag.getJSONProperty(String key)
for accessing JSON objects asMap<String, dynamic>?
types.featureFlag.getImageProperty(String key)
for accessing image URLs asString?
s.
- Adds the
getUserId()
method to get the ID of the current user. This method will returnnull
if the current user is anonymous. - Adds the
hideCurrentInAppMessage()
method, which dismisses the currently displayed in-app message.
- Fixes an issue on Android where push notification stream subscriptions were not receiving events after clicking on a push notification when the app was in a terminated state.
- Thank you @Neelansh-ns for the contribution!
- Updated the Android Gradle plugin from
8.0.2
to8.1.1
. - Updated the native Android bridge from Braze Android SDK 30.3.0 to 30.4.0.
- Adds the
BrazeInAppMessage.isTestSend
property, which indicates whether an in-app message was triggered as part of a test send.
- Updates the native iOS bridge from Braze Swift SDK 8.4.0 to 9.0.0.
- Adds the
getDeviceId
method to replacegetInstallTrackingId
, which is now deprecated.
- Fixes an issue where StrictMode DiskReadViolation was triggered on Android.
- Thanks @radivojeostojic for pointing this out.
- Updates the native iOS bridge from Braze Swift SDK 7.7.0 to 8.4.0.
- The minimum iOS deployment target has been updated to 12.0.
- The minimum supported Xcode version is 15.2.
- Updates the native Android bridge from Braze Android SDK 29.0.1 to 30.3.0.
- The minimum supported Dart version is
2.15.0
. - The minimum supported Swift Language Version is Swift 5.
- Push notification payloads are now accessible in the Dart layer by calling
subscribeToPushNotificationEvents(void Function(BrazePushEvent) onEvent)
. This allows you to run custom Dart code after a push is received or when a push is clicked.- On iOS, this callback can only be triggered for push click events.
- Reference our Flutter Push Notification documentation with details on how to utilize this feature.
- This feature is compatible with the
replayCallbacksConfigKey
to replay the push event callback for any notifications that were received prior to callingsubscribeToPushNotificationEvents
. - Due to an issue in the Flutter framework, this feature is not compatible with subscribing to iOS silent push notifications.
- Adds support for Braze tracking properties.
- Adds the
updateTrackingPropertyAllowList(allowList)
method to dynamically configure Braze tracking properties. - For further usage details, refer to the Swift privacy manifest documentation.
- Adds the
- Deprecates
setGoogleAdvertisingId(id, adTrackingEnabled)
in favor ofsetAdTrackingEnabled(adTrackingEnabled, id)
.
- Updates the native iOS bridge from Braze Swift SDK 7.3.0 to 7.7.0.
- Adds example integrations for Braze Rich Push Notifications and Braze Push Stories to the iOS sample app.
- Removes the automatic assignment of
BrazeDelegate
in the iOS native layer, allowing for custom implementations to be assigned to thebraze
instance.- The plugin now uses the
sdkAuthDelegate
property for the SDK Authentication feature instead.
- The plugin now uses the
- Updates the native iOS bridge from Braze Swift SDK 7.2.0 to 7.3.0.
- Updates the native Android bridge from Braze Android SDK 27.0.1 to 29.0.1.
- Updates the native iOS bridge from Braze Swift SDK 6.6.1 to 7.2.0.
- Modifies the behavior for Feature Flags methods.
BrazePlugin.getFeatureFlagByID(String id)
will now returnnull
if the feature flag does not exist.BrazePlugin.subscribeToFeatureFlags(void Function(List<BrazeFeatureFlag>) onEvent))
will only trigger in the following situations:- When a refresh request completes with success or failure.
- Upon initial subscription if there was previously cached data from the current session.
- The minimum supported Android SDK version is 21.
- Moved the
compileSDKVersion
for Android down to 33 to match Flutter's versioning.
- Updates the native Android bridge from Braze Android SDK 26.1.1 to 27.0.1.
- Adds support for Gradle 8.
- Updates the native iOS bridge from Braze Swift SDK 6.3.0 to 6.6.1.
- Adds
BrazePlugin.logFeatureFlagImpression(String id)
to log a Feature Flag impression. - Adds support for custom user attributes to be nested objects.
BrazeUser.setNestedCustomUserAttribute()
BrazeUser.setCustomUserAttributeArrayOfObjects()
- You can specify that the Dictionary be merged with the existing value.
BrazeUser.setNestedCustomUserAttribute(string, Map<string, dynamic>, true)
- See https://www.braze.com/docs/user_guide/data_and_analytics/custom_data/custom_attributes/nested_custom_attribute_support/ for more information.
- Adds
BrazeUser.setCustomUserAttributeArrayOfStrings()
to set arrays of strings as a custom attribute. - Adds
BrazePlugin.getCachedContentCards()
to get the most recent content cards from the cache. - Adds
BrazePlugin.registerPushToken()
to send a push token to Braze's servers.- Deprecates
BrazePlugin.registerAndroidPushToken()
in favor of this new method.
- Deprecates
- Adds an example integration of iOS push notifications as well as custom scheme deep links, universal links (iOS), and app links (Android) to the Flutter sample app.
- 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.
- Fixes an issue where
BrazeContentCard.imageAspectRatio
would always return1
for whole-numberint
values.- The field
imageAspectRatio
is now anum
type instead of adouble
type. No changes are required.
- The field
- Added support for Braze Feature Flags.
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 updates- Feature Flag property getter methods for the following types:
- Boolean:
featureFlag.getBooleanProperty(String key)
- Number:
featureFlag.getNumberProperty(String key)
- String:
featureFlag.getStringProperty(String key)
- Boolean:
- Updates the native iOS bridge from Braze iOS SDK 6.0.0 to 6.3.0.
- The native Android bridge uses Braze Android SDK 25.0.0.
- The native iOS bridge uses Braze iOS SDK 6.0.0.
- If you wish to access remote URLs for in-app messages instead of local URLs, replace your implementation of the
BrazeInAppMessageUIDelegate
methodinAppMessage(_:willPresent:view:)
with a custom implementation ofBrazeInAppMessagePresenter
or aBrazeInAppMessageUI
subclass. This is relevant if you are caching asset URLs outside of the Braze SDK. - For reference, see our sample code here.
- If you wish to access remote URLs for in-app messages instead of local URLs, replace your implementation of the
- Fixes an issue in
4.0.0
where the version inbraze_plugin.podspec
was not incremented correctly.
- The native iOS bridge uses Braze iOS SDK 5.12.0.
Starting with this release, this SDK will use Semantic Versioning.
- Fixes the behavior in the iOS bridge introduced in version
3.0.0
when logging clicks for in-app messages and content cards. CallinglogClick
now only sends a click event for metrics, instead of both sending a click event as well as redirecting to the associatedurl
field.- For instance, to log a content card click and redirect to a URL, you will need two commands:
braze.logContentCardClicked(contentCard); // Your own custom implementation Linking.openUrl(contentCard.url);
- This brings the iOS behavior to match version
2.x
and bring parity with Android's behavior.
- Removes
setBrazeInAppMessageCallback()
andsetBrazeContentCardsCallback()
in favor of subscribing via streams.- Reference our sample app for an example on how to use
subscribeToInAppMessages()
orsubscribeToContentCards()
.
- Reference our sample app for an example on how to use
- The native Android bridge uses Braze Android SDK 24.3.0.
- The native iOS bridge uses Braze iOS SDK 5.11.2.
- Improves behavior when using
replayCallbacksConfigKey
alongside having subscriptions to in-app messages or content cards via streams.
- The native Android bridge uses Braze Android SDK 24.2.0.
- The native iOS bridge uses Braze iOS SDK 5.9.0.
- The minimum iOS deployment target is 11.0.
- 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 to3.x.x
. - Fixes an issue introduced in version
2.2.0
where the content cards callback was not being called when receiving an empty list of content cards.
- The native iOS bridge now uses the new Braze Swift SDK, version 5.6.4.
- The minimum iOS deployment target is 10.0.
- During migration, update your project with the following changes:
- To initialize Braze, follow these integration steps to create a
configuration
object. Then, add this code to complete the setup:let braze = BrazePlugin.initBraze(configuration)
- This migration requires re-identifying users. To do so, you must call the
changeUser
method on the Braze instance for non-anonymous users. You can read more about it here. - To continue using
SDWebImage
as a dependency, add this line to your project's/ios/Podfile
:pod 'SDWebImage', :modular_headers => true
- Then, follow these setup instructions.
- For guidance around other changes such as receiving in-app message and content card data, reference our sample
AppDelegate.swift
.
- To initialize Braze, follow these integration steps to create a
- Adds the
isControl
field toBrazeContentCard
.
- Updates the parameter syntax for
subscribeToInAppMessages()
andsubscribeToContentCards()
.
- Adds support to replay the
onEvent
method for queued in-app messages and content cards when subscribing via streams.- This feature must be enabled by setting
replayCallbacksConfigKey: true
incustomConfigs
for theBrazePlugin
.
- This feature must be enabled by setting
- The native Android bridge uses Braze Android SDK 23.3.0.
- Updates the parameter type for
subscribeToInAppMessages()
andsubscribeToContentCards()
to accept aFunction
instead of avoid
.
- The native Android bridge uses Braze Android SDK 23.2.0.
- The native iOS bridge uses Braze iOS SDK 4.5.1.
process(inAppMessage)
is renamed toprocessInAppMessage(inAppMessage)
in the iOS layer.
- Adds the ability to subscribe to data for in-app messages and content cards via streams.
- Use the methods
subscribeToInAppMessages()
andsubscribeToContentCards()
, respectively.
- Use the methods
- Updates the iOS layer to use Swift.
BrazePlugin.h
andBrazePlugin.m
are now consolidated toBrazePlugin.swift
. - Deprecates
setBrazeInAppMessageCallback()
andsetBrazeContentCardsCallback()
in favor of subscribing via streams.
- The native Android bridge uses Braze Android SDK 21.0.0.
- Removes
logContentCardsDisplayed()
. This method was not part of the recommended Content Cards integration and can be safely removed.
- Adds support for the SDK Authentication feature.
- To handle authentication errors, use
setBrazeSdkAuthenticationErrorCallback()
, and usesetSdkAuthenticationSignature()
to update the signature. When callingchangeUser()
, be sure to pass in thesdkAuthSignature
parameter. - Thanks @spaluchiewicz for contributing to this feature!
- To handle authentication errors, use
- Adds
setLastKnownLocation()
to set the last known location for the user.
- The native Android bridge uses Braze Android SDK 20.0.0.
- Removes
setAvatarImageUrl()
.
- The native iOS bridge uses Braze iOS SDK 4.4.3.
- The native Android bridge uses Braze Android SDK 17.0.0.
- The minimum supported Android SDK version is 19.
- Removes support for Android V1 Embedding APIs. Please reference the Flutter migration guide to update to the V2 APIs.
- Custom events and purchases now support nested properties.
- In addition to integers, floats, booleans, dates, or strings, a JSON object can be provided containing dictionaries of arrays or nested dictionaries. All properties combined can be up to 50 KB in total length.
- Adds the ability to restrict the Android automatic integration from natively displaying in-app messages.
- To enable this feature, add this to your
braze.xml
configuration:
<string name="com_braze_flutter_automatic_integration_iam_operation">DISCARD</string>
- The available options are
DISPLAY_NOW
orDISCARD
. If this entry is ommitted, the default isDISPLAY_NOW
.
- To enable this feature, add this to your
- The native iOS bridge uses Braze iOS SDK 4.4.1.
- The native Android bridge uses Braze Android SDK 16.0.0.
- The native iOS bridge uses Braze iOS SDK 4.4.0.
- Streamlines the Android integration process to not involve any manual writing of code to automatically register for sessions, in-app messages, or Content Card updates from the native SDK.
- To migrate, remove any manual calls to
registerActivityLifecycleCallbacks()
,subscribeToContentCardsUpdates()
, andsetCustomInAppMessageManagerListener()
. - To disable this feature, set the boolean
com_braze_flutter_enable_automatic_integration_initializer
tofalse
in yourbraze.xml
configuration.
- To migrate, remove any manual calls to
- Adds the ability to set the in-app message callback and content cards callback in the constructor of
BrazePlugin
. - Adds the option to store any in-app messages or content cards received before their callback is available and replay them once the corresponding callback is set.
- To enable this feature, add this entry into the
customConfigs
map in the BrazePlugin constructor:replayCallbacksConfigKey : true
- Thank you @JordyLangen for the contribution!
- To enable this feature, add this entry into the
- Adds
BrazePlugin.addToSubscriptionGroup()
andBrazePlugin.removeFromSubscriptionGroup()
to manage SMS/Email Subscription Groups.
- Fixes an issue in the iOS bridge where custom events without any properties would not be logged correctly.
- The native iOS bridge uses Braze iOS SDK 4.3.2.
- The native Android bridge uses Braze Android SDK 15.0.0.
- Adds
logContentCardsDisplayed()
to manually log an impression when displaying Content Cards in a custom UI.
- Migrates the plugin to support null safety. All non-optional function parameters have been updated to be non-nullable unless otherwise specified. Read here for more information about null safety.
- Please reference the Dart documentation when migrating your app to null safety.
- Apps that have not yet migrated to null safety are compatible with this version as long as they are using Dart 2.12+.
- Thanks @IchordeDionysos for contributing!
- Passing through
null
as a value for user attributes is no longer supported.- The only attribute that is able to be unset is
email
by passing innull
intosetEmail
.
- The only attribute that is able to be unset is
- The methods
logEvent
andlogPurchase
now take an optionalproperties
parameter. - The native Android bridge uses Braze Android SDK 14.0.0.
- The minimum supported Dart version is
2.12.0
.
logEventWithProperties
andlogPurchaseWithProperties
are now deprecated in favor oflogEvent
andlogPurchase
.
- The native iOS bridge uses Braze iOS SDK 4.0.2.
- The native Android bridge uses Braze Android SDK 13.1.2.
- The minimum supported Flutter version is 1.10.0.
- Adds a public repository for the Braze Flutter SDK here: https://github.com/braze-inc/braze-flutter-sdk.
- We look forward to the community's feedback and are excited for any contributions!
- The native Android bridge uses Braze Android SDK 13.0.0.
- The native iOS bridge uses Braze iOS SDK 3.34.0.
- Adds
BrazePlugin.setGoogleAdvertisingId()
to set the Google Advertising ID and the associated Ad-Tracking Enabled field for Android. This is a no-op on iOS.
- Fixes an issue where the Braze Android SDK's
Appboy.setLogLevel()
method wasn't respected.
- The native Android bridge uses Braze Android SDK 12.0.0.
- The native iOS bridge uses Braze iOS SDK 3.31.0.
- Adds support for the Braze plugin to be used with Android V2 Embedding APIs. Integrations using V1 Embedding will also continue to work.
- Allows the Android Braze plugin to be used with multiple Flutter engines.
- The native iOS bridge uses Braze iOS SDK 3.30.0.
- Allows the iOS Braze plugin to be used with multiple Flutter engines.
- The native Android bridge uses Braze Android SDK 11.0.0.
- The native iOS bridge uses Braze iOS SDK 3.29.1.
- 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 for details.
- The native iOS bridge uses Braze iOS SDK 3.26.1.
- The native Android bridge uses Braze Android SDK 8.1.0.
- The native iOS bridge uses Braze iOS SDK 3.26.0.
- Fixed an issue where
setBoolCustomUserAttribute
always set the attribute totrue
on iOS.
- The native Android bridge uses Braze Android SDK 7.0.0.
- The native iOS bridge uses Braze iOS SDK 3.22.0.
- The native iOS bridge uses Braze iOS SDK 3.21.3.
- The native Android bridge uses Braze Android SDK 4.0.2.
- If you are using a custom
IInAppMessageManagerListener
, then you will need to define new methods added to that interface in Braze Android SDK 4.0.0. See theMainActivity.kt
file of our sample app for a reference example.
- If you are using a custom
- Added
BrazePlugin.launchContentCards()
andBrazePlugin.refreshContentCards()
to natively display and refresh Content Cards. - Adds a Dart callback for receiving Braze Content Card data in the Flutter host app.
- Similar to in-app messages, you will need to subscribe to Content Card updates in your native app code and pass Content Card objects to the Dart layer. Those objects will then be passed to your callback within a
List<BrazeContentCard>
instance. - To set the callback, call
BrazePlugin.setBrazeContentCardsCallback()
from your Flutter app with a function that takes aList<BrazeContentCard>
instance.- The
BrazeContentCard
object supports a subset of fields available in the native model objects, includingdescription
,title
,image
,url
,extras
, and more.
- The
- On Android, you will need to register an
IEventSubscriber<ContentCardsUpdatedEvent>
instance and pass returned Content Card objects to the Dart layer usingBrazePlugin.processContentCards(contentCards)
.- See the
MainActivity.kt
file of our sample app for a reference example.
- See the
- On iOS, you will need to create an
NSNotificationCenter
listener forABKContentCardsProcessedNotification
events and pass returned Content Card objects to the Dart layer usingBrazePlugin.processContentCards(contentCards)
.- See the
AppDelegate.swift
file of our sample app for a reference example.
- See the
- Similar to in-app messages, you will need to subscribe to Content Card updates in your native app code and pass Content Card objects to the Dart layer. Those objects will then be passed to your callback within a
- Added support for logging Content Card analytics to Braze using
BrazeContentCard
instances. SeelogContentCardClicked()
,logContentCardImpression()
, andlogContentCardDismissed()
on theBrazePlugin
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.
- Updated the native iOS bridge to Braze iOS SDK 3.20.4.
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.
- Updated the native iOS bridge to Braze iOS SDK 3.20.2.
Important This release has known issues displaying HTML in-app messages. Do not upgrade to this version and upgrade to 0.5.2 and above instead. If you are using this version, you are strongly encouraged to upgrade to 0.5.2 or above if you make use of HTML in-app messages.
- Updated the native iOS bridge to Braze iOS SDK 3.20.1.
Important This release has known issues displaying HTML in-app messages. Do not upgrade to this version and upgrade to 0.5.2 and above instead. If you are using this version, you are strongly encouraged to upgrade to 0.5.2 or above if you make use of HTML in-app messages.
- The native iOS bridge uses Braze iOS SDK 3.20.0.
- Important: Braze iOS SDK 3.20.0 contains updated push token registration methods. We recommend upgrading to these methods as soon as possible to ensure a smooth transition as devices upgrade to iOS 13. In
application:didRegisterForRemoteNotificationsWithDeviceToken:
, replace
[[Appboy sharedInstance] registerPushToken:
[NSString stringWithFormat:@"%@", deviceToken]];
with
[[Appboy sharedInstance] registerDeviceToken:deviceToken]];
registerPushToken()
was renamed toregisterAndroidPushToken()
and is now a no-op on iOS. On iOS, push tokens must now be registered through native methods.
- The native iOS bridge uses Braze iOS SDK 3.18.0.
- The native Android bridge uses Braze Android SDK 3.6.0.
- Added the following new field to
BrazeInAppMessage
:zippedAssetsUrl
.- Note that a known issue in the iOS plugin prevents HTML in-app messages from working reliably with the Dart in-app message callback. Android is not affected.
- The native iOS bridge uses Braze iOS SDK 3.15.0.
- The native Android bridge uses Braze Android SDK 3.5.0.
- Support for the Android configuration parameter
com_appboy_inapp_show_inapp_messages_automatically
has been removed.- To control whether an in-app message object should be displayed natively or not, create and register an instance of
IInAppMessageManagerListener
in your native Android code and implement decisioning in thebeforeInAppMessageDisplayed
method. SeeMainActivity
in our sample app for an example.
- To control whether an in-app message object should be displayed natively or not, create and register an instance of
- On Android, in-app message objects are no longer sent automatically to the Dart in-app message callback after calling
BrazePlugin.setBrazeInAppMessageCallback()
in your Dart code.- Similar to iOS, you will need to implement a delegate interface in your native app code and pass in-app message objects to the Dart layer for passing to the callback.
- On Android, the delegate interface is
IInAppMessageManagerListener
and the method for passing objects to Dart isBrazePlugin.processInAppMessage(inAppMessage)
. - See the sample
IInAppMessageManagerListener
implementation in theMainActivity.kt
file of our sample app for an example. - This approach gives the integrator more flexibility in deciding when a message should be displayed natively, discarded, or passed into the Dart layer.
- Added support for logging in-app message analytics to Braze using
BrazeInAppMessage
instances. SeelogInAppMessageClicked
,logInAppMessageImpression
, andlogInAppMessageButtonClicked
on theBrazePlugin
interface.
- Added the following new fields to
BrazeInAppMessage
:imageUrl
,useWebView
,duration
,clickAction
,dismissType
,messageType
- Added the following new fields to
BrazeButton
:useWebView
,clickAction
.
- The native iOS bridge uses Braze iOS SDK 3.14.0.
- The native Android bridge uses Braze Android SDK 3.2.1.
- Adds
addAlias()
to the public API interface. - Adds
requestLocationInitialization()
to the public API interface. - Adds
getInstallTrackingId()
to the public API interface. - Adds support for disabling native in-app message display on Android.
- To disable automatic in-app message display, create a boolean element named
com_appboy_inapp_show_inapp_messages_automatically
in your Android app'sappboy.xml
and set it tofalse
. - Note: Disabling automatic in-app message display was already possible for iOS. For instructions, see
README.md
.
- To disable automatic in-app message display, create a boolean element named
- Adds a Dart callback for receiving Braze in-app message data in the Flutter host app.
- Analytics are not currently supported on messages displayed through the callback.
- To set the callback, call
BrazePlugin.setBrazeInAppMessageCallback()
from your Flutter app with a function that takes aBrazeInAppMessage
instance.- The
BrazeInAppMessage
object supports a subset of fields available in the native model objects, includinguri
,message
,header
,buttons
, andextras
.
- The
- The callback should begin to function on Android immediately after being set.
- On iOS, you will additionally need to implement the
ABKInAppMessageControllerDelegate
delegate as described in our public documentation. YourbeforeInAppMessageDisplayed
delegate implementation must callBrazePlugin.process(inAppMessage)
. For an example, seeAppDelegate.swift
in our example app.
- Formatted
braze_plugin.dart
.
- Removes the unused
dart:async
import inbraze_plugin.dart
. - Makes
_callStringMethod
private inbraze_plugin.dart
. - Adds basic dartdoc to the public API interface.
- Updates the version of Kotlin used by the Android plugin from
1.2.71
to1.3.11
.
- Initial release.
- The native iOS bridge uses Braze iOS SDK 3.12.0.
- The native Android bridge uses Braze Android SDK 3.1.0.