Chapters

Hide chapters

Catalyst by Tutorials

Third Edition · iOS 15 · Swift 5.6 · Xcode 13.3

13. Releasing on the App Store
Written by Marin Bencevic

If you’re reading this book in order, you have a pretty good grasp of how to bring an iPhone or iPad app to macOS. Now it’s time for the next step: getting your app into the users’ hands.

Fortunately, once you have a Mac app, you can use Catalyst to choose how to distribute it. There are four ways to distribute your app:

  • The App Store: The Mac App Store works almost like the iOS store. Since iOS apps already follow Apple’s app review guidelines, you shouldn’t have any issues going through app review. You can either release your app as a standalone Mac App Store product or offer a universal purchase so that your customers can buy your app on one Apple platform and have it everywhere else.
  • Third Party Distribution: As long as you sign the app and have it notarized by Apple, anyone can simply download and launch it. The distribution, in this case, is up to you.
  • Developer Signing: Similar to third-party distribution, you must sign your app with a development certificate. You can’t use this option for distributing to the general public because the certificate includes an allowlist of specific devices that can install the app. In the past, this was your best bet for testing the app in development because macOS didn’t have TestFlight support until 2021.
  • Test Flight: Towards the end of 2021, Apple finally included TestFlight support for macOS apps. Test Flight is a service you can use to distribute beta versions of your app to your testers. Before you release your app, you can collect valuable feedback from the testers and improve your app.

If you made your Catalyst app in Xcode 11.3 or earlier, there are a few steps you need to take to get your app up to speed.

Updating Existing Catalyst Apps

Before Xcode 11.4, Catalyst apps had an automatically-assigned bundle ID with a maccatalyst. prefix. If you want to offer a universal purchase or just want a custom bundle ID, you’ll have to make a quick change.

Go back to your main target’s settings and open the Build Settings tab. Scroll down to the User-Defined section and set DERIVE_UIKITFORMAC_PRODUCT_BUNDLE_IDENTIFIER to NO. This setting tells Xcode to stop generating a bundle ID automatically and let you change the bundle ID in the Signing & Capabilities tab.

From there, you decide how you want to distribute your app.

The App Store vs. Third-Party Distribution

Since developer signing is only for testing, you’re probably trying to decide whether to use the App Store or distribute the app independently. Each approach has pros and cons. The App Store has several benefits, including:

  • Apple manages the app’s storage and distribution.
  • Apple handles payments, including the initial purchase of the app, in-app purchases and subscriptions. They also manage complaints and refunds.
  • You can offer a universal purchase and make your app available on iOS and macOS with a single purchase.
  • There’s a chance that Apple might feature your app, giving you access to many users who otherwise might not hear of the app.
  • You get access to the App Store’s analytics and crash reporting with no additional effort.
  • TestFlight is built-in and lets you easily beta test your app internally and with outside beta testers.

That said, distributing on the App Store does come with downsides:

  • Most notably, Apple takes a cut from all App Store sales. This includes 15% or 30% of app sales and in-app purchases of digital goods, as well as 30% of subscriptions in the first year and 15% after that.
  • You tie the app’s destiny to Apple’s. If they decide to move the App Store in a different direction or change their guidelines, you have no say. Apple could potentially hurt your sales or make your app unavailable.
  • It limits your business model options. Offering dynamic or tiered pricing, enterprise deals or other more creative business models can be difficult or impossible.

While Apple takes a sizable cut of your income, it gives you the most convenient way to sell your app. It’s your choice whether to invest significant effort to be the master of your destiny or save time by having Apple take care of distribution for you and take a cut of your profits.

If you really can’t decide, Apple lets you simultaneously sell your app on your own and on the App Store.

This chapter teaches you how to distribute your app on the App Store, test it with TestFlight and offer a universal purchase. The next chapter deals with distributing your app on your own. If you need help deciding, read both chapters and see how you feel once you know what goes into both approaches.

Adding Your App to the App Store

Distributing your app via the App Store is tedious but straightforward. All you have to do is click a bunch of things! Before you get started, take note of some basic terminology you’ll need while going through this process.

Code Signing

Xcode does an excellent job of automatically code signing your app. As the name suggests, code signing is a way of verifying that you wrote the code inside the app and that it hasn’t changed since you wrote it. Code signing is required before a user can install an app on a device. Your signature is a distribution certificate that you get from Apple and is unique to your developer account.

