Search the guide

Build Your First iOS App

Write code on Windows or Linux and build for iOS on a cloud Mac. Connect first, check your tools, then resolve dependencies and signing.

Already have an order? Check your instance status and connection details in the console. Payment credentials are not your connection password.

Get the environment working

These three steps cover access and tools only. Don't import production certificates yet or upgrade all dependencies straight away.

  1. Check your connection details

    Sign in to the console and open the relevant order and instance details. Check the node, its status, and the connection address, port and credentials shown on the page.

    The connection address is not your order number. If the instance is still provisioning, check its status first. If you see an error, include your order number in a support request rather than repeatedly resetting the configuration.

  2. Connect to macOS

    Enter the address, port and password in your VNC client. For your first connection, use a lower resolution and check that the keyboard, mouse and windows respond as expected.

    For command-line access, use the SSH details provided for your instance. On your first connection, verify the host fingerprint. If it changes unexpectedly, stop before entering credentials and investigate.

    A laggy desktop doesn't mean the build has stopped. Check your local network first, then lower the display resolution. For build-only tasks, you can use SSH instead.

  3. Check your developer tools

    Make sure the full version of Xcode is installed, then open it once to initialize its components. Command-line tools should point to the Xcode version you intend to build with, not just a standalone tools directory.

    xcode-select -p
    xcodebuild -version
    xcodebuild -showsdks

    If the iOS SDK is missing, install the required Xcode components first. Address a license prompt only if one appears; changing directories won't fix a missing SDK.

Flutter

Start with doctor

Transfer the project, dependency lockfiles and required assets to the Mac. Use the Flutter version already specified by the project. Rule out environment issues before changing application code.

Install the prerequisites

Set up the Flutter SDK, full Xcode and CocoaPods. If the project specifies a Flutter version or Ruby toolchain, follow the repository's requirements to avoid using different versions locally and on the build machine.

Run diagnostics, then address iOS toolchain warnings one by one. A device connection warning may not block archiving, but missing Xcode, SDKs or signing configuration must be fixed first.

Know the difference between the two checks

To check whether the code compiles, start with a release build without signing. This won't produce a signed installable app or a package ready for distribution.

To export an .ipa, check the Team, Bundle Identifier, certificate and provisioning profile in Xcode's Signing & Capabilities, then run the production build.

Run these in order

flutter --version
flutter doctor -v
flutter pub get
flutter build ios --release --no-codesign
flutter build ipa --release

The final command requires complete signing configuration. The output location and export method depend on your Flutter version and command output. When it's done, download the build and verify it locally.

Identify the failing stage before clearing caches
Error clue What to check first What not to do first
CocoaPods not installed Check that CocoaPods is installed and that the current terminal can find the pod command. Don't delete the entire iOS project first.
No profiles / signing Check that the Bundle Identifier, Team and export type match, and verify that the provisioning profile is valid. Don't treat dependency errors and signing errors as the same problem.
Deployment target Check plugin requirements, align the minimum iOS version in the project and Podfile, then install dependencies. Don't change just one target and immediately retry archiving.

React Native

Lock dependency versions

First check the repository's requirements for Node, Ruby and the package manager. Keep the lockfiles so the build machine can reproduce the team's existing environment instead of selecting new dependency versions.

Install JavaScript dependencies first

Use the package manager specified by the project lockfile: npm, Yarn or another existing tool. The commands below are for npm projects with a package-lock.json; use the installation command for other projects.

If the repository includes a Gemfile, use Bundler to pin the CocoaPods version. Only use the required pod command directly if there is no Gemfile. Don't mix global and project toolchains.

Open the workspace next

After installing Pods, open the .xcworkspace in the iOS directory, not just the .xcodeproj. Select the app's actual scheme and archive using the Release configuration.

Before archiving, check the version number, build number and signing settings. After a successful archive, export from Organizer for testing or distribution. A simulator build isn't a substitute for an installable device package.

Reproduce the project environment

node --version
ruby --version
npm ci
bundle install
cd ios
bundle exec pod install

The Bundler commands assume the project includes a Gemfile. If installation fails, keep the first error and relevant version details before trying a fix.

Troubleshoot Hermes separately

If Hermes compilation fails, first check compatibility between the React Native version, Pods lockfile, Xcode version and native dependencies. If the logs say the Node script can't be found, check the Node path used by the build script. Don't disable Hermes or delete all lockfiles first; that can change project behavior and dependency resolution.

Unity

Move and export the project

Keep editing your game on Windows, then build and sign it with Xcode on a cloud Mac. Transfer the complete exported directory, not just a project file.

Check the modules first

