NewiPhone Duo, live in your browser. Try it →
Vibeview
Pricing
Cloud Builds · Native

Build a native iOS app without a Mac, plus Android

Rokas Kašinskas — Co-founder, VibeViewPublished 2026-10-16Updated 2026-10-16

A native app builds with xcodebuild for iOS and the Gradle wrapper for Android. What it still needs is the machine. Xcode only runs on macOS, and an Android build wants the right SDK platforms and JDK installed. VibeView cloud builds provide both. The CLI uploads your project source, the build runs in a clean environment, and the finished build lands next to your app, ready to run on a device you open in a browser tab.

This guide covers an iOS app and an Android app, each from source to a running build, then a signed Android release. They can live in one repository or two. It works the same from Windows, Linux or macOS.

What you need

  • A VibeView account and the CLI: npm install -g vibeview && vibeview login. CLI 0.42.0 or later suggests the native commands; on an older CLI, type them in when it asks.
  • For iOS: an Xcode project at the root of your repository or one folder down.
  • For Android: the Gradle wrapper (gradlew and gradle/wrapper/) committed, at the repository root or in an android/ folder.

You don’t need Xcode, the Android SDK or a JDK locally. Every plan includes cloud builds each month; builds beyond your plan’s allowance draw from usage credit. The pricing page has each plan’s numbers.

Part 1: debug builds on cloud devices

  1. Start a build from your repository root.

    vibeview build --cloud --platform ios

    The first run asks for the build command and where the result lands, and saves the answers to vibeview.json. For an Xcode project with one app target the CLI suggests an unsigned simulator build:

    {
      "defaultPlatform": "ios",
      "platforms": {
        "ios": {
          "build": {
            "command": "xcodebuild -project MyApp.xcodeproj -scheme MyApp -configuration Debug -sdk iphonesimulator -derivedDataPath build CODE_SIGNING_ALLOWED=NO",
            "artifact": "build/Build/Products/Debug-iphonesimulator/*.app"
          }
        }
      }
    }

    The scheme is the project’s shared scheme, or the app target’s name when it shares none, which is the scheme Xcode creates for it. With a Podfile next to the project, the command starts with pod install and builds the workspace, because the Pods folder isn’t uploaded. Swift packages resolve during the build.

  2. Build the Android app the same way.

    vibeview build --cloud --platform android

    With the wrapper at the repository root, the CLI suggests building the one module that applies the Android application plugin, here app:

    {
      "platforms": {
        "android": {
          "build": {
            "command": "./gradlew :app:assembleDebug",
            "artifact": "app/build/outputs/apk/debug/*.apk"
          }
        }
      }
    }

    With the wrapper in an android/ folder instead, and no package.json in the repository, it suggests cd android && ./gradlew assembleDebug.

    The wrapper downloads your project’s own Gradle version, and the builders have the Android SDK with Java 17 and 21.

  3. Run them. A succeeded build lands in the app’s Build history with a cloud badge. If the project had no app yet, the build creates one from the binary (name, bundle id and icon included) and the CLI writes its appId into vibeview.json. Open the build’s page and choose Run this build to start it on a cloud iPhone or Android emulator.

You’ll know it worked when the build page shows added to app builds on its timeline and the app opens on the device. If the CLI finds several Xcode projects, shared schemes or app modules, it doesn’t guess: it asks you to enter the command, and the examples above are the shape to follow.

Apple TV and Android TV

A tvOS app builds with the same xcodebuild command and -sdk appletvsimulator; the app lands in Debug-appletvsimulator. An Android TV app is a Gradle build like any other, and needs both x86 and x86_64 native code if it has any, so it runs on every Android TV emulator. Build them with --platform tvos and --platform androidtv. The CLI doesn’t suggest TV development build commands, so enter yours when it asks. The Apple TV and Android TV build guide goes through a TV project end to end.

Part 2: a signed .aab for Google Play

The release is a signed .aab for the store, not a build that runs on a VibeView device, so it lands on the Builds page with a Download action.

  1. Get a keystore. Upload the one you have with vibeview credentials add --platform android --file release.jks, or let VibeView make one with vibeview credentials generate --platform android --name release.

  2. Point Gradle at it. Add the signing block from App Signing to your app module’s Gradle file, in Groovy or Kotlin DSL. VibeView sets the four properties it reads only during a production build, so your local builds keep working as before.

  3. Build the release.

    vibeview build --cloud --production --platform android

    The first run offers ./gradlew :app:bundleRelease, with the artifact at app/build/outputs/bundle/release/*.aab. Then vibeview submit --platform android --latest --track internal uploads it to Google Play; the Android cloud build guide covers the one-time Play Console setup.

For iOS, a production build is your own xcodebuild archive command, signed with an Apple certificate and profile VibeView can create for you: App Signing has the archive and export settings, and Upload to TestFlight without a Mac the TestFlight step.

Troubleshooting

  • The Android build fails with exit code 127 or Permission denied on ./gradlew. The wrapper isn’t committed, or lost its executable bit. Commit gradlew and gradle/wrapper/, and run git update-index --chmod=+x gradlew.
  • The iOS build fails asking for a signing certificate or team. The command is missing CODE_SIGNING_ALLOWED=NO. A simulator build doesn’t need signing.
  • The build succeeds but says it can’t run on VibeView devices. The command made a device build. Check that it passes -sdk iphonesimulator, and that the Android artifact is an .apk, not an .aab.
  • An artifact isn’t found. Run vibeview build from the directory the paths start from, usually the repository root.

Frequently asked questions

Frequently asked questions

Can I build a Swift app without a Mac?

Yes. The iOS cloud build runs xcodebuild on a macOS builder with a stable Xcode release, and the simulator build opens on a cloud iPhone in your browser. You still need an Apple Developer account to sign and publish a production build.

Which Xcode and Java versions do the builds use?

Every iOS build uses the same stable Xcode, and its log starts with the Xcode and iOS SDK versions. Android builds run Gradle on Java 17 with Java 21 installed beside it. The Cloud Builds docs say how to pick between them.

My Android project is in an android/ folder. Does that work?

Yes. The CLI suggests cd android && ./gradlew assembleDebug, with the artifact at android/app/build/outputs/apk/debug/*.apk. The artifact path uses your app module’s name when the CLI finds exactly one; otherwise check it.

Next steps

Try it yourself

Open a live iOS simulator or Android emulator in your browser.

Start free