However, the certificate alone is not enough. You also need an App ID, a value that uniquely identifies your app among all other apps on the App Store.

Your App ID and distribution certificate make up a provisioning profile that you include in the app’s binary. The profile verifies that (a) this is your unique app, and (b) you signed it and didn’t change it after that signing.

You can see all these parts in Xcode. Open this chapter’s starter project or the app you want to distribute. In the Project navigator, click the name of the project and then the app target. Open the Signing & Capabilities tab.

You’ll find all the relevant information for signing your app under Signing. The Provisioning Profile is the same for iOS and macOS, making macOS distribution much simpler.

Setting up an App ID

First, you need to create your app’s app ID. You’ll do that in Apple’s developer portal.

Head to developer.apple.com, and click Account in the top-right corner. Log in with your Apple Developer ID.

Once logged in, navigate to Certificates, IDs & Profiles and then to Identifiers.

Creating an app identifier.
Creating an app identifier.

Click the + button next to the header to add a new app ID. Select App IDs and click Continue.

On the next screen, select App as the type. For the Bundle ID, enter the one you saw earlier in Xcode. The Description isn’t public but helps you remember which identifier is which, so pick something memorable. Click Continue.

Note: If you’re using features like CloudKit, push notifications or other capabilities, you must enable them on this screen. Most are self-explanatory, and if you don’t know what they are, you probably don’t need them. You can also enable these later.

The next screen is an overview of the App ID. If everything looks good, click Register. Now you have a new App ID that you can use to create a new app on App Store Connect.

Adding an App Entry

Note: If you already have an existing app entry on App Store Connect, skip to the next section.

App Store Connect is where your app’s binary meets the App Store. You can create new App Store apps and add data like the app title, description or screenshots. Most importantly, it’s where you upload, test and release the app.

Go to App Store Connect and click My Apps. Click the + button in the top-left corner and select New App.

Creating a new app in App Store Connect.
Creating a new app in App Store Connect.

For Platforms select macOS and, optionally, iOS. Here comes one of the most important decisions of your app’s life: its name.

This is the name that appears on the App Store. Call upon your inner Don Draper and enter something short but catchy. Enter “Journalyst, An app to remember”. See what you did there?

The Primary Language determines in which language the App Store will display the app’s name and description if there’s no localization for the user’s locale. For the Bundle ID, choose the one you just created in the Developer Portal.

You might be thinking, “What the heck is an SKU?” SKU is short for Stock Keeping Unit. It comes from the retail world, where each product has a number to identify it. All you need to know is that this should be a value that’s unique among your apps. Your bundle ID will do just fine, but feel free to use whatever identifying system you like.

User Access refers to the members of your development team. It determines which of your colleagues can edit the app’s information. Consider choosing Full Access, especially when you have only one developer on the team. :]

Filling new app information.
Filling new app information.

Note: Don’t worry about getting something wrong. You can change everything except the SKU later.

Finally, click Create to make a new app entry.

App Store Connect page.
App Store Connect page.

Welcome to your app’s dashboard!

There are four tabs at the top of the dashboard:

  • App Store contains everything related to your app’s presentation on the App Store, including the app’s title and description, keywords, prices and released app versions.
  • Services is where you add information related to different app services, like game center groups, encryption information and promo codes.
  • TestFlight lets you manage beta versions of your app and distribute them to your testers.
  • Xcode Cloud lets you make automatic builds in the cloud.

Next, you’ll upload your 1.0 build.

Uploading a Build

Your app entry can hold apps for multiple platforms and versions of each of those apps. You’ll see a new macOS App section and a new version called 1.0 Prepare for Submission. Now you have a place to upload your app.

Note: If you didn’t add the macOS platform earlier, add it now. Click Add macOS App in the sidebar on the left of your app’s dashboard, and you’ll see the macOS App section.

Next, go back to Xcode to upload a new build of your app to App Store Connect.

First, make sure your project compiles without any errors. Then, in the menu bar, go to Product ▸ Destination and make sure you’ve selected My Mac. Click Product ▸ Archive to compile your app and create an executable to upload to the app store. Depending on the size of your app, this process might take a few minutes, so make sure to bring snacks! :]

Once it finishes archiving, Xcode will open the Organizer and show your app’s archives. Select the one you just created.

Xcode Organizer.
Xcode Organizer.

