iOS 27.0 Release Notes: Deprecations, Breaks, and Fixes

iOS 27.0 and iPadOS 27.0 shipped on Monday, September 14, 2026 as build 24A437, the same build Apple posted as the RC on September 11, with the SDK inside Xcode 27 (27A266a) the same day and App Store Connect accepting 27.0 GA builds from the same date.13 Three build numbers now answer “which iOS 27.0?”: the device runs 24A437, the SDK in Xcode 27 identifies itself as 24A430, and the simulator runtime is 24A434.4 The notes cover 93 headed areas with 65 new features, 197 resolved issues, 23 known issues, and 11 deprecations; what matters for existing code is the set that fires the moment you build with the 27.0 SDK, the deprecations confirmed in the SDK’s own headers, and one Foundation fix that a single binary reproduces across an iOS 26.5 and an iOS 27.0 runtime.24

TL;DR

  • Builds. Device 24A437, SDK 24A430, simulator runtime 24A434; the RC and the GA share a device build, and the SDK number is not the device number, which matters when a bug report asks for one.14
  • Linked-on-27 behavior. 12 categories of change, 23 entries in all, alter what an app does the moment you build it with the 27.0 SDK: the launch screen requirement, the scene-lifecycle mandate, TabView crashing on a hidden selection, system text selection on selectable Text, trait inheritance for presented view controllers, the inline scope bar, external display scenes no longer offered automatically, control modifiers reset inside sheets and popovers, containerRelativeFrame safe-area math, the status-bar accessors, iPad resize rules under UIRequiresFullScreen, and two smaller SwiftUI shifts in menus and scroll-to-top.2
  • Recompile or crash. MetricKit’s HitchTimeMetric.ratio now measures in a new HitchTimeRatio unit, and ScrollHitchTimeMetric left the Swift API; Apple says to recompile with the latest SDK to avoid crashes at launch and a missing-symbol crash, and the SDK interface confirms the type is gone.24
  • 11 deprecations, mostly silent. canOpenURL: (ios(3.0, 27.0) in the header), On Demand Resources (ios(9.0, 27.0)), PHAssetResource.originalFilename (ios(9, 27)), the original MetricKit APIs (marked API_TO_BE_DEPRECATED, so a soft deprecation), ScrollHitchTimeMetric, FileDocument, calendar.deleteEvents renamed to calendar.deleteEvent, a PencilKit rename, the scene mandate, AirPort Utility, and a Weather Highlights language note. The three hard ones warn only at a 27.0 deployment target; at 17.0 or 26.0 the same file compiles clean.24
  • Two Foundation changes, tested. +[NSURL URLWithString:] no longer double-encodes a valid %20 when it escapes a space elsewhere in the string: one simulator binary produces %2520 on an iOS 26.5 runtime and %20 on the iOS 27.0 runtime, and the Mac build matches the old side, so the fix follows the OS, not the SDK. The volumeAvailableCapacityKey truncation to three significant digits does not show in the simulator, which reports 55,177,985 blocks exactly.24

Which build is which?

Where Build Evidence
Device, iOS 27.0 / iPadOS 27.0 24A437 Releases feed, Mon, Sep 14, 2026; “iOS 27.0 RC (24A437)” on Fri, Sep 111
SDK inside Xcode 27 (27A266a) 24A430 iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist, ProductBuildVersion4
iOS 27.0 simulator runtime 24A434 xcrun simctl list runtimes prints “iOS 27.0 (27.0 - 24A434)”4
macOS 27.0 26A428 Releases feed, Mon, Sep 141
App Store Connect 27.0 GA SDKs accepted “You can now upload apps built with Xcode 27 using the SDK for iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight.” September 14; RC-SDK uploads accepted since September 93

The three numbers are not a mistake. The SDK is a snapshot of headers and interfaces, the simulator runtime is a separate cryptex Apple ships to Xcode, and the device build is what people run; a reproduction that says “iOS 27.0” without one of these is missing the number that decides whether a fix applied.4

The notes themselves open with two sentences of scope, “The iOS & iPadOS 27 SDK provides support to develop apps for iPhone and iPad running iOS & iPadOS 27. The SDK comes bundled with Xcode 27, available from the Mac App Store,” and then run through 93 headed areas. Counting the list items under each heading gives 65 new features, 197 resolved issues, 23 known issues, and 11 deprecations; Siri alone accounts for 38 resolved and eight known, SwiftUI for 23 new and 13 resolved, UIKit for nine new and 13 resolved.2 The Xcode 27 post covers the toolchain side, and the post you are reading covers the OS and SDK side.

What changes the moment you build with the 27.0 SDK?

