Build, archive, and prepare iOS app for TestFlight/App Store. Handles version bumping, build number configuration, Xcode archiving, and upload. Use when preparing a new iOS release for TestFlight beta testing or App Store submission.
Build and prepare iOS app for TestFlight/App Store.
NEVER use yarn tauri ios dev or yarn tauri ios dev --open for archiving!
dev creates a DEBUG build pointing to localhost:1420 (Vite dev server)yarn tauri ios build (release mode by default)Ask user for:
New version release:
Use /bump-version workflow to update all config files.
Re-uploading same version (e.g., fixing previous bad build):
Only bump the build number in tauri.conf.json:
{
"bundle": {
"iOS": {
"bundleVersion": "2"
}
}
}
Note: Do NOT edit files in gen/apple/ directly - they get regenerated. Use tauri.conf.json.
Only required after running yarn tauri ios init (regenerates apple folder).
Skip if Share Extension is already configured. To check:
ls decentpaste-app/src-tauri/gen/apple/ShareExtension/
If missing, run:
cd decentpaste-app && ./tauri-plugin-decentshare/scripts/setup-ios-share-extension.sh
After version bumps, the Share Extension's MARKETING_VERSION in the Xcode project may be out of sync with the main app. Check for this warning during build:
warning: The CFBundleShortVersionString of an app extension ('X.X.X') must match that of its containing parent app ('Y.Y.Y').
To fix, update the Share Extension's version in the Xcode project file:
# Replace OLD_VERSION with the outdated version, NEW_VERSION with current app version
sed -i '' 's/MARKETING_VERSION = OLD_VERSION;/MARKETING_VERSION = NEW_VERSION;/g' \
decentpaste-app/src-tauri/gen/apple/decentpaste-app.xcodeproj/project.pbxproj
Example: sed -i '' 's/MARKETING_VERSION = 0.4.2;/MARKETING_VERSION = 0.5.0;/g' ...
Why this happens: The /bump-version workflow updates tauri.conf.json, but the Share Extension's version lives in gen/apple/ which doesn't get auto-updated.
Ask user to run this in a separate terminal (long-running):
cd decentpaste-app && yarn tauri ios build --open
This command:
IMPORTANT: Wait for yarn tauri ios build to complete before archiving in Xcode. The build compiles the frontend assets that get bundled into the iOS app. If you archive before it finishes, you may get an incomplete or broken build.
The actual iOS compilation and archiving happens in Xcode (next step).
User performs in Xcode:
decentpaste-app_iOSAny iOS Device (arm64)Build everything via CLI (no Xcode GUI needed):
cd decentpaste-app && yarn tauri ios build --export-method app-store-connect
IPA location: src-tauri/gen/apple/build/arm64/DecentPaste.ipa
Upload via Transporter app (free from Mac App Store) or xcrun altool with API keys.
To confirm the archive is a production build (not dev):
# Check for Vite-hashed asset filenames in binary (production indicator)
ARCHIVE=$(ls -td ~/Library/Developer/Xcode/Archives/**/*.xcarchive 2>/dev/null | head -1)
strings "$ARCHIVE/Products/Applications/DecentPaste.app/DecentPaste" | grep -E "/assets/index-[A-Za-z0-9]+\.(js|css)"
Production build: Shows hashed filenames like /assets/index-BauF9ln8.css
Dev build: No hashed assets (would only show localhost:1420)
Note: localhost:1420 appearing in strings is normal (embedded config) - check for hashed assets.
After upload completes (~5-15 min processing):
Report: version updated, build number, build verified as production, upload status.
| File | Value |
|---------------------|----------------------------------------------|
| Bundle ID | com.decentpaste.application |
| Extension Bundle ID | com.decentpaste.application.ShareExtension |
| App Group | group.com.decentpaste.application |
| Team ID | SNDGGHFSJ2 |
| Issue | Solution |
|----------------------------------|-----------------------------------------------------------------------|
| --release flag error | Don't use it - tauri ios build is release by default |
| Blank screen on device | You archived a dev build - rebuild with yarn tauri ios build --open |
| Code signing errors | In Xcode, verify Team selected for BOTH targets |
| Share Extension missing | Run setup-ios-share-extension.sh |
| Share Extension version mismatch | See step 4 - update MARKETING_VERSION in project.pbxproj |
| "Build number already used" | Bump bundle.iOS.bundleVersion in tauri.conf.json |
| Upload fails | Check Xcode → Settings → Accounts for valid credentials |
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer