Search code examples
iosmacosuikitmac-catalyst

isiOSAppOnMac vs. isMacCatalystApp?


I have an app that runs on target "My Mac (Designed for iPad)" and also presets in the Mac App Store as an iPad app. This requires Apple Silicon, also, so... it's not catalyst? Does it have a name? How is catalyst different in implementation? Does Catalyst require switching from UIKit to AppKit?

I see there are two flags here:

extension ProcessInfo {
    @available(iOS 13.0, *)
    open var isMacCatalystApp: Bool { get }

    @available(iOS 14.0, *)
    open var isiOSAppOnMac: Bool { get }
}

Solution

  • Your "Mac (Designed for iPad)" app is just an iPad app. Apple Silicon Macs can run iPad apps as-is. The app looks and works just like it does on the iPad. Such an app requires no additional work but it also does not take any advantage of any macOS features nor does it have the exact same look-and-feel of a native macOS app.

    A "Mac (Mac Catalyst)" app is still written (mostly) in UIKit but it allows your app to run on Intel and Apple Silicon Macs. It starts out as your same iPad app. But you now have the ability to make it look and work a bit more like a native macOS app. It can make use of some AppKit APIs (only those specifically indicated as supporting Mac Catalyst). You need to specifically build and submit the macOS version of your iOS app. Even though you post two separate builds, they are part of the same app and share the same setup such as in-app purchases.

    isiOSAppOnMac only returns true when your "Designed for iPad" iOS app is running on an Apple Silicon Mac.

    isMacCatalystApp returns true if your "Designed for iPad" iOS app is running on an Apple Silicon Mac or when your "Mac Catalyst" iOS app is running on any Mac.

    See Mac Catalyst in the documentation for complete details.