Apple gates behavior changes on the SDK an app links against, so these do nothing to the build you already shipped and all of them fire on the first archive from Xcode 27. Quoting the note for each:2

  • Launch screen. “iOS and iPadOS apps built with the 27.0 SDK or later are required to include a launch screen. Your app’s Info.plist must contain one of the following keys: UILaunchStoryboardName, UILaunchStoryboards, UILaunchScreen, or UILaunchScreens. Apps that don’t include a launch screen are rejected when the App Store begins accepting apps built with the 27.0 SDK.” App Store Connect took App Store uploads built with the 27.0 RC SDKs from September 9 and with the GA SDKs from September 14; neither entry says when rejections began, so read both as upload dates rather than an enforcement date.3 My launch screen post audits a generated plist.
  • Scene lifecycle. Under UIKit deprecations: “Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” The scene mandate post has the migration.
  • TabView selection. “In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, a TabView enforces that its selection is set to a visible tab. TabView might crash when its selection is set to a hidden or otherwise unavailable tab.” A selection restored from UserDefaults that names a tab you later hid is the shape to look for.
  • Selectable Text. “In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, a Text view with .textSelection(.enabled) applied now supports user-interactive selection using the system text selection UI.” Apple adds that such views “might include additional gestures for system text selection interactions” and points custom gestures at .highPriorityGesture(); the same build also makes TextRenderer work on selectable Text.
  • Presented view controllers. “In apps built with the iOS 27.0 SDK, a presented view controller inherits its trait collection by walking up its view’s superview chain through the intermediate views of the presentation, rather than jumping directly to the presentation controller.” Custom UIPresentationController subclasses that set traits are the ones to retest.
  • Scope bar. “In apps built with the iOS 27.0 SDK, when UISearchController uses center search-bar placement, the scope bar appears inline on the same row as the search field rather than on a separate row beneath it.”
  • External displays. “In apps built with the iOS 27.0 SDK, windowExternalDisplayNonInteractive scenes are no longer offered automatically by the system. Use UIViewController.registerSceneAccessory(_:) with a UISceneAccessory.externalNonInteractive instance to display non-interactive content on external display scenes.” SwiftUI gets the same door through .sceneAccessory with an ExternalNonInteractiveAccessory.
  • Sheets and popovers. Listed as fixed: “In apps built with the 27.0 SDKs, the controlSize, buttonSizing, buttonRepeatBehavior, menuIndicatorVisibility, and ButtonBorderShape environment values are now reset to their default values in sheets and popovers.” If a sheet inherited .controlSize(.large) from its presenter, it stops doing so.
  • containerRelativeFrame. Also fixed for 27.0-SDK builds: it “incorrectly accounts for safe-area insets on a ScrollView’s non-scrollable axis, causing the calculated scrollable content size to be too small,” so a horizontal ScrollView with containerRelativeFrame(.vertical) changes size.
  • Status-bar accessors. Fixed for 27.0-SDK builds: the deprecated status bar accessors on UIApplication, which the note lists as statusBarFrame, statusBarOrientation, statusBarStyle, and isStatusBarHidden, “might return NaN or null values.”
  • iPad and iPhone Mirroring resizing and orientation. Nine UIKit resolved issues describe what an app “built with the iOS 27 SDK” should now see when its scene connects, or when the user resizes or rotates its window: UIRequiresFullScreen apps get “a discrete change to a new UIScreen with an updated bounds” instead of continuous resize updates, UIScreen.main bounds “should remain fixed once the screen connects,” and “supported interface orientations should no longer be a condition for continuous resizability.”
  • Menus and scroll-to-top. Two smaller SwiftUI shifts: “In apps built with the 27.0 SDKs, a LabeledContent view used inside a Menu maps its value to the platform menu item’s subtitle,” and, listed as fixed, “In apps built with the 2027 SDKs, tapping the status bar to scroll a ScrollView to its top correctly updates a bound scrollPosition.” A menu label that carried a value for layout reasons now grows a subtitle, and a scrollPosition binding that read stale after a status-bar tap now updates.

Those 12 categories cover the entries that change existing behavior. New capabilities behind the same SDK gate, such as the ReadableDocument protocol, the Document protocol built on it, and UIScene.extendStateRestoration, sit in the later sections; the external-displays category pairs the UIKit removal with its SwiftUI replacement.

Two MetricKit entries belong here even though they are about recompiling rather than about linking. “HitchTimeMetric.ratio and SignpostIntervalMetric.hitchTimeRatio now use the new HitchTimeRatio type, a Dimension subclass that expresses hitch time as a ratio of milliseconds hitching per second of tracked duration. Recompile your app with the latest SDK to pick up this type change and avoid any crashes on launch.” And: “The scrollHitchTime(_:) case of MetricResult and the ScrollHitchTimeMetric type are no longer part of the new Swift MetricKit API, and MetricReport values no longer contain scroll hitch entries. Use the hitchTime(_:) case and HitchTimeMetric instead, which report per-app animation hitch time. Recompile your app with the latest SDK to avoid a missing symbol crash if it references ScrollHitchTimeMetric or scrollHitchTime(_:).”2 In the iOS 27 SDK’s MetricKit Swift interface, ScrollHitchTimeMetric and scrollHitchTime appear zero times and HitchTimeRatio appears four times, so a binary built against the beta SDK that used either name is referencing a symbol the GA interface does not export.4 My MetricKit post covers the new API from the June beta.

Which APIs are deprecated in 27.0?