First, click Validate App. Make sure you check the check mark for uploading symbols and click Next. Select Automatically manage signing and click Next again. Xcode will ask you to generate a Mac Installer Distribution certificate on the next screen. Check that checkbox and click Next.

Xcode will create a new Mac Distribution certificate and store it in your Keychain. It’s recommended you click Export Signing Certificate… and save it somewhere secure so you or your colleagues can make builds from other machines. Click Next. Make sure you checked Generate an Apple Distribution certificate and click Next again. Export that one, and — you guessed it — click Next.

Finally, you’ll see an overview screen of your app’s package. Click Validate to ensure there aren’t any issues with the app.

Now you’re back to where you started, in the organizer window. Upload the app by clicking the big blue Distribute App button. Select App Store Connect and click Next. Then select Upload and click Next again.

Uploading to the app store is just clicking a bunch of buttons, isn’t it?

Make sure you check the checkbox for uploading symbols and click Next. Select Automatically manage signing. On the next screen, click Upload. Depending on your connection, this might take a while, so give your clicking finger some rest.

Once uploaded, go back to App Store Connect and open your newly created app. In the sidebar, click 1.0 Prepare for Submission under macOS App. This is where you’ll edit all the information about the 1.0 version of your app.

Editing your app's information.
Editing your app's information.

There are several fields to fill out here. Here’s some basic information about the most important fields:

  • App Preview and Screenshots: These are videos and screenshots of your app. For macOS, the screenshots need to be 16:10 and can only be a specific set of predefined resolutions, as described in the Screenshot specifications under Mac. App previews must be 1920 x 1080 pixels videos with additional requirements described on the App store connect help page.
  • Promotional Text: This bit of text displays under your app’s title. It’s a short description of what the app does. Aim for something that will make the user click your app.
  • Description and Keywords: These are very important for ASO or App Store Optimization. If you describe your app well and choose suitable keywords, your app will show up more prominently when users search for related terms.
  • Build: This is where you select which of your app’s uploaded binaries you want to release. Click the + button, select the 1.0 build you uploaded earlier and click Done.
  • App Review Information: This is where you write notes for the person reviewing your app. Look at the App Store Review Guidelines. If your app does things that would make a reviewer suspicious, explain why you’re not breaking any guidelines. Also, if your app has login functionality, create a fake user and provide the username and password to save the reviewer time and reduce the chance they’ll reject your app for silly reasons.

The rest of the fields are self-explanatory. It may seem like a lot of information, but investing time in getting your metadata right could be the difference between a hit and an app nobody has ever heard of.

Testing Your App With TestFlight

Now that you have everything filled out, it’s good practice to make sure everything works as intended before releasing your app to the world. This is where TestFlight kicks in.

Apple’s TestFlight lets you test your apps and invite outside testers to check out beta versions of your apps. The process is streamlined to make it easy, both for you and your testers.

TestFlight distinguishes between two types of testers, internal and external. Internal testers are part of your team, and they can test builds almost immediately after you upload them. On the other hand, your app needs to go through an app review before being released to external testers. Thankfully, Apple seems to be more lenient and faster when reviewing beta apps, so the review shouldn’t take too long.

Beta Testing Inside Your Team

Go to the TestFlight tab, where you’ll manage all your beta testing. Here, you’ll see a list of your builds available for testing. Each build is available for testing for 90 days after uploading. Usually, that won’t be an issue since there’s no need to test old builds!

Test Flight builds.
Test Flight builds.

Click the + button next to Internal Testing and create a new group to add testers. Give it a descriptive name. If you check Enable automatic distribution, whenever you upload a new build from Xcode, it’ll automatically invite the people in the group to test your app without you clicking any buttons. This automation is especially handy for internal testing.

Click the + button next to Testersto invite a new tester. You’ll see a list of your team members. Invite them by checking the checkbox next to their name and clicking Add.

Inviting internal testers to TestFlight.
Inviting internal testers to TestFlight.

Once invited, the testers will get an email instructing them to download the TestFlight macOS app and a link to test the app.

Now your teammates can test the app, but what about people outside your company?

Adding External Testers

Before you add any external testers, there are a few things you have to fill out.

In the sidebar, click Test Information. First, write your app’s Beta App Description. In this field, in addition to describing your app, it’s helpful to mention which features are in development or any known issues you’re having so that your testers are aware of these while checking your app. Other fields are self-explanatory.

