iOS simulator builds

How to build an iOS app without code signing to use in simulator

To test your app on simulators, Apple requires you to create an unsigned iOS app (with the .app extension).

Building an unsigned native iOS app (.app)

For building an unsigned iOS app, please follow the steps outlined in the Native iOS guide, stopping short of the code signing step.

Adjust your build script to use this commands instead:

  scripts:
    - name: Build the .app
      script: | 
        # build using workspace
        xcodebuild build \
          -workspace "MyXcodeWorkspace.xcworkspace" \
          -scheme "MyScheme" \
          CODE_SIGN_IDENTITY="" \
          CODE_SIGNING_REQUIRED=NO \
          CODE_SIGNING_ALLOWED=NO
        #
        # build using project
        # xcodebuild build \
        #    -project ""MyXcodeProject.xcodeproj" \
        #    -scheme "MyScheme" \
        #    CODE_SIGN_IDENTITY="" \
        #    CODE_SIGNING_REQUIRED=NO \
        #    CODE_SIGNING_ALLOWED=NO

Your artifact will be generated at the default Xcode path. You can access them by adding the following pattern in the artifacts section of codemagic.yaml:

  artifacts:
    - $HOME/Library/Developer/Xcode/DerivedData/**/Build/**/*.app

If you have Xcode Debugging Symbols enabled, the dSYM file will be generated in the same directory as the app and can be accessed with the following artifact pattern:

  artifacts:
    - $HOME/Library/Developer/Xcode/DerivedData/**/Build/**/*.dSYM

Building an unsigned Maui .NET7 iOS app (.app)

Adjust your build script to use these commands:

scripts:
  - name: Build the app for iOS Simulator
    script: |
      cd MauiNet7
      $DOTNET dotnet build -f net7.0-ios -c Debug  -o ../artifacts      

Your artifact will be generated at the default artifacts path. You can access it by adding the following pattern in the artifacts section of codemagic.yaml:

  artifacts:
    - ./artifacts/*.app

Native iOS example

The following codemagic.yaml file shows a sample workflow that builds a .zip archive containing the .app file inside.

workflows:
  simulator-native-ios:
    name: iOS simulator build
    max_build_duration: 120
    instance_type: mac_mini_m1
    environment:
      vars:
        XCODE_WORKSPACE: "your_workspace_name.xcworkspace"
        XCODE_SCHEME: "your_workspace_name"
      xcode: 13.0
      cocoapods: default
    scripts:
      - name: Install CocoaPods dependencies
        script: | 
          pod install
      - name: Build the .app
        script: | 
          xcodebuild build \
            -workspace "$XCODE_WORKSPACE" \
            -scheme "$XCODE_SCHEME" \
            -sdk iphonesimulator \
            -destination 'platform=iOS Simulator,name=iPhone 14 Pro,OS=16.2' \
            -configuration Debug \
            CODE_SIGN_IDENTITY="" \
            CODE_SIGNING_REQUIRED=NO \
            CODE_SIGNING_ALLOWED=NO 
    artifacts:
      - /tmp/xcodebuild_logs/*.log
      - $HOME/Library/Developer/Xcode/DerivedData/**/Build/**/*.app
      - $HOME/Library/Developer/Xcode/DerivedData/**/Build/**/*.dSYM

Maui .NET7 example

The following codemagic.yaml file shows a sample workflow that builds a .zip archive containing the .app file inside. You can find a complete project showcasing these steps in our Sample projects repository.

workflows:
  maui-ios-simulator-build:
    name: Dotnet MAUI iOS Simulator
    max_build_duration: 120
    instance_type: mac_mini_m1
    environment:
      xcode: latest
      vars:
        DOTNET_PATH: $CM_BUILD_DIR/dotnet
        DOTNET: $CM_BUILD_DIR/dotnet/dotnet
    scripts:
      - name: Install .NET SDK
        script: | 
          wget https://dot.net/v1/dotnet-install.sh
          chmod +x dotnet-install.sh
          ./dotnet-install.sh --channel 7.0 --install-dir $DOTNET_PATH
      - name: Add nuget source
        script: |
                    $DOTNET nuget add source https://www.myget.org/F/caliburn-micro-builds/api/v3/index.json --name CaliburnNuGet.org
      - name: Install MAUI
        script: |
          $DOTNET_BIN nuget locals all --clear
          $DOTNET workload restore
          $DOTNET workload install maui-android maui-ios \
          --source https://aka.ms/dotnet7/nuget/index.json \
          --source https://api.nuget.org/v3/index.json          
      - name: Build the app for iOS Simulator
        script: |
          cd MauiNet7
          $DOTNET dotnet build -f net7.0-ios -c Debug  -o ../artifacts          
    artifacts:
    - ./artifacts/*.app