The notes list 11 deprecations. A deprecation in a release note is a sentence; a deprecation in the SDK is an availability annotation the compiler reads, and the two do not always say the same thing. I checked each entry against the headers and Swift interfaces inside the iPhoneOS 27.0 SDK in Xcode 27:24

Note entry What the SDK says
canOpenURL: is deprecated. Attempt to open the URL and handle any failure instead of validating it first.” API_DEPRECATED("Prefer attempting to open URLs and handling any failures", ios(3.0, 27.0), visionos(1.0, 27.0), tvos(9.0, 27.0)) in UIApplication.h; the canOpenURL post has the replacement pattern
“On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead.” API_DEPRECATED("Use Background Assets instead.", ios(9.0, 27.0), watchos(2.0, 27.0), tvos(9.0, 27.0)) on the class, its preservation-priority methods, and its notification and priority constants; the ODR post prices the migration, and its FAQ’s “What you get is a compiler warning” now carries the deployment-target qualification from the next section
“The originalFilename property on PHAssetResource is incorrectly marked as non-nullable, which misrepresents the property value; a new, nullable filename property is available as a replacement.” originalFilename is API_DEPRECATED("Use filename instead", ios(9, 27), macos(10.15, 27), tvos(10, 27), visionos(1, 27)); filename is nullable and API_AVAILABLE(macos(27), ios(27), tvos(27), visionos(27))
The original MetricKit APIs, MXMetricManager, MXMetricManagerSubscriber, MXMetricPayload, and MXDiagnosticPayload, “are no longer recommended for new adoption. Use MetricManager instead.” API_DEPRECATED("Use MetricManager instead.", ios(13.0, API_TO_BE_DEPRECATED), macos(12.0, API_TO_BE_DEPRECATED)) on MXMetricManager: a soft deprecation with no version, so no warning today. Apple’s reference page for the class lists it as deprecated in 27.0 on every platform, so the documentation and the header disagree; my MetricKit post repeated the page’s version and carries a dated note on the split now6
ScrollHitchTimeMetric and scrollHitchTime(_:) “are no longer part of the new Swift MetricKit API” Zero occurrences of either name in MetricKit.swiftmodule; not deprecated, removed
“The FileDocument protocol is deprecated. Use ReadableDocument for read-only documents or Document for documents that support reading and writing.” FileDocument: deprecated: 100000.0, message: "Conform your type to Document instead."; ReferenceFileDocument: "Use Document protocol instead."; both soft, and Document is @available(iOS 27.0, macOS 27.0, visionOS 27.0, *), so the replacement needs a 27 floor
“The calendar.deleteEvents schema has been renamed to calendar.deleteEvent.” deleteEvents appears zero times in AppIntents.swiftmodule; deleteEvent: some AppSchemaIntent is there. A rename with no alias is a compile error for anyone on the old name
__PKStrokeRenderState has been renamed to PKStrokeRenderStateReference, with PKStrokeRenderStateReference.init(…) replacing PKStrokeRenderState.asObjCRenderState().” PKStrokeRenderState.h declares @interface PKStrokeRenderState under API_AVAILABLE(ios(27.0), macos(27.0), visionos(27.0)) with NS_SWIFT_NAME(PKStrokeRenderStateReference); the Swift interface has no asObjCRenderState at all; the replacement Apple names is the reference class’s init(_ swiftValue: PKStroke.RenderState), so PKStrokeRenderStateReference(state) is the new call shape and the old call fails to compile
“Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” Not an annotation; a launch failure. See the scene mandate post
“AirPort Utility will no longer be available for new downloads from the App Store.” Re-downloads still work; “functionality is not guaranteed” on iOS 27 An app, not an API
“Weather Highlights is currently only available in US English.” Apple files it under Deprecations; it reads as an availability note

One soft deprecation and one rename sit outside the Deprecations headings. The .roundedBorder text field style carries a deprecated: 100000.0 annotation in the SwiftUI interface whose message, with its inner backticks removed, reads “Use textFieldStyle(.bordered) with textInputBorderShape(.roundedRectangle)”; it matches the New Features entry that introduces TextInputBorderShape. The 100000.0 version is Apple’s convention for “deprecated, but not yet”: under default compiler settings the compiler stays silent, and the message only shows in the interface. The rename is harder. UINavigationItem.navigationBarMinimization “replaces UINavigationItem.barMinimizeBehavior and UINavigationItem.barMinimizationSafeAreaAdjustment,” and SwiftUI’s toolbarMinimizationBehavior replaces toolbarMinimizeBehavior the same way; none of the three old names appears in the 27.0 SDK’s UIKit headers or in the UIKit and SwiftUI Swift interfaces, so code on them fails to compile rather than warns, the same class as deleteEvents.24

