examples/ios/RunAnywhereAI/docs/RELEASE_INSTRUCTIONS.md
This document outlines the steps required to release a new version of the RunAnywhereAI iOS app to the App Store.
Before releasing, ensure the production API key and base URL are configured in the app:
File: RunAnywhereAI/App/RunAnywhereAIApp.swift
In the #else block (production mode), update:
let apiKey = "<PRODUCTION_API_KEY>"
let baseURL = "<PRODUCTION_BASE_URL>"
The app uses compile-time flags:
#if DEBUG - Development mode (no API key needed, uses Supabase)#else - Production mode (requires API key and backend URL)CRITICAL: The app's deployment target MUST match the SDK requirements.
| Component | Required Value |
|---|---|
| App Deployment Target | iOS 17.0 |
| SDK Requirement | iOS 17.0 (defined in Package.swift) |
| Framework MinimumOSVersion | 17.0 |
File: RunAnywhereAI.xcodeproj/project.pbxproj
Verify all IPHONEOS_DEPLOYMENT_TARGET entries are set to 17.0:
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
Warning: Do NOT set the deployment target higher than what the SDK supports. Setting it to iOS 18.x when frameworks were built for iOS 17 will cause validation errors.
Update the marketing version in Xcode project settings. The version must be higher than any previously submitted version.
File: RunAnywhereAI.xcodeproj/project.pbxproj
Search for MARKETING_VERSION and update all occurrences:
MARKETING_VERSION = X.Y.Z;
Alternatively, update via Xcode:
Apple requires all embedded frameworks to have specific keys in their Info.plist files with matching values to the app's deployment target.
CFBundleVersion - Build version stringMinimumOSVersion - Must be set to 17.0 (matching SDK requirement)RunAnywhere SDK Frameworks (in sdks/sdk/runanywhere-swift/Binaries/):
RACommons.xcframework/ios-arm64/RACommons.framework/Info.plistRACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Info.plistRABackendLLAMACPP.xcframework/ios-arm64/RABackendLLAMACPP.framework/Info.plistRABackendLLAMACPP.xcframework/ios-arm64_x86_64-simulator/RABackendLLAMACPP.framework/Info.plistRABackendONNX.xcframework/ios-arm64/RABackendONNX.framework/Info.plistRABackendONNX.xcframework/ios-arm64_x86_64-simulator/RABackendONNX.framework/Info.plistONNX Runtime Framework (third-party binary):
sdks/sdk/runanywhere-commons/third_party/onnxruntime-ios/onnxruntime.xcframework/ios-arm64/onnxruntime.framework/Info.plistsdks/sdk/runanywhere-commons/third_party/onnxruntime-ios/onnxruntime.xcframework/ios-arm64_x86_64-simulator/onnxruntime.framework/Info.plistWe've created a script to automatically fix framework Info.plist files in DerivedData.
Location: scripts/patch-framework-plist.sh
Usage:
# Run from the RunAnywhereAI app directory
./scripts/patch-framework-plist.sh
What it does:
onnxruntime.framework, RACommons.framework, RABackendLLAMACPP.framework, RABackendONNX.frameworkMinimumOSVersion=17.0When to run:
rm -rf ~/Library/Developer/Xcode/DerivedData/RunAnywhereAI-*)If you prefer to fix manually using PlistBuddy:
# Add or update MinimumOSVersion for all frameworks in DerivedData
for framework in onnxruntime RACommons RABackendLLAMACPP RABackendONNX; do
for plist in $(find ~/Library/Developer/Xcode/DerivedData -path "*${framework}.framework/Info.plist" -type f 2>/dev/null); do
/usr/libexec/PlistBuddy -c "Set :MinimumOSVersion 17.0" "$plist" 2>/dev/null || \
/usr/libexec/PlistBuddy -c "Add :MinimumOSVersion string 17.0" "$plist" 2>/dev/null
echo "Patched: $plist"
done
done
Build the project to populate DerivedData:
Cmd+B (or Product > Build)
cd sdks/examples/ios/RunAnywhereAI
./scripts/patch-framework-plist.sh
Important: Do NOT clean after running the patch script.
In Organizer:
Error Message:
Invalid Bundle. The bundle RunAnywhereAI.app/Frameworks/onnxruntime.framework does not support the minimum OS Version specified in the Info.plist.
Cause: Mismatch between the app's deployment target and the framework's MinimumOSVersion. This happens when:
Solution:
17.0 (not higher!)./scripts/patch-framework-plist.shError Message:
Invalid MinimumOSVersion. Apps that only support 64-bit devices must specify a deployment target of 8.0 or later. MinimumOSVersion in 'RunAnywhereAI.app/Frameworks/onnxruntime.framework' is ''
Cause: The ONNX Runtime binary downloaded via SPM from Microsoft's servers (download.onnxruntime.ai) doesn't include the MinimumOSVersion key in its Info.plist.
Solution:
./scripts/patch-framework-plist.shWarning:
Upload Symbols Failed - The archive did not include a dSYM for the framework
Cause: Third-party frameworks (Sentry, onnxruntime) don't include dSYM files in their binary distributions.
Solution: These warnings can be safely ignored. The frameworks either:
If build fails after cleaning SPM cache:
./scripts/patch-framework-plist.shEnsure your Apple Developer account has:
com.runanywhere.RunAnywhere[ ] 1. Update production API key and base URL
[ ] 2. Verify deployment target is iOS 17.0 (NOT higher!)
[ ] 3. Bump MARKETING_VERSION
[ ] 4. Build project (Cmd+B)
[ ] 5. Run patch script: ./scripts/patch-framework-plist.sh
[ ] 6. Archive (Product > Archive) - DO NOT CLEAN!
[ ] 7. Validate in Organizer
[ ] 8. Upload to App Store Connect
[ ] 9. Submit for review
The app automatically selects the environment based on build configuration:
| Build | Environment | API Key Required |
|---|---|---|
| Debug | Development | No |
| Release | Production | Yes |
To verify the app is in production mode:
SDK initialized in PRODUCTION mode| Version | Date | Notes |
|---|---|---|
| 0.17.2 | 2025-01-24 | Fixed deployment target to iOS 17.0, updated MinimumOSVersion to 17.0 for all frameworks |
| 0.17.1 | 2025-01-24 | Added patch script for ONNX Runtime MinimumOSVersion fix |
| 0.17.0 | 2025-01-24 | Production release with backend integration |
| 0.16.0 | - | Previous release |
The RunAnywhere SDK requires iOS 17.0 minimum (defined in Package.swift):
platforms: [
.iOS(.v17),
.macOS(.v14),
...
]
All framework MinimumOSVersion values and the app's IPHONEOS_DEPLOYMENT_TARGET must be consistent with this requirement.
| Framework | MinimumOSVersion |
|---|---|
| App (RunAnywhereAI) | 17.0 |
| RACommons | 17.0 |
| RABackendLLAMACPP | 17.0 |
| RABackendONNX | 17.0 |
| onnxruntime | 17.0 |