Make sure your Unity version and installation support exporting an iOS project on your local machine, and install the matching iOS Build Support module. If you can't export locally, transfer the Unity project to the Mac and build with the same editor version.

Before exporting, check the Bundle Identifier, scripting backend, minimum OS version and plugin platform settings. Save the configuration used for this build.

Transfer the entire directory

Compress and transfer the exported Xcode project along with its assets, native plugins and build scripts. After extraction, check the directory structure so hidden configuration isn't missed and you haven't transferred only the .xcodeproj.

If a plugin depends on CocoaPods, run its required dependency steps before opening the generated workspace. Don't build directly from a temporary archive directory.

Troubleshoot by layer

For IL2CPP or linker failures, start with the first compile error and check native library architectures, framework references and plugin versions. Once the build succeeds, troubleshoot any mismatch between the certificate and provisioning profile.

For large asset bundles, consider the Pro plan: M4 Pro / 64GB / 2TB SSD. Check asset size and available storage first; don't choose a configuration based on the project name.

Re-exporting a Unity project can overwrite manual changes in Xcode. Record any necessary settings and move scriptable changes into the project build process to avoid repeating them next time.

Know the terminology

Connectivity, hardware and signing are separate layers. Knowing what each term means makes it easier to get help without going in circles.

Physical node
Mac hardware running macOS. Your chosen node location affects remote access and file transfer routes, but doesn't change the project's signing requirements.
Dedicated
A dedicated physical Mac assigned to you for the rental period—not a virtual machine, and not shared with other users for CPU or memory. You remain responsible for managing project permissions and build credentials.
VNC
A way to view and control a remote graphical desktop. Useful for setting up Xcode for the first time and checking archives. Responsiveness depends on your local network and display resolution.
self-hosted runner
A CI runner installed on a machine you manage. Builds run on that Mac; your team is responsible for configuring registration tokens, job permissions and cleanup policies.
Unified memory
Memory shared by processing and graphics tasks on Apple Silicon. Project size, parallel builds and open tools all use this resource.
Signing certificate
An identity credential used to sign an app. Signing usually also requires its matching private key. Importing a certificate without the corresponding private key may not be enough to complete signing.
Provisioning Profile
A profile that links an app identifier to signing permissions and a distribution method. It must match the certificate, Team, app capabilities and export type.
.ipa
An app package for iOS devices. Generating the file doesn't mean it can be installed on any device; installation and distribution depend on signing and the export method.

After the build, double-check

Take your build artifacts with you, and keep track of your rental period and data. Closing the remote desktop window doesn't stop your rental.

How do I renew if I'm not finished?

Before expiry, open the console and check the renewal options, bill and expiry date for your current service. Confirm the period and amount, then pay and check that the service term has been updated. If payment has been submitted but the status hasn't changed, include your order number and transaction details in a support request. Don't rely on a payment screenshot alone to confirm renewal.

I've finished building. How do I stop the service?

Services are prepaid by the day, week, month or quarter and stop at expiry if not renewed. If you finish early, export your files first, then check the service term and available options in the console. Disconnecting from VNC or SSH, or manually shutting down the system, doesn't confirm billing status or mean you'll receive an automatic refund.

Will my files still be there after expiry?

After expiry and shutdown, data is deleted in accordance with the service terms. Don't treat a shut-down machine as a backup drive. Before expiry, export your source code, .ipa, Archive, dSYM and necessary configuration, then check that the files are readable locally. Securely back up certificates and private keys according to your team's policies. Once they're no longer needed, remove sensitive credentials from the remote machine. Don't assume you can reconnect or recover files after expiry.

Which payment methods can I use to renew?

We accept only USDT-TRC20 and Visa / Mastercard / Amex (via Stripe). All payments are charged in US dollars (USD); available gateways depend on the response from the backend. For payment issues, include your order number, payment method and transaction status. Never send full card numbers, security codes, passwords or private keys by email or support ticket.

Give us the full error details

For existing orders, submit a support ticket through the console. For pre-sales questions or if you can't sign in, check the contact page for email options. Requests are handled in ticket order; response times are not guaranteed unless confirmed.

Include the steps to reproduce

Provide your order number, framework and Xcode versions, steps taken and the time the issue occurred, including your time zone. For build issues, include the first error and surrounding logs, not just a screenshot of the final “failed” line.

Remove sensitive information

Redact passwords, tokens, private keys and customer information from logs. For availability claims, include the affected time range. For payment issues, provide the transaction ID; don't attach unrelated source code.

If the connection drops, say whether VNC and SSH were both affected and what happened after switching local networks. This helps distinguish access issues from build issues.

Still stuck?

Include your order number and the first error, and we'll help you pick up from the exact step.