The hard ones are quieter than they look, too. The compiler compares a deprecation version against your deployment target, not against the SDK, so ios(3.0, 27.0) produces a warning only in a target whose minimum iOS is 27.0. I compiled one file that calls canOpenURL, creates an NSBundleResourceRequest, and reads originalFilename against the 27 SDK three times: at -target arm64-apple-ios17.0-simulator and at 26.0 it compiled with no diagnostics, and at 27.0 it produced three warnings, 'canOpenURL' was deprecated in iOS 27.0: Prefer attempting to open URLs and handling any failures, 'NSBundleResourceRequest' was deprecated in iOS 27.0: Use Background Assets instead., and 'originalFilename' was deprecated in iOS 27: Use filename instead.4 An app with a realistic floor will not hear about any of these from the compiler; under default compiler settings, the grep in the checklist below is the only notice you get.

Which fixes did I verify?

You can run two Foundation entries rather than read them. The notes list the first as fixed: “+[NSURL URLWithString:] no longer double-encodes the % of valid percent-escape sequences when encoding other invalid characters.”2 The probe builds NSURL(string:) from three strings that each contain one valid escape and one character NSURL must escape, and prints absoluteString. I built it twice with Xcode 27: once for the Mac, and once for the simulator with a minimum iOS of 26.0, then ran that one simulator binary, unchanged, on an iOS 26.5 runtime and on the iOS 27.0 runtime:4

Input macOS 26.6.2, and the simulator binary on iOS 26.5 (identical) The same simulator binary on iOS 27.0 (24A434)
https://example.com/a%20b c https://example.com/a%2520b%20c https://example.com/a%20b%20c
https://example.com/search?q=caf%C3%A9 au lait https://example.com/search?q=caf%25C3%25A9%20au%20lait https://example.com/search?q=caf%C3%A9%20au%20lait
https://example.com/p%20q{r https://example.com/p%2520q%7Br https://example.com/p%20q%7Br

The first column is the old behavior: NSURL escapes the space, and it also turns the % of an escape that was already valid into %25, so the path comes out different from the one the escape named. The iOS 27.0 column is the fix. One Mach-O, whose LC_BUILD_VERSION reads minos 26.0 and sdk 27.0, produced both simulator columns, so the operating system the code runs on decides the result, not the SDK you compile against and not the target you build for. An app you build today keeps the old encoding on the iOS 26.5 runtime I tested, and the release note gives no reason to expect a different result on any other 26.x release.

The notes list the second as new, and I could not reproduce it where I can run code: “volumeAvailableCapacityKey is truncated to 3 significant decimal digits at the block count level (e.g., 123,456,789 blocks becomes 123,000,000 blocks).”2 In the iOS 27.0 simulator, URL.resourceValues(forKeys: [.volumeAvailableCapacityKey]) returned 226,009,026,560 bytes, and statfs on the same path returned f_bavail 55,177,985 at f_bsize 4,096, which multiplies to the same figure exactly; a three-significant-digit block count would have been 55,100,000 blocks, or 225,689,600,000 bytes.4 The host Mac reported 55,177,998 blocks through the same code. My reading is that the truncation lives in the device’s kernel rather than in Foundation, and that the simulator, which asks the Mac’s kernel about the Mac’s volume, cannot show it; I have not run the probe on a device, so treat the entry as untested rather than false, and expect the rounding to appear in device reports of free space that used to be exact.

What is new that changes code you already have?

HealthKit’s limited history. The note is one line, “Updated HealthKit permissions flow now lets users grant apps access to limited history or full history,” and the API reference carries the consequences.25 After the data-type screen, “a second screen prompts them to choose how much historical data to grant your app, either a recent limited window or their full history,” and “Time-bound authorization applies only to sample types.”5 The new earliestAuthorizedSampleDate(for:), available from iOS 27.0 and watchOS 27.0, returns a dictionary from HKObjectType to the earliest readable date, and the boundary is not where you would guess: “HealthKit evaluates the boundary against a sample’s end date, so the framework might service your query with a sample that begins before the earliest authorization date as long as the sample ends after it.”45 The privacy rule holds: “Your app can’t distinguish between denied and full access; limited authorization is the only state your app can identify, by design.”5 Apple’s guidance is to treat everything before the returned date as unknown rather than absent, and to clamp each query’s start date per type. Any trend, baseline, or streak computed from HealthKit now has to be correct on a window the user picked. The HealthKit post covers the June additions and does not cover the permission-model change.

StoreKit offer codes. “Offer code redemption APIs now return a VerificationResult when redemption completes. If a redemption succeeds, your app receives a VerificationResult that contains a Transaction object. If a redemption fails, your app receives an error that describes what caused the redemption to fail.”2 In the interface, presentOfferCodeRedeemSheet(in:) is deprecated in 27.0 with “Use presentOfferCodeRedeemSheet(from:options:) instead.”, and the replacement is presentOfferCodeRedeemSheet(from viewController: UIViewController, options: Set<RedeemOption> = []) async throws -> VerificationResult<Transaction>, available from iOS 27.0.4 Code that presented the sheet and then listened on Transaction.updates for the result can now await it.

Core AI in the background. “The system now restricts background access to the Neural Engine, similar to GPU usage restrictions,” and “Neural Engine memory usage is now attributed to your app process instead of the system, and appears in the Allocations instrument.” Background access “requires the new entitlement: “com.apple.developer.background-tasks.continued-processing.inference”.”2 An app that ran inference from a background task on 26 and never asked for anything finds the Neural Engine closed until it holds the entitlement, and the Neural Engine memory it uses now shows up under its own process in Allocations.

