iOS

Build native iOS mobile applications with Bini.js.

iOS Overview

Bini.js allows you to build native iOS mobile applications using Tauri v2. Your React app runs inside a WKWebView with full access to native iOS APIs and features.

Native iOS App

Real native WKWebView, not a wrapper

Code Signing

Xcode-managed automatic signing

Auto Plugin Wiring

bini-native wires iOS permissions

iOS apps are built using Tauri's iOS backend. Your app runs in a native WKWebView with full system access.

Requirements

Building iOS apps requires different tools depending on your operating system. See the section for your OS below.

  • On macOS: Xcode, Xcode Command Line Tools, CocoaPods, Node.js, and Rust with iOS targets - everything runs locally.
  • On Windows or Linux: Node.js, Git, a GitHub account, and the ability to push a repo. The iOS build itself runs on GitHub Actions.

Add the required Rust targets with rustup:

>_Terminal
$ rustup target add aarch64-apple-ios
$ rustup target add x86_64-apple-ios
$ rustup target add aarch64-apple-ios-sim
You cannot produce a native iOS .app directly from Windows or Linux. Tauri v2 has no supported local cross-compilation path for iOS. The recommended way is GitHub Actions on a macos-latest runner, described in each section below.

macOS

On macOS you can scaffold, develop, and build the iOS app entirely on your own machine - no CI required.

Step 1: Install the tools

  • macOS 11 (Big Sur) or higher
  • Node.js 20.19.0 or higher
  • Xcode - Download from the Mac App Store
  • Xcode Command Line Tools - run xcode-select --install
  • CocoaPods - run sudo gem install cocoapods
  • Rust via rustup, then add the iOS targets (see Requirements)

Step 2: Create the project

Create the Project

Create a new Bini.js project targeting iOS, install its dependencies, and install its pods:

>_Terminal
$ npx create-bini-app@latest my-app --platform ios
$ cd my-app
$ npm install
$ pod install --project-directory=src-tauri/gen/ios

Or use the interactive prompt and select iOS:

>_Terminal
$ npx create-bini-app@latest
>_Terminal
? Select target platform:
Web Application
Windows Desktop
Linux Desktop
macOS Desktop
Android
> iOS
 
↑↓ navigate • ⏎ select

Step 3: Develop and build

Run ios to launch on the simulator or a connected device, then ios:build to produce the app bundle:

>_Terminal
$ npm run ios
>_Terminal
$ npm run ios:build
Tip: Xcode handles signing automatically with your Apple ID for development builds.

Windows

A native iOS .app cannot be produced on Windows - Tauri relies on Xcode, Apple's signing toolchain, and CocoaPods, none of which run on Windows. The Tauri team's own recommendation is to build iOS apps on a macos-latest runner in CI.

Your Windows machinenpm run deployGitHub Actions (macos-latest)ios-build artifact

Step 1: Install the tools

Install Node.js 20.19.0 or higher and Git for Windows - Download.

Step 2: Create the project

Create the Project

Create a new Bini.js project targeting iOS, install its dependencies, and install its pods:

>_Terminal
$ npx create-bini-app@latest my-app --platform ios
$ cd my-app
$ npm install
$ pod install --project-directory=src-tauri/gen/ios

Or use the interactive prompt and select iOS:

>_Terminal
$ npx create-bini-app@latest
>_Terminal
? Select target platform:
Web Application
Windows Desktop
Linux Desktop
macOS Desktop
Android
> iOS
 
↑↓ navigate • ⏎ select

Add the Build Workflow

The scaffold does not ship with a GitHub Actions workflow. You need to add one manually. Create the file .github/workflows/build-ios.yml inside your project with the following content:

.github
workflows
build-ios.yml
src-tauri
package.json
.github/workflows/build-ios.yml
# .github/workflows/build-ios.yml
name: Build iOS App

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  build-ios:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim

      - name: Install CocoaPods
        run: sudo gem install cocoapods

      - name: Install dependencies
        run: npm install

      - name: Install pods
        run: pod install --project-directory=src-tauri/gen/ios

      - name: Build Tauri app
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tagName: app-v__VERSION__
          releaseName: 'App v__VERSION__'
          releaseDraft: true

Push to GitHub

Run npm run deploy and choose iOS. This initializes the repo, commits, and pushes everything to GitHub in one step:

>_Terminal
$ npm run deploy

Once pushed, the workflow runs on a real macOS runner and builds the iOS app bundle.

Download the App

  1. Open your repository on GitHub and go to the Actions tab.
  2. Open the latest Build iOS App run.
  3. Under Artifacts, download ios-build. Or, if a release was created, download the .ipa from the Releases page.
Why not build locally? Tauri's iOS build needs Xcode and Apple's signing toolchain, which do not exist on Windows. GitHub Actions on macos-latest is the supported path.

Linux

