# Migrating from v1

Batch Flutter Plugin v2 is a major release based on natives SDK v2, which introduces breaking changes from 1.x. This guide describes how to update your application when using a previous version.

### Upgrading the SDK version

To upgrade from v1 to v2 update your `pubspec.yaml` file as following:

```yaml
dependencies:
  batch_flutter: ^2.0.0
```

and then run:

```shell
flutter pub upgrade
```

⚠️ Since this version is based on the Batch SDK 2.0, its now requires an Android `minSdk` level of 21 or higher and iOS 13.0 or higher.

If your application support lower Android versions, you will have to update it:

{% tabs %}
{% tab title="Kotlin" %}

```kts
android {
  ...
  defaultConfig {
    ...
    minSdk = 21
  }
}
```

{% endtab %}

{% tab title="Groovy" %}

```groovy
android {
    ...
    defaultConfig {
        ...
        minSdkVersion 21
    }
}
```

{% endtab %}
{% endtabs %}

On iOS, update your target iOS minimum deployments version from Xcode if necessary.

### Core migration

#### Android - Push Providers

This version also removed support for old push providers (Google Cloud Messaging and FCM Instance ID). Batch now only support for FCM's Token APIs. Overriding the Sender ID is no longer possible in any way.

You have to use `firebase-messaging` 22.0.0 or higher. We highly recommend to use the latest version when possible.

If you are using the flutter plugin ensure it's based on the fcm messaging version 22 or higher. If you did a native integration of firebase, add/update the following to your `build.gradle` if not already present:

{% tabs %}
{% tab title="Kotlin" %}

```kts
implementation("com.google.firebase:firebase-messaging:22.0.0")

// or if you are using firebase-bom
// val bom = platform("com.google.firebase:firebase-bom:28.0.0")
// implementation(bom)
// implementation("com.google.firebase:firebase-messaging")
```

{% endtab %}

{% tab title="Groovy" %}

```groovy
implementation 'com.google.firebase:firebase-messaging:22.0.0'

// or if you are using firebase-bom
// implementation platform('com.google.firebase:firebase-bom:28.0.0')
// implementation 'com.google.firebase:firebase-messaging'
```

{% endtab %}
{% endtabs %}

#### Advertising Identifier

Batch Flutter 1.4 had removed automatic collection of AAID (Android Advertising Identifier) and IDFA (Identifier For Advertisers). This version has totally drop the support of the AAID and IDFA and you can no longer set an advertising id to Batch since all related APIs have been removed.

#### Advanced Information

The Batch Flutter Plugin v1 allowed you to disable advanced information generally with `setCanUseAdvancedDeviceInformation(false)` and `setUseAdvancedDeviceInformation(false)`. This has been removed and replaced with a more fine-tuning control of what you want to enable directly in your dart code with:

```javascript
Batch.instance.setAutomaticDataCollection({
  "geoIP": true, // Enable GeoIP resolution on server side
  "deviceBrand": true, // Enable automatic collection of the device brand information (Android only)
  "deviceModel": true, // Enable automatic collection of the device model information
});
```

{% hint style="info" %}
Note: All data configurable with this API are now disabled by default and should be enabled if you want to use it.
{% endhint %}

For more information, please visit our [automatic data collection guide](/developer/sdk/flutter/data-privacy/data-collection.md).

#### Deprecated APIs