Background Assets. “You can reduce your app’s storage usage with localized asset packs. The system delivers the appropriately localized asset packs based on the user’s preferred languages.”2 For an app leaving On Demand Resources, localized packs are the feature that replaces per-language tags.

Critical alerts. The notes list the critical-alerts behavior as fixed: “Critical alerts are automatically turned on for any apps that request your permission to enable notifications.”2 The entry says nothing more, so retest any notification flow that looked over-privileged on the betas.

Menus, @State, TLS, and the new slice. Four entries have their own posts. The menu bar and context menus on iPadOS 27 and macOS 27 “present a reduced set of menu item images,” with preferredImageVisibility on UIMenuElement as the override: see menu images. The @State macro rewrite is a SwiftUI entry in these notes, and it changes what compiles under Xcode 27: see the Xcode 27 post for the reproduction and the @State macro post for the audit. The stricter TLS requirement for MDM, enrollment, and software-update traffic starts “in 27.0 operating systems”: see the TLS audit. And arm64e.x1 with CPA2 on “iPhone models with A20 Pro or later chips, Mac computers with M6 or later chips, and Apple Watch models with S11 or later chips”: see arm64e.x1.2

Smaller ones worth a grep. System gains Swift stat, lstat, fstat, and fstatat with a Stat type and FilePath.stat(), and the notes list as fixed a clash between those methods and an unqualified stat() in your own extensions. NSTextTable “and its related objects and types are available to UIKit clients starting with OS 27 releases.” AsyncImage “now automatically caches downloaded images using HTTP caching protocols,” with URLRequest initializers and View.asyncImageURLSession(_:) to steer it. “When linked on iOS 27, tvOS 27, macCatalyst 27, or visionOS 27 SDKs,” UIScene.extendStateRestoration and UIScene.completeStateRestoration extend state restoration into the background-to-foreground transition. And SwiftData lists a fix for “a deadlock for @Query when saving a ModelContext on a background actor while scheduling new async tasks for a ModelActor.”2

Known issues to plan around

  • photos.asset entities stop compiling. “Existing entities that conformed to @AppEntity(schema: .photos.asset) in prior releases might no longer compile in the 27 SDKs because new properties were added to the schema in this release.” Workaround: “To continue conforming to the schema, adopt the additional properties and move the code behind an availability check.”2 The macro will not tell you which properties: an empty @AppEntity(schema: .photos.asset) conformance compiles clean under swiftc, and its expansion adds only an AssistantSchemaEntity conformance that carries the schema name. The list comes from Xcode’s App Intents metadata step, appintentsmetadataprocessor, which fails the build with one error per missing property. Run by hand on that empty conformance against the 27.0 SDK, it reports 12, each with a fix-it: hasSuggestedEdits: Bool, isFavorite: Bool, isHidden: Bool, creationDate: Date?, location: GeoToolbox.PlaceDescriptor?, assetType: <#PhotoAssetType#>?, filter: <#PhotoFilterEffectType#>?, exposure: Double?, saturation: Double?, warmth: Double?, aperture: Double?, and isPortraitModeEnabled: Bool?; the two <#…#> placeholders stand for enums you declare yourself against the .photos.assetType and .photos.filterType enum schemas, which the interface names PhotoAssetType and PhotoFilterEffectType. I could not diff that list against the 26 SDK, because the only Xcode on this Mac is 27A266a.4
  • Now Playing tokens go to production.RemoteMediaSession and RemoteMediaSessionRepresentable always provision Now Playing start and update push tokens for the production APNs environment, even if the aps-environment configuration is set to development.” Workaround: “Use the production environment for testing and validation.”2 The class is in the new NowPlaying framework, marked unavailable on macOS and visionOS.4
  • SpotlightSearchTool overflows the on-device model. Without a configuration, “the tool’s description and parameter schema alone exceed the on-device model’s context window before any prompt is added.” Workaround: a focused guide, “.focused(.communications), .focused(.calendar), .focused(.documents), .focused(.visualMedia), or .focused(.audio).”2 The API is real: SpotlightSearchTool.Guide.focused(_ domain: ContentDomain = .items) sits beside .complete and .dynamic(_:) in the _CoreSpotlight_FoundationModels interface.4 My on-device AI post covers the tool; its June adoption steps paired the default configuration with the system model, and they carry a dated correction now.
  • Performance traces from Control Center. “Gathering PowerProfiler and Lookback traces through the Performance Trace Control Center widget might fail to produce traces.” The workaround Apple offers is to “Gather traces on iOS 27.0 beta 1 or earlier,” which is not a workaround most teams can take on a device that has updated.2
  • StoreKit testing. “Changing the storefront or locale using SKTestSession doesn’t propagate through Storefront.updates,” and “Failed purchases using SKTestSession might display error dialogs even when dialogsDisabled is set to true.”2
  • Shortcuts and UnionValue. A parameter with “two number-related types (for example, both Int and Double)” shows the number option twice; Apple’s workaround is to declare one.2

