Refactor Apple platform overlay for Tauri app

Move hand-authored Apple platform files to src-tauri/apple/. Add bootstrap.sh for idempotent overlay into gen/apple/. Simplify gen/apple/.gitignore and remove tracked files from gen/apple/. Update documentation and workflow for Tuist and Apple targets.

Seto Elkahfi committed Mar 7, 2026 at 11:48 UTC 582adcc967a62ff20ffdcc035633033033584b4d
45 files changed +143 -384
examples/tauri-app/src-tauri/.gitignore
+9 -48
@@ -3,53 +3,14 @@
3 /target/
4
5 # ============================================================
6 -# gen/apple — Tauri scaffolds this directory on `cargo tauri ios init`.
7 -# A nested .gitignore at gen/apple/.gitignore handles the fine-grained
8 -# rules for that subtree. The entries below are a belt-and-suspenders
9 -# safety net at this level.
10 -# ============================================================
11 -
12 -# Rust static libraries produced by the Xcode build phase script
13 -gen/apple/Externals/
14 -
15 -# Xcode project & workspace — regenerated by `tuist generate`
16 -# (Project.swift is the source of truth, not these files)
17 -gen/apple/*.xcodeproj/
18 -gen/apple/*.xcworkspace/
19 -
20 -# Tuist derived sources / plists — regenerated by `tuist generate`
21 -gen/apple/Derived/
22 -
23 -# Xcode per-user settings
24 -gen/apple/xcuserdata/
25 -
26 -# Xcode build artefacts
27 -gen/apple/build/
28 -
29 -# XcodeGen manifest — regenerated by `cargo tauri ios init`.
30 -# We use Project.swift (Tuist) as the Xcode project source of truth.
31 -gen/apple/project.yml
32 -
33 -# ============================================================
34 -# The following gen/apple files ARE intentionally tracked because
35 -# they are either hand-authored or not regenerated by Tauri/Tuist:
6 +# gen/apple — entirely regenerated, never edit in place.
7 +#
8 +# Workflow:
9 +# 1. cargo tauri ios init → scaffolds gen/apple/
10 +# 2. ./apple/bootstrap.sh → overlays Tuist + Apple platform targets
11 +# 3. tuist generate --no-open → builds .xcodeproj from Project.swift
12 #
37 -# Project.swift — Tuist project manifest (our source of truth)
38 -# Tuist.swift — Tuist configuration
39 -# mise.toml — Tuist version pin
40 -# README.md — workflow documentation
41 -# tauri-app_iOS/Info.plist — iOS app Info.plist (Tauri reads this)
42 -# tauri-app_iOS/*.entitlements — iOS entitlements
43 -# tauri-app_tvOS/App.swift — native tvOS app entry point
44 -# tauri-app_tvOS/Info.plist — tvOS Info.plist
45 -# tauri-app_watchOS/App.swift — native watchOS app entry point
46 -# tauri-app_watchOS/Info.plist — watchOS Info.plist
47 -# tauri-app_watchOS/Assets.xcassets/ — watchOS-specific icon asset catalog
48 -# tauri-app_visionOS/App.swift — native visionOS app entry point
49 -# tauri-app_visionOS/Info.plist — visionOS Info.plist
50 -# Sources/ — Obj-C/C++ glue generated once by Tauri
51 -# Assets.xcassets/ — shared app icons & asset catalog (iOS/tvOS/visionOS)
52 -# LaunchScreen.storyboard — iOS launch screen
53 -# ExportOptions.plist — archive export options
54 -# Podfile — CocoaPods manifest
13 +# The source of truth for hand-authored Apple platform files lives in
14 +# src-tauri/apple/ (outside the Tauri blast radius).
15 # ============================================================
16 +gen/apple/
examples/tauri-app/src-tauri/apple/Project.swift renamed
examples/tauri-app/src-tauri/apple/README.md new
+78
@@ -0,0 +1,78 @@
1 +# Apple Platform Overlay
2 +
3 +This directory contains hand-authored files for the Apple platform targets
4 +(tvOS, watchOS, visionOS) and the Tuist project configuration. It lives
5 +**outside** `gen/apple/` so it survives `rm -rf gen/apple && cargo tauri ios init`.
6 +
7 +## Directory Layout
8 +
9 +```
10 +apple/
11 +├── bootstrap.sh ← copies everything into gen/apple/
12 +├── README.md ← you are here
13 +├── Project.swift ← Tuist project manifest (source of truth)
14 +├── Tuist.swift ← Tuist configuration
15 +├── mise.toml ← pins the Tuist version
16 +├── apple.gitignore ← becomes gen/apple/.gitignore
17 +├── tauri-app_tvOS/
18 +│ ├── App.swift
19 +│ └── Info.plist
20 +├── tauri-app_watchOS/
21 +│ ├── App.swift
22 +│ ├── Info.plist
23 +│ └── Assets.xcassets/ ← watchOS-specific app icon
24 +└── tauri-app_visionOS/
25 + ├── App.swift
26 + └── Info.plist
27 +```
28 +
29 +## Workflow
30 +
31 +The full setup from a clean state:
32 +
33 +```sh
34 +# 1. Tauri scaffolds gen/apple/ (Sources, Assets, iOS target, etc.)
35 +cargo tauri ios init
36 +
37 +# 2. Overlay our Apple platform targets + Tuist config into gen/apple/
38 +./src-tauri/apple/bootstrap.sh
39 +
40 +# 3. Install pinned Tuist via mise
41 +cd src-tauri/gen/apple
42 +mise install
43 +
44 +# 4. Generate the Xcode project from Project.swift
45 +tuist generate --no-open
46 +```
47 +
48 +After this, open `gen/apple/tauri-app.xcworkspace` in Xcode.
49 +
50 +## Idempotency
51 +
52 +This workflow is idempotent. You can run it any number of times:
53 +
54 +```sh
55 +rm -rf src-tauri/gen/apple
56 +cargo tauri ios init
57 +./src-tauri/apple/bootstrap.sh
58 +cd src-tauri/gen/apple && tuist generate --no-open
59 +```
60 +
61 +`gen/apple/` is fully git-ignored. The source of truth is:
62 +
63 +| What | Where |
64 +|---|---|
65 +| iOS scaffold (Sources, assets, Info.plist) | `cargo tauri ios init` (from `tauri.conf.json`) |
66 +| Tuist manifest + Apple platform targets | `src-tauri/apple/` (this directory) |
67 +| Xcode project | `tuist generate` (from `Project.swift`) |
68 +
69 +## Editing
70 +
71 +**To change tvOS / watchOS / visionOS targets or Tuist config:**
72 +edit the files in this `apple/` directory, then re-run `bootstrap.sh`.
73 +
74 +**To change the iOS target or Tauri build settings:**
75 +edit `tauri.conf.json` and re-run `cargo tauri ios init` + `bootstrap.sh`.
76 +
77 +**Never edit files directly inside `gen/apple/`** — they will be overwritten
78 +on the next scaffold or bootstrap.
\ No newline at end of file
examples/tauri-app/src-tauri/apple/Tuist.swift renamed
examples/tauri-app/src-tauri/apple/apple.gitignore renamed
examples/tauri-app/src-tauri/apple/bootstrap.sh new
+56
@@ -0,0 +1,56 @@
1 +#!/usr/bin/env bash
2 +# =============================================================================
3 +# apple/bootstrap.sh
4 +#
5 +# Overlays hand-authored Apple platform files into gen/apple/ after Tauri
6 +# regenerates its iOS scaffold.
7 +#
8 +# This makes the workflow idempotent:
9 +# rm -rf src-tauri/gen/apple
10 +# cargo tauri ios init
11 +# ./src-tauri/apple/bootstrap.sh
12 +#
13 +# The apple/ directory lives outside the Tauri blast radius (gen/apple/)
14 +# so it survives any scaffold regeneration.
15 +# =============================================================================
16 +set -euo pipefail
17 +
18 +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
19 +SRC_TAURI="$(cd "$SCRIPT_DIR/.." && pwd)"
20 +APPLE="$SRC_TAURI/gen/apple"
21 +
22 +if [ ! -d "$APPLE" ]; then
23 + echo "❌ $APPLE does not exist."
24 + echo " Run 'cargo tauri ios init' first, then re-run this script."
25 + exit 1
26 +fi
27 +
28 +echo "▶ Overlaying native tooling into gen/apple …"
29 +
30 +# Tuist project manifest & config
31 +cp "$SCRIPT_DIR/Project.swift" "$APPLE/Project.swift"
32 +cp "$SCRIPT_DIR/Tuist.swift" "$APPLE/Tuist.swift"
33 +cp "$SCRIPT_DIR/mise.toml" "$APPLE/mise.toml"
34 +cp "$SCRIPT_DIR/README.md" "$APPLE/README.md"
35 +
36 +# .gitignore (stored as apple.gitignore to avoid being invisible in editors)
37 +cp "$SCRIPT_DIR/apple.gitignore" "$APPLE/.gitignore"
38 +
39 +# tvOS target
40 +mkdir -p "$APPLE/tauri-app_tvOS"
41 +cp -R "$SCRIPT_DIR/tauri-app_tvOS/." "$APPLE/tauri-app_tvOS/"
42 +
43 +# watchOS target (includes its own Assets.xcassets)
44 +mkdir -p "$APPLE/tauri-app_watchOS"
45 +cp -R "$SCRIPT_DIR/tauri-app_watchOS/." "$APPLE/tauri-app_watchOS/"
46 +
47 +# visionOS target
48 +mkdir -p "$APPLE/tauri-app_visionOS"
49 +cp -R "$SCRIPT_DIR/tauri-app_visionOS/." "$APPLE/tauri-app_visionOS/"
50 +
51 +echo "✅ Apple platform overlay applied."
52 +echo ""
53 +echo " Next steps:"
54 +echo " mise install # install pinned tuist"
55 +echo " tuist generate --no-open # (re)generate Xcode project"
56 +echo ""
examples/tauri-app/src-tauri/apple/mise.toml renamed
examples/tauri-app/src-tauri/apple/tauri-app_tvOS/App.swift renamed
examples/tauri-app/src-tauri/apple/tauri-app_tvOS/Info.plist renamed
examples/tauri-app/src-tauri/apple/tauri-app_visionOS/App.swift renamed
examples/tauri-app/src-tauri/apple/tauri-app_visionOS/Info.plist renamed
examples/tauri-app/src-tauri/apple/tauri-app_watchOS/App.swift renamed
examples/tauri-app/src-tauri/apple/tauri-app_watchOS/Assets.xcassets/AppIcon.appiconset/AppIcon-1024x1024.png renamed
examples/tauri-app/src-tauri/apple/tauri-app_watchOS/Assets.xcassets/AppIcon.appiconset/Contents.json renamed
examples/tauri-app/src-tauri/apple/tauri-app_watchOS/Assets.xcassets/Contents.json renamed
examples/tauri-app/src-tauri/apple/tauri-app_watchOS/Info.plist renamed
examples/tauri-app/src-tauri/gen/apple/.keep
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png
Binary files a/examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png and /dev/null differ
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json deleted
-116
@@ -1,116 +0,0 @@
1 -{
2 - "images" : [
3 - {
4 - "size" : "20x20",
5 - "idiom" : "iphone",
6 - "filename" : "AppIcon-20x20@2x.png",
7 - "scale" : "2x"
8 - },
9 - {
10 - "size" : "20x20",
11 - "idiom" : "iphone",
12 - "filename" : "AppIcon-20x20@3x.png",
13 - "scale" : "3x"
14 - },
15 - {
16 - "size" : "29x29",
17 - "idiom" : "iphone",
18 - "filename" : "AppIcon-29x29@2x-1.png",
19 - "scale" : "2x"
20 - },
21 - {
22 - "size" : "29x29",
23 - "idiom" : "iphone",
24 - "filename" : "AppIcon-29x29@3x.png",
25 - "scale" : "3x"
26 - },
27 - {
28 - "size" : "40x40",
29 - "idiom" : "iphone",
30 - "filename" : "AppIcon-40x40@2x.png",
31 - "scale" : "2x"
32 - },
33 - {
34 - "size" : "40x40",
35 - "idiom" : "iphone",
36 - "filename" : "AppIcon-40x40@3x.png",
37 - "scale" : "3x"
38 - },
39 - {
40 - "size" : "60x60",
41 - "idiom" : "iphone",
42 - "filename" : "AppIcon-60x60@2x.png",
43 - "scale" : "2x"
44 - },
45 - {
46 - "size" : "60x60",
47 - "idiom" : "iphone",
48 - "filename" : "AppIcon-60x60@3x.png",
49 - "scale" : "3x"
50 - },
51 - {
52 - "size" : "20x20",
53 - "idiom" : "ipad",
54 - "filename" : "AppIcon-20x20@1x.png",
55 - "scale" : "1x"
56 - },
57 - {
58 - "size" : "20x20",
59 - "idiom" : "ipad",
60 - "filename" : "AppIcon-20x20@2x-1.png",
61 - "scale" : "2x"
62 - },
63 - {
64 - "size" : "29x29",
65 - "idiom" : "ipad",
66 - "filename" : "AppIcon-29x29@1x.png",
67 - "scale" : "1x"
68 - },
69 - {
70 - "size" : "29x29",
71 - "idiom" : "ipad",
72 - "filename" : "AppIcon-29x29@2x.png",
73 - "scale" : "2x"
74 - },
75 - {
76 - "size" : "40x40",
77 - "idiom" : "ipad",
78 - "filename" : "AppIcon-40x40@1x.png",
79 - "scale" : "1x"
80 - },
81 - {
82 - "size" : "40x40",
83 - "idiom" : "ipad",
84 - "filename" : "AppIcon-40x40@2x-1.png",
85 - "scale" : "2x"
86 - },
87 - {
88 - "size" : "76x76",
89 - "idiom" : "ipad",
90 - "filename" : "AppIcon-76x76@1x.png",
91 - "scale" : "1x"
92 - },
93 - {
94 - "size" : "76x76",
95 - "idiom" : "ipad",
96 - "filename" : "AppIcon-76x76@2x.png",
97 - "scale" : "2x"
98 - },
99 - {
100 - "size" : "83.5x83.5",
101 - "idiom" : "ipad",
102 - "filename" : "AppIcon-83.5x83.5@2x.png",
103 - "scale" : "2x"
104 - },
105 - {
106 - "size" : "1024x1024",
107 - "idiom" : "ios-marketing",
108 - "filename" : "AppIcon-512@2x.png",
109 - "scale" : "1x"
110 - }
111 - ],
112 - "info" : {
113 - "version" : 1,
114 - "author" : "xcode"
115 - }
116 -}
\ No newline at end of file
examples/tauri-app/src-tauri/gen/apple/Assets.xcassets/Contents.json deleted
-6
@@ -1,6 +0,0 @@
1 -{
2 - "info" : {
3 - "version" : 1,
4 - "author" : "xcode"
5 - }
6 -}
\ No newline at end of file
examples/tauri-app/src-tauri/gen/apple/ExportOptions.plist deleted
-8
@@ -1,8 +0,0 @@
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 -<plist version="1.0">
4 -<dict>
5 - <key>method</key>
6 - <string>debugging</string>
7 -</dict>
8 -</plist>
examples/tauri-app/src-tauri/gen/apple/LaunchScreen.storyboard deleted
-30
@@ -1,30 +0,0 @@
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17150" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Y6W-OH-hqX">
3 - <dependencies>
4 - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17122"/>
5 - <capability name="Safe area layout guides" minToolsVersion="9.0"/>
6 - <capability name="System colors in document resources" minToolsVersion="11.0"/>
7 - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
8 - </dependencies>
9 - <scenes>
10 - <!--View Controller-->
11 - <scene sceneID="s0d-6b-0kx">
12 - <objects>
13 - <viewController id="Y6W-OH-hqX" sceneMemberID="viewController">
14 - <view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
15 - <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
16 - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
17 - <viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
18 - <color key="backgroundColor" systemColor="systemBackgroundColor"/>
19 - </view>
20 - </viewController>
21 - <placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
22 - </objects>
23 - </scene>
24 - </scenes>
25 - <resources>
26 - <systemColor name="systemBackgroundColor">
27 - <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
28 - </systemColor>
29 - </resources>
30 -</document>
examples/tauri-app/src-tauri/gen/apple/Podfile deleted
-21
@@ -1,21 +0,0 @@
1 -# Uncomment the next line to define a global platform for your project
2 -
3 -target 'tauri-app_iOS' do
4 -platform :ios, '14.0'
5 - # Pods for tauri-app_iOS
6 -end
7 -
8 -target 'tauri-app_macOS' do
9 -platform :osx, '11.0'
10 - # Pods for tauri-app_macOS
11 -end
12 -
13 -# Delete the deployment target for iOS and macOS, causing it to be inherited from the Podfile
14 -post_install do |installer|
15 - installer.pods_project.targets.each do |target|
16 - target.build_configurations.each do |config|
17 - config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
18 - config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET'
19 - end
20 - end
21 -end
examples/tauri-app/src-tauri/gen/apple/README.md deleted
-92
@@ -1,92 +0,0 @@
1 -# Tauri + Tuist — iOS / tvOS / watchOS / visionOS project
2 -
3 -`Project.swift` is the single source of truth for the Xcode project.
4 -There is no Makefile. Use Tuist directly.
5 -
6 -## Prerequisites
7 -
8 -Install [mise](https://mise.jdx.dev/) then activate the pinned Tuist version:
9 -
10 -```sh
11 -mise install # reads mise.toml → installs tuist 4.150.0
12 -eval "$(mise activate bash)" # or zsh/fish
13 -```
14 -
15 -## Day-to-day commands
16 -
17 -| What | Command |
18 -|---|---|
19 -| Generate the Xcode project (headless) | `tuist generate --no-open` |
20 -| Generate **and** open Xcode | `tuist generate` |
21 -| Clean generated artifacts | `tuist clean` |
22 -| Edit Project.swift in Xcode | `tuist edit` |
23 -
24 -## Building
25 -
26 -After `tuist generate`, build through Xcode or the command line:
27 -
28 -```sh
29 -# iOS (simulator)
30 -xcodebuild \
31 - -workspace tauri-app.xcworkspace \
32 - -scheme tauri-app_iOS \
33 - -destination "generic/platform=iOS Simulator" \
34 - -configuration Debug \
35 - build
36 -
37 -# tvOS (simulator)
38 -xcodebuild \
39 - -workspace tauri-app.xcworkspace \
40 - -scheme tauri-app_tvOS \
41 - -destination "generic/platform=tvOS Simulator" \
42 - -configuration Debug \
43 - build
44 -
45 -# watchOS (simulator)
46 -xcodebuild \
47 - -workspace tauri-app.xcworkspace \
48 - -scheme tauri-app_watchOS \
49 - -destination "generic/platform=watchOS Simulator" \
50 - -configuration Debug \
51 - build
52 -
53 -# visionOS (simulator)
54 -xcodebuild \
55 - -workspace tauri-app.xcworkspace \
56 - -scheme tauri-app_visionOS \
57 - -destination "generic/platform=visionOS Simulator" \
58 - -configuration Debug \
59 - build
60 -```
61 -
62 -## After `cargo tauri ios init`
63 -
64 -Tauri regenerates `project.yml` (XcodeGen format) but does **not** touch
65 -`Project.swift`. Since Tuist is the source of truth, just re-run:
66 -
67 -```sh
68 -tuist generate --no-open
69 -```
70 -
71 -If Tauri added new source files or frameworks in `project.yml`, port those
72 -changes to `Project.swift` first, then generate.
73 -
74 -## Full reset
75 -
76 -```sh
77 -cd ../../ # back to src-tauri
78 -cargo tauri ios init # re-scaffold project.yml
79 -cd gen/apple
80 -tuist generate --no-open
81 -```
82 -
83 -## What gets generated (git-ignored)
84 -
85 -| Path | Created by |
86 -|---|---|
87 -| `project.yml` | `cargo tauri ios init` |
88 -| `*.xcodeproj/` | `tuist generate` |
89 -| `*.xcworkspace/` | `tuist generate` |
90 -| `Derived/` | `tuist generate` |
91 -| `Externals/` | Rust build (`cargo tauri ios xcode-script`) |
92 -| `build/` | Xcode |
\ No newline at end of file
examples/tauri-app/src-tauri/gen/apple/Sources/tauri-app/bindings/bindings.h deleted
-8
@@ -1,8 +0,0 @@
1 -#pragma once
2 -
3 -namespace ffi {
4 - extern "C" {
5 - void start_app();
6 - }
7 -}
8 -
examples/tauri-app/src-tauri/gen/apple/Sources/tauri-app/main.mm deleted
-6
@@ -1,6 +0,0 @@
1 -#include "bindings/bindings.h"
2 -
3 -int main(int argc, char * argv[]) {
4 - ffi::start_app();
5 - return 0;
6 -}
examples/tauri-app/src-tauri/gen/apple/tauri-app_iOS/Info.plist deleted
-44
@@ -1,44 +0,0 @@
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 -<plist version="1.0">
4 -<dict>
5 - <key>CFBundleDevelopmentRegion</key>
6 - <string>$(DEVELOPMENT_LANGUAGE)</string>
7 - <key>CFBundleExecutable</key>
8 - <string>$(EXECUTABLE_NAME)</string>
9 - <key>CFBundleIdentifier</key>
10 - <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11 - <key>CFBundleInfoDictionaryVersion</key>
12 - <string>6.0</string>
13 - <key>CFBundleName</key>
14 - <string>$(PRODUCT_NAME)</string>
15 - <key>CFBundlePackageType</key>
16 - <string>APPL</string>
17 - <key>CFBundleShortVersionString</key>
18 - <string>0.1.0</string>
19 - <key>CFBundleVersion</key>
20 - <string>0.1.0</string>
21 - <key>LSRequiresIPhoneOS</key>
22 - <true/>
23 - <key>UILaunchStoryboardName</key>
24 - <string>LaunchScreen</string>
25 - <key>UIRequiredDeviceCapabilities</key>
26 - <array>
27 - <string>arm64</string>
28 - <string>metal</string>
29 - </array>
30 - <key>UISupportedInterfaceOrientations</key>
31 - <array>
32 - <string>UIInterfaceOrientationPortrait</string>
33 - <string>UIInterfaceOrientationLandscapeLeft</string>
34 - <string>UIInterfaceOrientationLandscapeRight</string>
35 - </array>
36 - <key>UISupportedInterfaceOrientations~ipad</key>
37 - <array>
38 - <string>UIInterfaceOrientationPortrait</string>
39 - <string>UIInterfaceOrientationPortraitUpsideDown</string>
40 - <string>UIInterfaceOrientationLandscapeLeft</string>
41 - <string>UIInterfaceOrientationLandscapeRight</string>
42 - </array>
43 -</dict>
44 -</plist>
\ No newline at end of file
examples/tauri-app/src-tauri/gen/apple/tauri-app_iOS/tauri-app_iOS.entitlements deleted
-5
@@ -1,5 +0,0 @@
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 -<plist version="1.0">
4 -<dict/>
5 -</plist>