While working on an iOS app with SwiftUI, I thought I should trying converting it to a Catalyst app.

Just 1 checkbox to enable

It’s easy. In Deployment Info, enable Mac.

It’s easy, but there’re couple of issues I faced.

Provisioning Profiles

I use fastlane match, and it ran into an issue. My app uses App Group, and the profiles would never include the capability. Apple developer portal does not have the option to add the capability for macOS Catalyst, somehow.

The solution: Let Xcode manage, and it will be fine 🤷🏻‍♂️

Same App ID as iOS?

The option Use iOS Bundle Identifier has implications.

  • Enabled: Universal Purchase, 1 app, multiple platforms
  • Disabled: Use different ID, different apps on App Store Connect

Most likely you want it enabled so that it is 1 app family. Pay once, use anywhere.


I use Cocoapods, and also SPM.

For Cocoapods, if any of the frameworks is unsupported (eg. Fabric), they have to be excluded for macOS Catalyst.

There is good solution by fermoya to not compile those pods. The ruby script he provided is here, and it works like this in Podfile:

load 'remove_unsupported_libraries.rb'

def unsupported_pods
   ['Fabric', 'Crashlytics', 'Firebase']

def supported_pods

post_install do |installer|
   installer.configure_support_catalyst(supported_pods, unsupported_pods)

Preprocessor Code

Even after you exclude unsupported frameworks, you will still need to write some preprocessor codes like this:

#if !targetEnvironment(macCatalyst)
import Firebase
import Crashlytics

Or you might be using #available:

if #available(macCatalyst 13.4, *) {

NOTE: #available is not a preprocessor code. If you try to use it in a ViewBuilder (eg Group, VStack), it will have error that the closure can’t be used in a ViewBuilder.

Final thoughts

Catalyst is very new technology. There’s still lots to improve on. SwiftUI has so much limitations and bugs!

But it’s a great feeling when you can write once and it runs on iPhone, iPad, and macOS.




Back to Home