What I would do this week

  1. Archive once from Xcode 27 and run the linked-on-27 list above against the app before TestFlight: launch screen keys, scene lifecycle, any TabView whose selection can name a hidden tab, and any sheet that inherited control modifiers.2
  2. Build the MetricKit code against the GA SDK before shipping; a binary that still references ScrollHitchTimeMetric or the old ratio type is a launch crash by Apple’s description, and the interface no longer exports the name.24
  3. Grep for canOpenURL, NSBundleResourceRequest, originalFilename, FileDocument, deleteEvents, asObjCRenderState, and barMinimizeBehavior; the first three warn only at a 27.0 deployment target, FileDocument is soft, and the last three fail to compile, so the grep is the notice.4
  4. If you read HealthKit, call earliestAuthorizedSampleDate(for:) after authorization and clamp each query’s start date per type; then decide what a streak or a baseline means on a window the user chose.5
  5. Log the build number in bug reports from three places: ProcessInfo on the device, the SDK’s SystemVersion.plist on the build machine, and simctl list runtimes for simulator repros. They differ, and a fix that is in 24A437 may not be in 24A434.4
  6. If you build URLs from strings with NSURL(string:), keep testing on iOS 26: the OS fixes the %25 double-encoding, not your rebuild, and one Xcode 27 binary produces it on the 26.5 runtime and not on 27.0.4

FAQ

When did iOS 27.0 come out, and what build is it?

Monday, September 14, 2026, as build 24A437, the same build Apple posted as the release candidate on Friday, September 11. iPadOS 27.0 shares the number.1

Which iOS 27.0 build is in the Xcode 27 SDK?

The iPhoneOS 27.0 SDK inside Xcode 27 (27A266a) reports ProductBuildVersion 24A430, and the iOS 27.0 simulator runtime reports 24A434. Neither is the device build.4

What is deprecated in iOS 27?

The notes list 11 entries: canOpenURL:, On Demand Resources and NSBundleResourceRequest, PHAssetResource.originalFilename, the original MetricKit APIs, ScrollHitchTimeMetric, FileDocument, the calendar.deleteEvents schema, __PKStrokeRenderState, the UIKit scene-lifecycle mandate, AirPort Utility, and a Weather Highlights language note. Three carry hard 27.0 deprecation versions in the SDK and warn only at a 27.0 deployment target, two are soft, two are renames, one is a removal, and three are not API changes.24

Does my app need to be rebuilt for iOS 27?

Not to keep running, and the entries split three ways. SDK-gated: the 12 linked-on-27 categories above, which change nothing until you build with the 27.0 SDK. OS-level, reaching every binary on a 27.0 device: the Neural Engine background restriction and its entitlement, HealthKit’s limited-history permission flow, the TLS enforcement for MDM and update traffic, the menu image change on iPadOS 27, the critical-alerts fix, and the NSURL encoding fix. Beta-binary: MetricKit code built against a beta SDK, which Apple says to recompile with the GA SDK to avoid crashes. Apple’s App Store SDK minimum has been the 26 SDKs since April 28, 2026; the 27 SDK requirement is a later deadline that these notes do not set.23

Where are the iOS 27 release notes?

On Apple’s developer documentation site under iOS & iPadOS Release Notes, one page for 27.0, organized by area with New Features, Resolved Issues, Known Issues, and Deprecations under each. The counts in this post come from that page as fetched on September 15, 2026.2

Is the NSURL fix in the SDK or in the OS?

In the OS. One simulator binary, built with Xcode 27 against the 27.0 SDK with a minimum iOS of 26.0, double-encodes on an iOS 26.5 runtime and does not on the iOS 27.0 runtime, and the Mac build on macOS 26.6.2 double-encodes too; nothing changed between the two simulator runs except the operating system.4

