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 (
gradlewandgradle/wrapper/) committed, at the repository root or in anandroid/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
-
Start a build from your repository root.
vibeview build --cloud --platform iosThe 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
Podfilenext to the project, the command starts withpod installand builds the workspace, because thePodsfolder isn’t uploaded. Swift packages resolve during the build. -
Build the Android app the same way.
vibeview build --cloud --platform androidWith 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 nopackage.jsonin the repository, it suggestscd android && ./gradlew assembleDebug.The wrapper downloads your project’s own Gradle version, and the builders have the Android SDK with Java 17 and 21.
-
Run them. A succeeded build lands in the app’s Build history with a
cloudbadge. If the project had no app yet, the build creates one from the binary (name, bundle id and icon included) and the CLI writes itsappIdintovibeview.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.
-
Get a keystore. Upload the one you have with
vibeview credentials add --platform android --file release.jks, or let VibeView make one withvibeview credentials generate --platform android --name release. -
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.
-
Build the release.
vibeview build --cloud --production --platform androidThe first run offers
./gradlew :app:bundleRelease, with the artifact atapp/build/outputs/bundle/release/*.aab. Thenvibeview submit --platform android --latest --track internaluploads 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 127orPermission deniedon./gradlew. The wrapper isn’t committed, or lost its executable bit. Commitgradlewandgradle/wrapper/, and rungit 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 buildfrom 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
- Cloud Builds, App Signing and Store Submission: the reference docs
- Build a Kotlin Multiplatform iOS app without a Mac: shared Kotlin code with a native app on each side
- Build an Apple TV app without a Mac: the TV version