All deprecated APIs in the Flutter Plugin v1 have been removed and some others have been renamed/reworked. To see in details the differences, please visit our [changelog](https://doc.batch.com/developer/sdk/flutter/advanced/pages/33L8l0e3NgIlMt4vLXez#id-2.0.0).

### Project migration

This version follows Batch's pivot to being an omnichannel platform. It allows you to collect data for your **Projects** and **Profiles**. If you are not familiar with these two concepts, please see [this guide](https://doc.batch.com/getting-started/features/customer-engagement-platform/21-cep-profiles/00-overview) beforehand.

#### Profile Attributes

First of all, most of the user-related write APIs have been removed. Reading methods are still usable since we do not provide yet a way to get synced data for a Profile, but keep in mind that the data returned is only about your installation and not your Profile.

To interacts with our user-centered model, you should now use the `BatchProfile` module. Let's see a migration example.

If you were previously doing something like that:

```dart
BatchUser.instance.editor()
  .setIdentifier("john.doe")
  .setLanguage("en")
  .setRegion("US")
  .setEmail("john.doe@batch.com")
  .setEmailMarketingSubscriptionState(BatchEmailSubscriptionState.SUBSCRIBED)
  .setIntegerAttribute("age", 26)
  .removeAttribute("firstname")
  .addTag("actions", "has_bought")
  .removeTag("actions", "has_bought")
  .clearTagCollection("actions")
  .save();
}
```

You should now do :

```dart
BatchProfile.instance.identify("john.doe");
BatchProfile.instance.editor()
  .setLanguage("en")
  .setRegion("US")
  .setEmailAddress("john.doe@batch.com")
  .setEmailMarketingSubscription(BatchEmailSubscriptionState.SUBSCRIBED)
  .setIntegerAttribute("age", 26)
  .removeAttribute("firstname")
  .addToArray("actions", "has_bought") // or addToArray("actions", ["has_bought"])
  .removeFromArray("actions", "has_bought") // or removeFromArray("actions", ["has_bought"])
  .removeAttribute("actions")
  .save();
}
```

For more information, please see the following sections :

* [Custom user id](/developer/sdk/flutter/profile-data/custom-user-id.md)
* [Custom region/language](/developer/sdk/flutter/profile-data/custom-locale.md)
* [Custom user attributes](/developer/sdk/flutter/profile-data/attributes.md)
* [Email subscription](/developer/sdk/flutter/profile-data/email-subscription.md)

#### Profile Data migration

To make it easier to collect data to a Profile, Batch has added two automatic ways to migrate old installation's data on a Profile. So the first time a user will launch your application running on v2 :

* He will be automatically identified (logged-in) if he had a Batch `custom_user_id` set on the local storage.
* Its natives (language/region) and customs data will be automatically migrate to a Profile if your app is attached to a Project.

These migrations are enabled by default, but you may want to disable them, to do so, please visit our [profile data migration guide](/developer/sdk/flutter/profile-data/data-migration.md)

#### Event data

Batch flutter Plugin v2 introduced two new types of attribute that can be attached to an event : **Array** and **Object**.

What's change:

* `BatchEventData` has be renamed into `BatchEventAttributes`
* `addTag` API is no longer available, you should now use the `$tags` reserved key with the `putStringList` method.
* Optional `label` parameter is no longer available and has been replaced by a `$label` reserved key under `BatchEventAttributes`.

{% hint style="info" %}
Limits are unchanged and still 200 chars max for $label and 10 items max for $tags .
{% endhint %}

So if you were previously doing something like:

```dart
BatchEventData eventData = new BatchEventData();

eventData.putBoolean("premium", true);
eventData.putString("id", "ab-123456");
eventData.addTag("sports");
eventData.addTag("squash");

BatchUser.instance.trackEvent(name: "read_article", label: "daily_digest", data: eventData);
```

You should now do:

```dart
BatchEventAttributes eventAttributes = new BatchEventAttributes();

eventAttributes.putBoolean("premium", true);
eventAttributes.putString("id", "ab-123456");
eventAttributes.putString("\$label", "daily_digest");
eventAttributes.putStringList("\$tags", ["sports", "squash"]);

BatchProfile.instance.trackEvent(name: "read_article", attributes: eventAttributes);
```

For more information, please visit our [custom event guide](/developer/sdk/flutter/profile-data/events.md).

To see in details what's precisely changed since V1 please consult our [changelog](https://doc.batch.com/developer/sdk/flutter/advanced/pages/33L8l0e3NgIlMt4vLXez#id-2.0.0) or visit the [APIs Reference](https://doc.batch.com/flutter-api-reference).


---

# 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/advanced/1x-migration.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.