Sources


  1. Apple, Releases, RSS feed fetched September 15, 2026: “iOS 27.0 (24A437)”, “iPadOS 27.0 (24A437)”, “macOS 27.0 (26A428)”, “Xcode 27 (27A266a)”, “tvOS 27.0 (24J361)”, “visionOS 27.0 (24M362)”, and “watchOS 27.0 (24R364)” dated Mon, 14 Sep 2026; “iOS 27.0 RC (24A437)” dated Fri, 11 Sep 2026; “iOS 27.0 beta (24A5355q)” dated Mon, 08 Jun 2026. 

  2. Apple, iOS & iPadOS 27 Release Notes, fetched September 15, 2026 after the GA release. Counts (93 headed areas; 65 New Features, 197 Resolved Issues, 23 Known Issues, 11 Deprecations) are list items under each area’s headings. Entries quoted, by radar: Overview paragraph; UIKit, New Features (launch screen 168247372, presented view controllers 170005251, scope bar 173860616, external displays 177015874, state restoration 161843040, menu images and preferredImageVisibility 170479084, navigationBarMinimization 177953926), Resolved Issues (status bar accessors 162044221, resizing 166422120, 178555304, 178558224, 178558897, 178559386, 178560235, 178561952, 178562971, 178573319), Deprecations (scene lifecycle 141837548, canOpenURL: 179874781); SwiftUI, New Features (TabView 164516837, selectable Text 79770704, TextRenderer on selectable Text 158160386, .sceneAccessory 175548901, AsyncImage 78212597, @State 105893279, menu images 170480710, TextInputBorderShape 173362083, toolbarMinimizationBehavior 177954148), Resolved Issues (sheets and popovers 167448274, containerRelativeFrame 165913417, scrollPosition after a status-bar tap 111501113, FB12477370), New Features (LabeledContent in Menu 175594929), Deprecations (FileDocument 178776840); MetricKit, New Features (HitchTimeRatio 180024784) and Deprecations (174892111, 180455992); Foundation, New Features (volumeAvailableCapacityKey 75545872) and Resolved Issues (NSURL 161588649, FB20439045); App Intents, Known Issues (photos.asset 181800016, FB23652582) and Deprecations (calendar.deleteEvent 176751155); On Demand Resources, Deprecations (170066290); PhotoKit, Deprecations (175412725, FB22589474); PencilKit, Deprecations (176410709); AirPort Utility, Deprecations (158364073); Weather Highlights, Deprecations (164408676); HealthKit, New Features (172310874); StoreKit, New Features (141012819); Core AI, New Features (174796039, 179282606); Background Assets, New Features (163944365); Notifications, Resolved Issues (179179362); Network Security, New Features (176055825); Hardware Security, New Features (152103975); System, New Features (160612181) and Resolved Issues (177911316); TextKit, New Features (159870239); SwiftData, Resolved Issues (178113288); Now Playing, Known Issues (186036238); Core Spotlight, Known Issues (183770678); Control Center, Known Issues (184729556); StoreKit Testing in Xcode, Known Issues (184155259, 184255116); Shortcuts, Known Issues (168315587). 

  3. Apple, App Store Connect release notes, fetched September 15, 2026. September 14, 2026 entry quoted in full in the table; the September 9, 2026 entry records RC-SDK uploads. The 26-SDK minimum since April 28, 2026 is from Apple’s Upcoming requirements page. 

  4. Author reproduction on Xcode 27.0 (27A266a) with DEVELOPER_DIR pointed at it, macOS 26.6.2 (25G83), September 15, 2026. Builds: iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist has ProductBuildVersion 24A430 and ProductVersion 27.0; xcrun simctl list runtimes prints “iOS 27.0 (27.0 - 24A434)”. Headers and interfaces, all under iPhoneOS.sdk/System/Library/Frameworks: UIKit.framework/Headers/UIApplication.h line 98 (canOpenURL:); Foundation.framework/Headers/NSBundle.h lines 721 to 796 (NSBundleResourceRequest); Photos.framework/Headers/PHAssetResource.h lines 29 and 33; MetricKit.framework/Headers/MXMetricManager.h line 32; MetricKit.framework/Modules/MetricKit.swiftmodule/arm64e-apple-ios.swiftinterface, zero matches for ScrollHitchTimeMetric or scrollHitchTime, four for HitchTimeRatio; SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterface lines 23088 to 23093 (FileDocument), 9334 to 9338 (ReferenceFileDocument), 1728 to 1731 (Document), 9489 (.roundedBorder message), 13763 (toolbarMinimizationBehavior); zero whole-identifier matches for barMinimizeBehavior, barMinimizationSafeAreaAdjustment, or toolbarMinimizeBehavior across UIKit.framework/Headers, UIKit.framework/Modules, and SwiftUI.framework/Modules (the only substring hits are the toolbarMinimizationSafeAreaAdjustment modifier and its ToolbarMinimizationSafeAreaAdjustment type), while UINavigationItem.h declares navigationBarMinimization; AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterface, zero matches for deleteEvents, deleteEvent: some AppIntents::AppSchemaIntent at line 12608; PencilKit.framework/Headers/PKStrokeRenderState.h lines 15 to 17, and PencilKit.framework/Modules/PencilKit.swiftmodule/arm64e-apple-ios.swiftinterface with zero matches for asObjC, convenience public init(_ swiftValue: PencilKit::PKStroke.PencilKit::RenderState) on PKStrokeRenderStateReference at line 46, and the reverse public init(_ objcValue: PencilKit::PKStrokeRenderStateReference) inside PKStroke.RenderState at line 38; StoreKit.framework/Modules/StoreKit.swiftmodule/arm64e-apple-ios.swiftinterface lines 311 to 322; HealthKit.framework/Modules/HealthKit.swiftmodule/arm64e-apple-ios.swiftinterface lines 741 and 742 (earliestAuthorizedSampleDate(for:), @available(iOS 27.0, watchOS 27.0, macCatalyst 27.0, macOS 27.0, visionOS 27.0, *)); NowPlaying.framework/Modules/NowPlaying.swiftmodule/arm64e-apple-ios.swiftinterface lines 180 to 182 and 276 to 278; _CoreSpotlight_FoundationModels.framework/Modules/_CoreSpotlight_FoundationModels.swiftmodule/arm64e-apple-ios.swiftinterface lines 64 to 78 and 100 to 129. photos.asset probe: a 15-line Swift file importing AppIntents and CoreLocation that declares @AppEntity(schema: .photos.asset) struct ProbeAsset with an EntityQuery, an id, a displayRepresentation, and no schema properties; swiftc -c -target arm64-apple-ios27.0-simulator compiled it with exit 0 and no diagnostics, and -Xfrontend -dump-macro-expansions showed the macro adding, under an @available(iOS 27.0, macOS 27.0, tvOS 27.0, watchOS 27.0, visionOS 27.0, *) attribute, extension ProbeAsset: AssistantSchemaEntity { static let __appSchemaEntity = "photos.asset" } and an empty AppEntity extension. Re-running the driver’s own swift-frontend line (captured with swiftc -###) with -emit-const-values-path and -const-gather-protocols-file pointed at an 18-protocol list I wrote (AppIntent, AppEntity, AppEnum, AssistantSchemaEntity, EntityQuery, and the other App Intents protocols) produced a .swiftconstvalues file, and appintentsmetadataprocessor --module-name ProbeMod --sdk-root <iPhoneSimulator27.0.sdk> --xcode-version 27A266a --platform-family iOS --deployment-target 27.0 --target-triple arm64-apple-ios27.0-simulator on it exited 255 with “At least one halting error was produced during export” and 12 lines of the form “error: Missing required property ‘exposure’ from AppSchemaEntity ‘photos.asset’”, each followed by a fix-it such as “var exposure: Double?” (the assetType and filter fix-its carry <#PhotoAssetType#>? and <#PhotoFilterEffectType#>? placeholders; AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterface declares those names at lines 11695 and 11705 as AppSchema.Enum("PhotoAssetType") under assetType and AppSchema.Enum("PhotoFilterEffectType") under filterType); the invocation mirrors Xcode’s metadata step but is not byte-for-byte the build system’s, whose protocol list comes from SWIFT_EMIT_CONST_VALUE_PROTOCOLS. Deprecation-warning probe: an 11-line Swift file importing UIKit, Foundation, and Photos that calls canOpenURL(_:), constructs NSBundleResourceRequest(tags:), and reads PHAssetResource.originalFilename, compiled with swiftc -c against the iPhoneSimulator 27.0 SDK at -target arm64-apple-ios17.0-simulator, ios26.0, and ios27.0: zero diagnostics at 17.0 and 26.0, three [#DeprecatedDeclaration] warnings at 27.0, quoted in the text. NSURL probe: a 16-line Swift file printing NSURL(string:)?.absoluteString for the three inputs in the table, compiled with swiftc -O for the host and, once, with swiftc -O -target arm64-apple-ios26.0-simulator against the iPhoneSimulator 27.0 SDK (otool -l on the result shows LC_BUILD_VERSION with minos 26.0 and sdk 27.0); I ran that single simulator binary with xcrun simctl spawn on a booted simulator on the iOS 26.5 (23F77) runtime and then on a booted iPhone 18 Pro simulator on the iOS 27.0 (24A434) runtime; the macOS and iOS 26.5 outputs were identical, and all outputs are as tabled. Capacity probe: URL(fileURLWithPath: NSHomeDirectory()).resourceValues(forKeys: [.volumeAvailableCapacityKey, .volumeTotalCapacityKey, .volumeAvailableCapacityForImportantUsageKey]) plus statfs; simulator run printed volumeAvailableCapacity = 226009026560, f_bavail = 55177985, f_bsize = 4096; host run printed volumeAvailableCapacity = 226009079808, f_bavail = 55177998

  5. Apple, HealthKit documentation, earliestAuthorizedSampleDate(for:) and Authorizing access to health data, fetched September 15, 2026. The method page lists availability iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, visionOS 27.0, and watchOS 27.0 and is the source of the end-date sentence and of “Your app can’t distinguish between denied and full access; limited authorization is the only state your app can identify, by design.”; the guide is the source of “people can choose to grant your app access to only a limited window of recent data rather than their full history,” the second-screen sentence, and “Time-bound authorization applies only to sample types.” 

  6. Apple, MXMetricManager, MetricKit class reference, fetched September 15, 2026 through Apple’s documentation JSON: availability lists iOS 13.0, iPadOS 13.0, Mac Catalyst 13.1, macOS 12.0, and visionOS 1.0 with deprecatedAt 27.0 on each, and the deprecation summary reads “Use MetricManager instead.” 

Related Posts

canOpenURL Is Deprecated: What to Call Instead

Apple deprecated canOpenURL in three sentences, and halved the scheme allowlist ceiling to 25 entries. The replacement, …

29 min read

The iOS 27 Launch Screen Rule: Four Keys or Rejection

Apps built with the iOS 27 SDK must declare a launch screen or the App Store rejects them. The four keys, and how to aud…

17 min read

Designing for iPhone Duo: What Moves, Splits, and Stays

Apple's iPhone Duo design guide and three Tech Talks, read as rules: two size classes instead of poses, displacement at …

23 min read