# Publish to App store

#### Requirements:

* Xcode
* A Paid Apple Developers account
* A valid provisioning profile
* App Development and Distribution certificates

#### Register a Bundle ID

Every iOS application is associated with a Bundle ID, a unique identifier registered with Apple. To register a Bundle ID for your app, follow these steps:

* Open the [App IDs](https://developer.apple.com/account/ios/identifier/bundle) page of your developer account.
* Click **+** to create a new Bundle ID.
* Enter an app name, select **Explicit App ID**, and enter an ID.
* Select the services your app uses, then click **Continue**.
* On the next page, confirm the details and click **Register** to register your Bundle ID.

#### Register your app on App Store Connect:

* Open [App Store Connect](https://appstoreconnect.apple.com/) in your browser.
* On the App Store Connect landing page, click **My Apps**.
* Click **+** in the top-left corner of the My Apps page, then select **New App**.
* Fill in your app details in the form that appears. In the Platforms section, ensure that iOS is checked. Since Flutter does not currently support tvOS, leave that checkbox unchecked. Click **Create**.
* Navigate to the application details for your app and select **App Information** from the sidebar.
* In the General Information section, select the Bundle ID you registered in the preceding step.

For a detailed overview, see [Add an app to your account](https://help.apple.com/app-store-connect/#/dev2cd126805).

#### Review Xcode project settings

This step covers reviewing the most important settings in the Xcode workspace. For detailed procedures and descriptions, see [Prepare for app distribution](https://help.apple.com/xcode/mac/current/#/dev91fe7130a).

Navigate to your target’s settings in Xcode:

* In Xcode, open `Runner.xcworkspace` in your app’s `ios` folder.
* To view your app’s settings, select the **Runner** project in the Xcode project navigator. Then, in the main view sidebar, select the **Runner** target.
* Select the **General** tab.

#### Verify the most important settings.

In the **Identity** section:

`Display Name`The display name of your app.`Bundle Identifier`The App ID you registered on App Store Connect.

In the **Signing & Capabilities** section:

`Automatically manage signing`Whether Xcode should automatically manage app signing and provisioning. This is set `true` by default, which should be sufficient for most apps. For more complex scenarios, see the [Code Signing Guide](https://developer.apple.com/library/content/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html).`Team`Select the team associated with your registered Apple Developer account. If required, select **Add Account…**, then update this setting.

In the **Build Settings** section:

`iOS Deployment Target`The minimum iOS version that your app supports. Flutter supports iOS 9.0 and later. If your app or plugins include Objective-C or Swift code that makes use of APIs newer than iOS 9, update this setting to the highest required version.

The **General** tab of your project settings should resemble the following:

![](/files/ESAmKjnvcxNIrfZN2OMM)

### Create a build archive with Xcode <a href="#create-a-build-archive-with-xcode" id="create-a-build-archive-with-xcode"></a>

This step covers creating a build archive and uploading your build to App Store Connect.

During development, you’ve been building, debugging, and testing with *debug* builds. When you’re ready to ship your app to users on the App Store or TestFlight, you need to prepare a *release* build. At this point, you might consider [obfuscating your Dart code](https://docs.flutter.dev/deployment/obfuscate) to make it more difficult to reverse engineer. Obfuscating your code involves adding a couple flags to your build command.

In Xcode, configure the app version and build:

1. In Xcode, open `Runner.xcworkspace` in your app’s `ios` folder.
2. Select **Runner** in the Xcode project navigator, then select the **Runner** target in the settings view sidebar.
3. In the Identity section, update the **Version** to the user-facing version number you wish to publish.
4. In the Identity section, update the **Build** identifier to a unique build number used to track this build on App Store Connect. Each upload requires a unique build number.

Finally, create a build archive and upload it to App Store Connect:

1. Run `flutter build ipa` to produce a build archive.

   &#x20;**Note:** On versions of Flutter where `flutter build ipa` is unavailable, open Xcode and select **Product > Archive**. In the sidebar of the Xcode Organizer window, select your iOS app, then select the build archive you just produced.
2. Open `build/ios/archive/MyApp.xcarchive` in Xcode.
3. Click the **Validate App** button. If any issues are reported, address them and produce another build. You can reuse the same build ID until you upload an archive.
4. After the archive has been successfully validated, click **Distribute App**. You can follow the status of your build in the Activities tab of your app’s details page on [App Store Connect](https://appstoreconnect.apple.com/).

   &#x20;**Note:** When you export your app at the end of **Distribute App**, Xcode will create a directory containing an IPA of your app and an `ExportOptions.plist` file. You can create new IPAs with the same options without launching Xcode by running `flutter build ipa --export-options-plist=path/to/ExportOptions.plist`. See `xcodebuild -h` for details about the keys in this property list.

You should receive an email within 30 minutes notifying you that your build has been validated and is available to release to testers on TestFlight. At this point, you can choose whether to release on TestFlight or go ahead and release your app to the App Store.

For more details, see [Upload an app to App Store Connect](https://help.apple.com/xcode/mac/current/#/dev442d7f2ca).

The [Distribute your app](https://help.apple.com/xcode/mac/current/#/dev8b4250b57) guide provides a detailed overview of the process of releasing an app to the App Store.


---

# 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://mobiledocs.themeparrot.com/woocommerce-mobile-app/bookstore/release/publish-to-app-store.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.
