# iOS development Requires macOS, Xcode 16.4 or newer with an iOS simulator, and XcodeGen 2.44.1. Minimum iOS/iPadOS 18.4 is retained for this rebuild. The application surface is SwiftUI; the old WKWebView renderer is archived, not shipped. No CocoaPods or external runtime package is required. For App Store submission use Apple's currently required Xcode/iOS SDK, not merely the oldest compiler that can build the source. ```sh bash scripts/install-xcodegen.sh "$HOME/.local/yuvomi-xcodegen" "$HOME/.local/yuvomi-xcodegen/xcodegen/bin/xcodegen" generate --spec ios/project.yml device=$(python3 scripts/select-simulator.py) xcodebuild -project ios/Yuvomi.xcodeproj -scheme Yuvomi \ -destination "platform=iOS Simulator,id=$device" CODE_SIGNING_ALLOWED=NO test xcodebuild -project ios/Yuvomi.xcodeproj -scheme Yuvomi \ -destination 'generic/platform=iOS' -archivePath artifacts/Yuvomi-unsigned.xcarchive \ CODE_SIGNING_ALLOWED=NO archive ``` `project.yml` is the source of truth. The Xcode project and generated Info.plist are ignored. The XcodeGen download is version- and SHA256-pinned. The project includes a privacy manifest, camera/photo/local-network usage strings, universal app icon, orientation support, unit and UI test targets, and no ATS exception. On macOS or Linux with Swift 6 installed: ```sh swift test --package-path ios swiftc -frontend -parse ios/Sources/*.swift ios/Tests/*.swift ios/UITests/*.swift ``` These portable tests compile the **production Foundation API transport, contracts and URL/metadata policies**. Parsing does not typecheck SwiftUI or Security APIs. Neither command is evidence that the iOS application builds. Actual Xcode testing is mandatory. For a device build select your authorized development team in Xcode, use your own registered bundle identifier, and let Xcode manage development provisioning. Never commit generated profiles or certificates. See `release-process.md` for distribution. A Linux environment cannot produce a validated iOS archive. The Mac runner now bootstraps checksum-pinned native Node 22 before checkout, because its JavaScript actions cannot start without Node in the service PATH. This does not install/choose Xcode, accept its license or create a simulator.