Beta App Review Information is not available to testers; It’s used for Apple’s App Review.

Test information in TestFlight.
Test information in TestFlight.

Next, create a new tester group under External Testing as you did for internal testers.

Adding external testers to TestFlight.
Adding external testers to TestFlight.

There are two ways to invite new testers, either via a public link or private email. The public link lets anyone that clicks the link test your app. This is especially useful if you want to share your app on social media or other public channels.

If you’d like to keep your testing more private, you can also invite someone by entering their email. Click the + button next to Testers and then click Add New Testers. Type in their emails and, optionally, their names and click Add.

While internal testers can receive builds automatically, you must manually add builds to external tester groups. Click the + button next to Builds and select the build you uploaded. The first time you do this, your build will go to Apple for App Review. Once it goes through, all your testers will receive an email inviting them to test your new build.

Releasing Your App

You uploaded your build, filled out all the necessary metadata and even tested to make sure it works. All that’s left is to release your app to the App Store masses.

Pricing Your App

In the App Store tab, go to Pricing and Availability in the sidebar. Set the price of your app under Price Schedule. You can choose from almost 100 different pricing tiers for your app. Each of the tiers has a roughly similar price in all currencies. Once you select a price, click Other Currencies to see the exact values in each territory.

You can also make your app available for pre-order, which makes your app appear in the App Store even before you release your first version.

If you want to charge a subscription price or offer in-app purchases, do that under In-App Purchases in the sidebar.

Submitting for Review

Once you’ve filled everything out, click Save in the top-right corner and click Submit for Review. A reviewer from Apple will look at your app to ensure you followed the guidelines. This may take a few hours to a few days.

There’s something quite annoying about having a completed app that’s sitting there waiting for review. Be patient and hang in there!

Once your app passes the review, you’ll get an email notification and the name of the version changes to 1.0 Pending Developer Release. In the top-right corner, you’ll see a new button titled Release This Version. Click this button and pop a bottle of champagne! You just released an app!

Note: Your app version changes to 1.0 Pending Developer Releaseif you select Manually release this version under Version Release of your App Store page.

Keep in mind, the App Store might need a few hours to propagate your app, so make sure to wait a while before you start telling all your friends.

Note: Your app won’t be available for universal purchase until you fully release your app on at least two platforms.

Selling Your macOS App Separately

By default, Xcode sets up your project to offer a universal purchase, meaning that users buying your app on the iOS app store get it for free on macOS. With this approach, you might forego the income you’d usually get from a single user, but you give your users a better experience and value for the same price. If your macOS and iOS apps are the same and there’s a reason to expect users to want to have both versions, consider offering a universal purchase.

Instead of offering a universal purchase, you can also separately sell your macOS app by using a different bundle ID for your macOS app. Go back to Xcode and, from the Project navigator, click the project’s name and then the app target. Open the Signing & Capabilities tab. Uncheck the Use iOS Bundle Identifier checkbox and enter a new bundle identifier for your macOS app.

Note: You may have to delete the build setting DERIVE_UIKITFORMAC_PRODUCT_BUNDLE_IDENTIFIER to change the checkbox.

macOS as a separate bundle.
macOS as a separate bundle.

Using this new bundle ID, you can distribute your app on the Mac App Store by repeating the steps described in the previous section.

Key Points

  • You must sign each app with a provisioning profile, which combines a certificate with an app ID.
  • You create app IDs in Apple’s Developer Portal.
  • Manage the app on the App Store by going to App Store Connect.
  • Upload new builds from Xcode.
  • Test beta versions of your app with internal and external testers using Test Flight.

Where to Go From Here?

To ensure you’re not violating any of Apple’s guidelines, carefully read through Apple’s App Store Review Guidelines. Apple also provides a helpful list of common app rejection reasons. Use it as a checklist before submitting.

Now that you understand how to upload new builds, think about automating this for continuous integration using tools like Jenkins and Fastlane. You’ll find an example of how to do this for iOS apps in our Continuous Integration tutorial.

Since you uploaded your app to the App Store, it’s time to think more about optimizing it for the App Store’s search. Apple provides valuable tips on their site.

Finally, make sure to spread the word about your app anywhere you can! App-making is a tricky business, so good luck out there. This entire Book Team is rooting for you! :]

Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum here.
© 2026 Kodeco Inc.