yonaskolb / XcodeGen

A Swift command line tool for generating your Xcode project
MIT License
6.88k stars 809 forks source link

Disallow the "watchOS" supported destination for multiplatform apps #1470

Closed tatsuky closed 1 month ago

tatsuky commented 2 months ago

This PR addresses #1463, where the "Embed Watch Content" build phase isn't automatically generated when a watchOS app is created using the supportedDestinations configuration.

According to Apple's documentation:

iOS, iPadOS, macOS, visionOS, and tvOS apps can share a single target. watchOS apps remain in a separate target.

Xcode 15.3 is also not capable of creating multiplatform apps that contain the watchOS supported destination. Such the option does not show up on the UI:

The "watchOS" destination does not show up for multiplatform apps on Xcode 15.3

Provided Xcode doesn't support it now, I had XcodeGen error out when supportedDestinations for an application contains watchOS. I added a new validation error case because I think this is an exceptional case that needs a special consideration.

We can continue to create a watchOS app as an independent target by using the platform configuration as before. This PR does not affect the configurations of non-application targets.

Tests

You can use the following example specs to verify the changes.

A "success" case using platform

name: MyApp
options:
  bundleIdPrefix: com.myapp
targets:
  UniversalApp:
    dependencies:
      - target: WatchApp
    supportedDestinations: [iOS, macOS]
    type: application
    sources:
      - Universal
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.myapp.UniversalApp
    info:
      path: Universal/Info.plist
  WatchApp:
    platform: watchOS
    type: application
    sources:
      - Watch
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.myapp.UniversalApp.WatchApp
    info:
      path: Watch/Info.plist
      properties:
        WKCompanionAppBundleIdentifier: com.myapp.UniversalApp
        WKApplication: true
An "error" case using supportedDestinations

name: MyApp
options:
  bundleIdPrefix: com.myapp
targets:
  UniversalApp:
    dependencies:
      - target: WatchApp
    supportedDestinations: [iOS, macOS]
    type: application
    sources:
      - Universal
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.myapp.UniversalApp
    info:
      path: Universal/Info.plist
  WatchApp:
    supportedDestinations: [watchOS]
    type: application
    sources:
      - Watch
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.myapp.UniversalApp.WatchApp
    info:
      path: Watch/Info.plist
      properties:
        WKCompanionAppBundleIdentifier: com.myapp.UniversalApp
        WKApplication: true
tatsuky commented 2 months ago

Hi @yonaskolb, @bcardarella and @FelixLisczyk

I'm aware that this fix uses a little different approach than what was suggested in the issue discussion. Could you take a look at the change and let me know what you think? Thanks.

tatsuky commented 2 months ago

@freddi-kit, @giginet Just updated CHANGELOG - PTAL.