chore: raise minimum supported platform, Swift, and Xcode versions - #4271
Merged
Conversation
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
had a problem deploying
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Failure
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
had a problem deploying
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Error
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
had a problem deploying
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Failure
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
had a problem deploying
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Error
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
had a problem deploying
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Error
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
had a problem deploying
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Failure
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 11, 2026 20:02 — with
GitHub Actions
Inactive
harsh62
temporarily deployed
to
IntegrationTest
August 12, 2026 16:15 — with
GitHub Actions
Inactive
8 tasks
Apple has required Xcode 26 and the 26 SDKs for App Store Connect uploads since April 28, 2026. Per the support policy in README.md, Amplify Swift tracks the Swift version shipped with the minimum Xcode allowed for App Store Connect uploads. Platform floors now match Apple's published Xcode 26 support matrix, and the Swift toolchain floor matches AWS SDK for Swift: - iOS 13 -> 15 - tvOS 13 -> 15 - macOS 12 (unchanged) - watchOS 9 (unchanged, already above Apple's floor of 8) - visionOS: declared in Package.swift for the first time, promoted to GA - swift-tools-version 5.9 -> 6.0 - Minimum Xcode 16.0 -> 26.0 Adopting the Swift 6 language mode is deliberately out of scope. Raising swift-tools-version to 6.0 would otherwise flip the default language mode to Swift 6, so `swiftLanguageModes: [.v5]` pins the existing behavior and keeps this change behavior-neutral. The strict-concurrency migration is tracked separately. CI: - Runners moved from macos-15 to macos-26 - Latest Xcode 26.3 -> 26.5; minimum 16.0.0 -> 26.0.1 - Removed the Xcode 16 legs and the duplicate hardcoded 16.4.0 pins - Simulator devices updated to those present on macos-26 (iPhone 17 Pro Max, Apple Watch Series 11); minimum-Xcode legs use the 26.2 runtime because the image ships 26.0 SDKs but installs no 26.0 runtime - visionOS added to the minimum-supported-version build matrix, which previously never exercised the platform the docs call supported - Added an advisory, non-blocking nightly build against the Xcode 27 preview image for early warning on the next Xcode release Docs: corrected the stale Xcode 13.4 requirement in CONTRIBUTING.md. Three test files were reformatted because raising swiftformat's --swiftversion to 6.0 activates the preferCountWhere rule.
The tvOS build failed with "'SFSpeechRecognitionResult' is unavailable in tvOS". SFSpeechRecognitionResult is marked API_UNAVAILABLE(tvos), and the CoreML predictions plugin was relying on `#if canImport(Speech)` to compile itself out on tvOS. As of the Xcode 26 SDKs, the tvOS Speech framework ships a module (module.modulemap and Speech.swiftmodule), so canImport(Speech) now succeeds on tvOS while the type itself remains unavailable. The guard silently stopped excluding the platform. Verified this is an SDK change and not a consequence of raising the tvOS deployment floor: the same file fails to compile against the Xcode 26 tvOS SDK at both tvos13.0 and tvos15.0. Adding `&& !os(tvOS)` restores the pre-Xcode-26 behavior. Applied to every file in the CoreML plugin rather than only the Speech types, because the plugin's configure/reset/client-behavior files reference those types and were previously compiled out as a unit. Verified by building CoreMLPredictionsPlugin and AWSPredictionsPlugin for arm64-apple-tvos15.0-simulator, and confirming macOS still compiles CoreMLPredictionService so the plugin stays active where Speech is genuinely available.
Integration tests failed to build with: compiling for iOS 14.0, but module 'Amplify' has a minimum deployment target of iOS 15.0 Raising the package floor to iOS 15 left four Xcode projects behind, so they still tried to link an Amplify built for a newer target than their own: APIHostApp 13.0 -> 15.0 DataStoreHostApp 13.0 -> 15.0 PredictionsHostApp 14.0 -> 15.0 canaries/example 14.4 -> 15.0 Checked the other platforms for the same gap and found none: watchOS host apps are at 9.0/9.4/10.0 against a floor of 9, tvOS is at 16.4 against 15, macOS is at 14.6/15.0 against 12, and StorageHostApp's Base.xcconfig was already 15.0/12.0.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4271 +/- ##
==========================================
- Coverage 66.81% 66.79% -0.03%
==========================================
Files 1170 1170
Lines 44565 44565
==========================================
- Hits 29777 29766 -11
- Misses 14788 14799 +11
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
thisisabhash
approved these changes
Aug 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue
Apple has required Xcode 26 and the 26 SDKs for App Store Connect uploads since April 28, 2026. The support policy in
README.mdstates that Amplify Swift updates its minimum Swift version within 60 days of Apple's change, so this is overdue.This also lands ahead of AWS SDK for Swift's own proposed bump (~September 2026), so we move by plan rather than being forced by an upstream dependency.
Description
Platform floors now match Apple's published Xcode 26 support matrix, and the Swift toolchain floor matches AWS SDK for Swift.
Notes on the choices:
Package.swift. It was documented as inherited from the iOS deployment target and built in CI, but had no.visionOS()entry. It is now explicitly declared and marked GA, and the README footnote describing the old inherited behaviour is removed.Swift 6 language mode is intentionally NOT in this PR
Raising
swift-tools-versionto 6.0 silently flips the default language mode to Swift 6. To keep this change behaviour-neutral,swiftLanguageModes: [.v5]pins the existing behaviour. Measured separately, the Swift 6 migration is ~350 genuine strict-concurrency sites (concentrated in Storage, DataStore, and Auth); that belongs in its own PR.CoreML predictions plugin now excludes tvOS explicitly
The tvOS build failed with
'SFSpeechRecognitionResult' is unavailable in tvOS. That type is markedAPI_UNAVAILABLE(tvos), and the plugin relied on#if canImport(Speech)to compile itself out.As of the Xcode 26 SDKs the tvOS Speech framework ships a module, so
canImport(Speech)now succeeds on tvOS while the type remains unavailable — the guard silently stopped excluding the platform. Adding&& !os(tvOS)restores the previous behaviour.Verified this is an SDK change rather than a consequence of the deployment-target bump: the same file fails to compile against the Xcode 26 tvOS SDK at both
tvos13.0andtvos15.0. The guard is applied to every file in the plugin, not only the Speech types, because the configure/reset/client-behavior files reference those types and were previously compiled out as a unit.CI changes are limited to what this bump requires
Only version-coupled updates are included: runner images, the Xcode version map (
latest26.3 → 26.5,minimum16.0.0 → 26.0.1), simulator devices that exist on the new image (iPhone 17 Pro Max,Apple Watch Series 11), visionOS added to the minimum-version build matrix, and swiftformat's--swiftversionraised to 6.0 to match the tools version.No timeout or cache changes are in this PR — those are unrelated CI reliability work tracked separately in #4269.
Semver
Treated as a minor release, not a breaking change, consistent with how AWS SDK for Swift is handling their equivalent bump.
How did you test these changes?
Locally on Xcode 26.5 (Swift 6.3.2):
swift build— clean, 0 errorsswift test— 0 failuresxcodebuild build -scheme Amplify-Packageverified end-to-end for iOS, macOS, and visionOSios15.0,tvos15.0,watchos9.0,xros1.0CoreMLPredictionsPluginandAWSPredictionsPluginforarm64-apple-tvos15.0-simulator), and confirmed macOS still compilesCoreMLPredictionServiceso the plugin stays active where Speech genuinely existsswiftformat --lint . --swiftversion 6.0— cleanDocumentation
README.md— platform table, Swift version, Xcode requirement, stale visionOS footnote removedCONTRIBUTING.md— Xcode versionAGENTS.md/CLAUDE.mdREADME-combine-support.mdChecklist
yarn lintpassed (swiftformat + swiftlint equivalents run)By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.