A native iOS .app cannot be produced on Linux - Tauri relies on Xcode, Apple's signing toolchain, and CocoaPods, none of which run on Linux. The Tauri team's own recommendation is to build iOS apps on a macos-latest runner in CI.

Your Linux machinenpm run deployGitHub Actions (macos-latest)ios-build artifact

Step 1: Install the tools

Install Node.js 20.19.0 or higher and Git with your package manager, for example sudo apt install git on Debian and Ubuntu.

Step 2: Create the project

Create the Project

Create a new Bini.js project targeting iOS, install its dependencies, and install its pods:

>_Terminal
$ npx create-bini-app@latest my-app --platform ios
$ cd my-app
$ npm install
$ pod install --project-directory=src-tauri/gen/ios

Or use the interactive prompt and select iOS:

>_Terminal
$ npx create-bini-app@latest
>_Terminal
? Select target platform:
Web Application
Windows Desktop
Linux Desktop
macOS Desktop
Android
> iOS
 
↑↓ navigate • ⏎ select

Add the Build Workflow

The scaffold does not ship with a GitHub Actions workflow. You need to add one manually. Create the file .github/workflows/build-ios.yml inside your project with the following content:

.github
workflows
build-ios.yml
src-tauri
package.json
.github/workflows/build-ios.yml
# .github/workflows/build-ios.yml
name: Build iOS App

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  build-ios:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim

      - name: Install CocoaPods
        run: sudo gem install cocoapods

      - name: Install dependencies
        run: npm install

      - name: Install pods
        run: pod install --project-directory=src-tauri/gen/ios

      - name: Build Tauri app
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tagName: app-v__VERSION__
          releaseName: 'App v__VERSION__'
          releaseDraft: true

Push to GitHub

Run npm run deploy and choose iOS. This initializes the repo, commits, and pushes everything to GitHub in one step:

>_Terminal
$ npm run deploy

Once pushed, the workflow runs on a real macOS runner and builds the iOS app bundle.

Download the App

  1. Open your repository on GitHub and go to the Actions tab.
  2. Open the latest Build iOS App run.
  3. Under Artifacts, download ios-build. Or, if a release was created, download the .ipa from the Releases page.
Why not build locally? Tauri's iOS build needs Xcode and Apple's signing toolchain, which do not exist on Linux. GitHub Actions on macos-latest is the supported path.

Development

Running ios opens your app on the iOS Simulator or a connected device. This requires a Mac with Xcode installed (see the macOS section):

>_Terminal
$ npm run ios

This launches your app with:

  • Hot reload for frontend changes
  • Native iOS integration
  • Auto-wired native APIs via bini-native
  • Safari Web Inspector for debugging

Setting Up a Simulator

  1. Open Xcode
  2. Go to Settings → Platforms
  3. Download a simulator for your target iOS version
  4. Run npm run ios

Building

Build a distributable iOS app. On macOS this runs locally; on Windows and Linux it runs in GitHub Actions (see those sections):

>_Terminal
$ npm run ios:build

The build outputs land in src-tauri/gen/ios/:

Output Files

src-tauri
gen
ios
build
my-app.app
my-app.ipa
  • my-app.app - iOS app bundle (for simulator/testing)
  • my-app.ipa - iOS App Store package (for distribution)
The build output is a native iOS app that runs on iOS 13.0 and above.

Code Signing

iOS code signing is managed by Xcode. For local development, Xcode uses automatic signing with your Apple ID - just open the project in Xcode and configure your team:

>_Terminal
$ open src-tauri/gen/ios/MyApp.xcodeproj

In Xcode, select the project → Signing & Capabilities → choose your Team. Xcode handles the rest.

For GitHub Actions, store your Apple ID, app-specific password, and team ID as secrets and reference them in the workflow. The tauri-action step reads them from environment variables:

GitHub Actions workflow with signing

.github/workflows/build-ios.yml
# .github/workflows/build-ios.yml
name: Build iOS App

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  build-ios:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim

      - name: Install CocoaPods
        run: sudo gem install cocoapods

      - name: Install dependencies
        run: npm install

      - name: Install pods
        run: pod install --project-directory=src-tauri/gen/ios

      - name: Build Tauri app
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          APPLE_ID: ${{ secrets.APPLE_ID }}
          APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
          APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
        with:
          tagName: app-v__VERSION__
          releaseName: 'App v__VERSION__'
          releaseDraft: true
For App Store distribution, you need an Apple Developer account and provisioning profiles. Development builds use Xcode's automatic signing.

Deployment

npm run deploy pushes your project source to GitHub - it does not build a signed IPA or submit to App Store Connect:

>_Terminal
$ npm run deploy

Deployment Flow

  1. Build your app with npm run ios:build
  2. Run npm run deploy to push source to GitHub
  3. Upload the IPA to App Store Connect manually
Store submission is manual. After building your app, upload it to App Store Connect for TestFlight or App Store distribution.
Was this helpful?