| name | ios-release |
| description | 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. |
iOS Release
Build and prepare iOS app for TestFlight/App Store.
Critical Warning
NEVER use yarn tauri ios dev or yarn tauri ios dev --open for archiving!
devcreates a DEBUG build pointing tolocalhost:1420(Vite dev server)- Installing from TestFlight will show blank screen (no dev server on device)
- Always use
yarn tauri ios build(release mode by default)
1. Gather Info
Ask user for:
- Version number (x.x.x) - or keep current if re-uploading
- If re-uploading same version: need to bump build number only
2. Update Version/Build Number
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.
3. Setup Share Extension (Conditional)
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
4. Build & Open Xcode
Ask user to run this in a separate terminal (long-running):
cd decentpaste-app && yarn tauri ios build --open
This command:
- Builds the frontend in production mode (bundles assets)
- Opens Xcode project when frontend build completes
The actual iOS compilation and archiving happens in Xcode (next step).
5. Archive & Upload in Xcode
User performs in Xcode:
- Select scheme:
decentpaste-app_iOS - Select destination:
Any iOS Device (arm64) - Menu: Product → Archive (or ⇧⌘A)
- Wait for archive (~5-15 min)
- In Organizer: Distribute App → App Store Connect → Upload
- Check "Upload your app's symbols"
- Use automatic signing
- Click Upload
Alternative: Full CLI with IPA
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.
6. Verify Production Build
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.
7. TestFlight Configuration
After upload completes (~5-15 min processing):
- Go to App Store Connect → TestFlight
- Select the new build
- Fill Test Information (what to test)
- Answer Export Compliance (DecentPaste uses encryption → Yes, but exempt)
- For external testers: Wait for Beta App Review (~24-48h)
8. Report
Report: version updated, build number, build verified as production, upload status.
Key Files
| File | Value |
|---|---|
| Bundle ID | com.decentpaste.application |
| Extension Bundle ID | com.decentpaste.application.ShareExtension |
| App Group | group.com.decentpaste.application |
| Team ID | SNDGGHFSJ2 |
Troubleshooting
| 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 |
| "Build number already used" | Bump bundle.iOS.bundleVersion in tauri.conf.json |
| Upload fails | Check Xcode → Settings → Accounts for valid credentials |