# SDK changelog

{% updates format="short" %}
{% update date="2026-04-22" %}

## 3.1.0

***

**Plugin**

* Updated Batch to 3.3

**Profile**

* Added `setTopicPreferences(List<String>? topics)` to `BatchProfileAttributeEditor` class to set or reset the profile topic preferences.
* Added `addToTopicPreferences(List<String> topics)` to `BatchProfileAttributeEditor` class to add topics to the profile topic preferences.
* Added `removeFromTopicPreferences(List<String> topics)` to `BatchProfileAttributeEditor` class to remove topics from the profile topic preferences.
* Profile string attributes now support up to 300 characters for the Customer Engagement Platform (CEP). The limit for the Mobile Engagement Platform (MEP) remains 64 characters. Attributes set via `BatchProfileAttributeEditor.setStringAttribute()` longer than 64 characters will only be applied to the CEP.
* Event string attributes now support up to 300 characters for the Customer Engagement Platform (CEP). The limit for the Mobile Engagement Platform (MEP) remains 200 characters. Attributes set via `BatchEventAttributes.putString()` longer than 200 characters will only be applied to the CEP.

**Push**

* Added `requestNotificationAuthorizationAsync()` to request notification authorization and return a promise that resolves with the authorization result.
  {% endupdate %}

{% update date="2025-09-23" %}

## 3.0.0

***

**Plugin**

* Updated Batch to 3.1
* Batch requires iOS 15.0 or higher and Xcode 16.4
* Batch is now distributed as a dynamic framework
* Added support for strict concurrency in Swift 6
* Batch now compiles with SDK 36 (Android 16 "Baklava").

**Push**

* Added `setShowNotifications` method to control whether Android push notifications should be displayed.
* Added `shouldShowNotifications` method to check current Android notification display settings.

**Messaging**

* Added support for Mobile Landings within the Customer Engagement Platform.
* Added support for In-App Automations within the Customer Engagement Platform.
  {% endupdate %}

{% update date="2024-11-14" %}

## 2.1.0

***

**Plugin**

* Updated Batch to 2.1
* Batch requires iOS 13.0 or higher.
* Batch requires compiling with SDK 35 (Android 15).

**iOS**

* Added support for Swift Package Manager. Since, as of writing, [Flutter's support of SPM](https://docs.flutter.dev/packages-and-plugins/swift-package-manager) is still under development, this may not work in future versions of Flutter. Batch is still backwards compatible with CocoaPods.

**Profile**

* Added `setPhoneNumber` API to the `BatchProfileAttributeEditor` class. This requires having a user identifier registered or calling the `identify` method beforehand.
* Added `setSMSMarketingSubscription` API to the `BatchProfileAttributeEditor` class.
  {% endupdate %}

{% update date="2024-07-25" %}

## 2.0.0

***

This is a major release. See the [migration guide](/developer/sdk/flutter/advanced/1x-migration.md) for more information on updating your current Batch implementation.

**Plugin**

* Updated Batch to 2.0. For more information, see the [iOS SDK changelog](/developer/sdk/ios/sdk-changelog.md) and [Android SDK changelog](/developer/sdk/android/sdk-changelog.md).
* Batch requires iOS 13.0 or higher.
* Batch requires a `minSdk` level of 21 or higher.

**iOS**

* Removed deprecated `canUseIDFA` property from `BatchPluginConfiguration`.
* Removed deprecated `canUseAdvancedDeviceInformation` property from `BatchPluginConfiguration`. Use `setAutomaticDataCollection` instead.
* Added `profileCustomIdMigrationEnabled` property to disable the profile custom ID migration. This can also be done from `Info.plist`.
* Added `profileCustomDataMigrationEnabled` property to disable the profile custom data migration. This can also be done from `Info.plist`.

**Android**

* Removed deprecated `canUseAdvertisingID` method from `BatchPluginConfiguration`.
* Removed `setCanUseAdvancedDeviceInformation` and `canUseAdvancedDeviceInformation` methods from `BatchPluginConfiguration`. Use `setAutomaticDataCollection` instead.
* Added `setProfileCustomIdMigrationEnabled` method to disable the profile custom ID migration. This can also be done from `AndroidManifest` metadata.
* Added `setProfileCustomDataMigrationEnabled` method to disable the profile custom data migration. This can also be done from `AndroidManifest` metadata.

**Core**

* Added `isOptedOut` to check whether Batch has been opted out.
* Added `setAutomaticDataCollection` to fine-tune the data you authorize Batch to track.

**User**

* Removed `trackTransaction` with no equivalent.
* Removed `BatchUser.newEditor` and the related `BatchUserDataEditor` class. Use `BatchProfile.instance.newEditor()`, which returns a `BatchProfileAttributeEditor`.
* Added `clearInstallationData`, which removes installation data without modifying the current profile.

**Event**

This version introduced two new types of attribute that can be attached to an event: Array and Object.

* Removed `trackEvent` APIs from the user module. Use `BatchProfile.instance.trackEvent` instead.
* `BatchEventData` has been renamed to `BatchEventAttributes`.
* Added support for Array and Object types:
  * Added `putObject` to `BatchEventAttributes`.
  * Added `putObjectList` to `BatchEventAttributes`.
  * Added `putStringList` to `BatchEventAttributes`.
* Removed `addTag` from `BatchEventData`. Use the `$tags` key in `BatchEventAttributes` with `putStringList` instead.
* Removed `label` from `trackEvent`. Use the `$label` key in `BatchEventAttributes` with `putString` instead.

**Profile**

Introduced `BatchProfile`, a new module for interacting with profiles. It replaces most of what `BatchUser` used to do.

* Added `identify` as a replacement for `BatchUser.instance.newEditor().setIdentifier`.
* Added `newEditor` to get a new `BatchProfileAttributeEditor` instance as a replacement for `BatchUserDataEditor`.
* Added `trackEvent` as a replacement for `BatchUser.instance.trackEvent`.
* Added `trackLocation` as a replacement for `BatchUser.instance.trackLocation`.
  {% endupdate %}

{% update date="2024-01-23" %}

## 1.4.0

***

**Plugin**

* Dart 2.15+ is now required.
* Updated Batch to 1.21.0.
* Batch requires iOS 12.0 or higher.
* Batch now compiles with and targets SDK 34 (Android 14).

**User**

* Removed automatic collection of the advertising ID:
  * Android methods `setCanUseAdvertisingID` and `canUseAdvertisingID` on `BatchPluginConfiguration` are now deprecated and do nothing.
  * Android manifest configuration `com.batch.flutter.use_gaid` has been removed.
  * iOS property `canUseIDFA` on `BatchPluginConfiguration` is now deprecated and does nothing.
  * iOS `Info.plist` property `BatchFlutterCanUseIDFA` has been removed.
  * You now need to collect it yourself and pass it to Batch using `setAttributionIdentifier(String? id)`. Batch persists it across starts.
* Added `setEmail(String? email)` to `BatchUserDataEditor`. This requires having a user identifier registered or calling `setIdentifier` on the editor first.
* Added `setEmailMarketingSubscriptionState(BatchEmailSubscriptionState state)` to `BatchUserDataEditor`.

**Inbox**

* Added `hasLandingMessage` property to `BatchInboxNotificationContent`.
* Added `displayNotificationLandingMessage(BatchInboxNotificationContent notification)` to `BatchInboxFetcher`.
  {% endupdate %}

{% update date="2022-09-15" %}

## 1.3.0

***

**Plugin**

* Updated Batch to 1.19.2.\
  Bumping your Android project's `compileSdkVersion` to `33` might be required.\
  Xcode 13.3 required if your project uses bitcode.

**Push**

* Added Android implementation of the `batch.push.requestNotificationAuthorization()` API. This allows you to request the [new notification permission introduced](https://developer.android.com/about/versions/13/changes/notification-permission) in Android 13.
  {% endupdate %}

{% update date="2022-09-15" %}

## 1.2.0

***

**Plugin**

* Updated Batch to 1.19.0.\
  Bumping your Android project's `compileSdkVersion` to `31` might be required.\
  Xcode 13.3 required if your project uses bitcode.

**Inbox**

* Silent notifications are now filtered on Android rather than throwing an exception when fetched.
  {% endupdate %}

{% update date="2022-02-17" %}

## 1.1.4

***

**Plugin**

* Android: Move away from jCenter and use Maven Central.
  {% endupdate %}

{% update date="2022-02-15" %}

## 1.1.3

***

**Plugin**

* Updated dependencies so that the project can be built using Flutter 2.10.\
  Bumping your Android project's `compileSdkVersion` to `31` might be required.
  {% endupdate %}

{% update date="2022-02-15" %}

## 1.1.2

***

**Plugin**

* Android: Fixed an issue where Batch's advanced device information was disabled by default and not configurable using the manifest.
* Android: Manifest configuration of the initial Do Not Disturb state now works as expected.
  {% endupdate %}

{% update date="2021-12-21" %}

## 1.1.1

***

**Plugin**

* Updated Batch iOS to 1.18.1.
* Worked around a [Flutter issue](https://github.com/flutter/flutter/issues/67624#issuecomment-801971172) where a wrong nullability annotation resulted in a debug app crashing when started from the home screen.\
  The scenario is still unsupported by Flutter, but the app no longer crashes.
  {% endupdate %}

{% update date="2021-11-29" %}

## 1.1.0

***

**Plugin**

* Updated Batch to 1.18.

**User**

* Added support for the URL attribute and event data type.
  {% endupdate %}

{% update date="2021-09-09" %}

## 1.0.0

***

**Initial stable release 🎉**

*Changes since RC:*

**Inbox**

* Removed `isDeleted` on `BatchInboxNotificationContent` as it does not work like it does on the native SDK due to plugin limitations.
  {% endupdate %}

{% update date="2021-07-29" %}

## 1.0.0-rc.2

***

**Inbox**

* Fixed `limit` and `maxPageSize` staying at their default values.
  {% endupdate %}

{% update date="2021-06-23" %}

## 0.1.0 (RC1)

***

*First Release Candidate*

**Messaging**

* Added Do Not Disturb support.

**Inbox**

* Calling `dispose()` on a disposed fetcher does not throw anymore.
* Added `markAsRead()`, `markAllAsRead()`, and `markAsDeleted()`.
* Added `limit` and `maxPageSize` to `getFetcherForInstallation()` and `getFetcherForUser()`.
  {% endupdate %}

{% update date="2021-05-28" %}

## 0.0.3

***

**Inbox**

* Added Batch Inbox support:
  * Fetchers can be instantiated for both Installation and User modes.
  * `fetchNewNotifications()`, `fetchNextPage()`, `get allNotifications`, and `dispose()` have been implemented.
  * `markAsRead()`, `markAsDeleted()`, and pagination configuration will come in a later beta.

**Push**

* Added `setShowForegroundNotificationsOniOS()`, which can enable foreground notification display on iOS.\
  This requires `BatchUNUserNotificationCenterDelegate` to be set as your `UNUserNotificationCenterDelegate` in the native integration.

**User**

* Added `get attributes` and `get tagCollections` properties to read back previously set attributes and tag collections.
* Added `get identifier`, `get language`, and `get region` to read back the user identifier and language or region overrides.
  {% endupdate %}

{% update date="2021-05-12" %}

## 0.0.2

***

**Core**

* Added `showDebugView()`.
* Added `optIn()`, `optOut()`, and `optOutAndWipeData()`.
  * `isOptedOut` will come in a later seed.

**Push**

* Added `requestProvisionalNotificationAuthorization()`.

**User**

* Added `trackEvent()`, `trackTransaction()`, `trackLocation()`, and the `BatchEventData` class.
* Added `newEditor()`, which returns a `BatchUserDataEditor` instance, allowing you to edit the user profile.
  {% endupdate %}

{% update date="2021-04-27" %}

## 0.0.1

***

* First Batch Flutter plugin beta release.
  {% endupdate %}
  {% endupdates %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.batch.com/developer/sdk/flutter/sdk-changelog.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
