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. 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. 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.
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.
- 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,
TabViewcrashing on a hidden selection, system text selection on selectableText, trait inheritance for presented view controllers, the inline scope bar, external display scenes no longer offered automatically, control modifiers reset inside sheets and popovers,containerRelativeFramesafe-area math, the status-bar accessors, iPad resize rules underUIRequiresFullScreen, and two smaller SwiftUI shifts in menus and scroll-to-top. - Recompile or crash. MetricKit’s
HitchTimeMetric.rationow measures in a newHitchTimeRatiounit, andScrollHitchTimeMetricleft 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. - 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 (markedAPI_TO_BE_DEPRECATED, so a soft deprecation),ScrollHitchTimeMetric,FileDocument,calendar.deleteEventsrenamed tocalendar.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. - Two Foundation changes, tested.
+[NSURL URLWithString:]no longer double-encodes a valid%20when it escapes a space elsewhere in the string: one simulator binary produces%2520on an iOS 26.5 runtime and%20on the iOS 27.0 runtime, and the Mac build matches the old side, so the fix follows the OS, not the SDK. ThevolumeAvailableCapacityKeytruncation to three significant digits does not show in the simulator, which reports 55,177,985 blocks exactly.
Which build is which?
| Where | Build | Evidence |
|---|---|---|
| WhereDevice, iOS 27.0 / iPadOS 27.0 | Build24A437 | EvidenceReleases feed, Mon, Sep 14, 2026; “iOS 27.0 RC (24A437)” on Fri, Sep 11 |
| WhereSDK inside Xcode 27 (27A266a) | Build24A430 | EvidenceiPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist, ProductBuildVersion |
| WhereiOS 27.0 simulator runtime | Build24A434 | Evidencexcrun simctl list runtimes prints “iOS 27.0 (27.0 - 24A434)” |
| WheremacOS 27.0 | Build26A428 | EvidenceReleases feed, Mon, Sep 14 |
| WhereApp Store Connect | Build27.0 GA SDKs accepted | Evidence“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 9 |
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.
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. 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:
- 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.plistmust contain one of the following keys:UILaunchStoryboardName,UILaunchStoryboards,UILaunchScreen, orUILaunchScreens. 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. 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.
TabViewselection. “In apps built with the iOS 27.0 and iPadOS 27.0 SDKs, aTabViewenforces that its selection is set to a visible tab.TabViewmight crash when its selection is set to a hidden or otherwise unavailable tab.” A selection restored fromUserDefaultsthat 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, aTextview 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 makesTextRendererwork on selectableText. - 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
UIPresentationControllersubclasses that set traits are the ones to retest. - Scope bar. “In apps built with the iOS 27.0 SDK, when
UISearchControlleruses 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,
windowExternalDisplayNonInteractivescenes are no longer offered automatically by the system. UseUIViewController.registerSceneAccessory(_:)with aUISceneAccessory.externalNonInteractiveinstance to display non-interactive content on external display scenes.” SwiftUI gets the same door through.sceneAccessorywith anExternalNonInteractiveAccessory. - Sheets and popovers. Listed as fixed: “In apps built with the 27.0 SDKs, the
controlSize,buttonSizing,buttonRepeatBehavior,menuIndicatorVisibility, andButtonBorderShapeenvironment 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 aScrollView’s non-scrollable axis, causing the calculated scrollable content size to be too small,” so a horizontalScrollViewwithcontainerRelativeFrame(.vertical)changes size.- Status-bar accessors. Fixed for 27.0-SDK builds: the deprecated status bar accessors on
UIApplication, which the note lists asstatusBarFrame,statusBarOrientation,statusBarStyle, andisStatusBarHidden, “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:
UIRequiresFullScreenapps get “a discrete change to a newUIScreenwith an updated bounds” instead of continuous resize updates,UIScreen.mainbounds “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
LabeledContentview used inside aMenumaps 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 aScrollViewto its top correctly updates a boundscrollPosition.” A menu label that carried a value for layout reasons now grows a subtitle, and ascrollPositionbinding 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(_:).” 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. 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:
| Note entry | What the SDK says |
|---|---|
Note entry“canOpenURL: is deprecated. Attempt to open the URL and handle any failure instead of validating it first.” | What the SDK saysAPI_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 |
Note entry“On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead.” | What the SDK saysAPI_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 |
Note entry“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.” | What the SDK saysoriginalFilename 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)) |
Note entryThe original MetricKit APIs, MXMetricManager, MXMetricManagerSubscriber, MXMetricPayload, and MXDiagnosticPayload, “are no longer recommended for new adoption. Use MetricManager instead.” | What the SDK saysAPI_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 now |
Note entryScrollHitchTimeMetric and scrollHitchTime(_:) “are no longer part of the new Swift MetricKit API” | What the SDK saysZero occurrences of either name in MetricKit.swiftmodule; not deprecated, removed |
Note entry“The FileDocument protocol is deprecated. Use ReadableDocument for read-only documents or Document for documents that support reading and writing.” | What the SDK saysFileDocument: 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 |
Note entry“The calendar.deleteEvents schema has been renamed to calendar.deleteEvent.” | What the SDK saysdeleteEvents 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 |
Note entry“__PKStrokeRenderState has been renamed to PKStrokeRenderStateReference, with PKStrokeRenderStateReference.init(…) replacing PKStrokeRenderState.asObjCRenderState().” | What the SDK saysPKStrokeRenderState.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 |
| Note entry“Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” | What the SDK saysNot an annotation; a launch failure. See the scene mandate post |
| Note entry“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 | What the SDK saysAn app, not an API |
| Note entry“Weather Highlights is currently only available in US English.” | What the SDK saysApple 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.
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. 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.” 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:
| Input | macOS 26.6.2, and the simulator binary on iOS 26.5 (identical) | The same simulator binary on iOS 27.0 (24A434) |
|---|---|---|
Inputhttps://example.com/a%20b c | macOS 26.6.2, and the simulator binary on iOS 26.5 (identical)https://example.com/a%2520b%20c | The same simulator binary on iOS 27.0 (24A434)https://example.com/a%20b%20c |
Inputhttps://example.com/search?q=caf%C3%A9 au lait | macOS 26.6.2, and the simulator binary on iOS 26.5 (identical)https://example.com/search?q=caf%25C3%25A9%20au%20lait | The same simulator binary on iOS 27.0 (24A434)https://example.com/search?q=caf%C3%A9%20au%20lait |
Inputhttps://example.com/p%20q{r | macOS 26.6.2, and the simulator binary on iOS 26.5 (identical)https://example.com/p%2520q%7Br | The same simulator binary on iOS 27.0 (24A434)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).” 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. 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. 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.” 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.” 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.” 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.” 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 = []) async throws -> VerificationResult, available from iOS 27.0. 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”.” 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.” 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.” 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.
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.”
Known issues to plan around
photos.assetentities 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.” The macro will not tell you which properties: an empty@AppEntity(schema: .photos.asset)conformance compiles clean underswiftc, and its expansion adds only anAssistantSchemaEntityconformance 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?, andisPortraitModeEnabled: Bool?; the two<#…#>placeholders stand for enums you declare yourself against the.photos.assetTypeand.photos.filterTypeenum schemas, which the interface namesPhotoAssetTypeandPhotoFilterEffectType. I could not diff that list against the 26 SDK, because the only Xcode on this Mac is 27A266a.- Now Playing tokens go to production. “
RemoteMediaSessionandRemoteMediaSessionRepresentablealways provision Now Playing start and update push tokens for theproductionAPNs environment, even if theaps-environmentconfiguration is set todevelopment.” Workaround: “Use theproductionenvironment for testing and validation.” The class is in the newNowPlayingframework, marked unavailable on macOS and visionOS. SpotlightSearchTooloverflows 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).” The API is real:SpotlightSearchTool.Guide.focused(_ domain: ContentDomain = .items)sits beside.completeand.dynamic(_:)in the_CoreSpotlight_FoundationModelsinterface. 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
PowerProfilerandLookbacktraces through thePerformance TraceControl 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. - StoreKit testing. “Changing the storefront or locale using
SKTestSessiondoesn’t propagate throughStorefront.updates,” and “Failed purchases usingSKTestSessionmight display error dialogs even whendialogsDisabledis set to true.” - 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.
What I would do this week
- Archive once from Xcode 27 and run the linked-on-27 list above against the app before TestFlight: launch screen keys, scene lifecycle, any
TabViewwhose selection can name a hidden tab, and any sheet that inherited control modifiers. - Build the MetricKit code against the GA SDK before shipping; a binary that still references
ScrollHitchTimeMetricor the oldratiotype is a launch crash by Apple’s description, and the interface no longer exports the name. - Grep for
canOpenURL,NSBundleResourceRequest,originalFilename,FileDocument,deleteEvents,asObjCRenderState, andbarMinimizeBehavior; the first three warn only at a 27.0 deployment target,FileDocumentis soft, and the last three fail to compile, so the grep is the notice. - 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. - Log the build number in bug reports from three places:
ProcessInfoon the device, the SDK’sSystemVersion.pliston the build machine, andsimctl list runtimesfor simulator repros. They differ, and a fix that is in 24A437 may not be in 24A434. - If you build URLs from strings with
NSURL(string:), keep testing on iOS 26: the OS fixes the%25double-encoding, not your rebuild, and one Xcode 27 binary produces it on the 26.5 runtime and not on 27.0.
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.
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.
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.
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.
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.
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.
Sources
- 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.
- 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
preferredImageVisibility170479084,navigationBarMinimization177953926), 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 (TabView164516837, selectableText79770704,TextRendereron selectableText158160386,.sceneAccessory175548901,AsyncImage78212597,@State105893279, menu images 170480710,TextInputBorderShape173362083,toolbarMinimizationBehavior177954148), Resolved Issues (sheets and popovers 167448274,containerRelativeFrame165913417,scrollPositionafter a status-bar tap 111501113, FB12477370), New Features (LabeledContentinMenu175594929), Deprecations (FileDocument178776840); MetricKit, New Features (HitchTimeRatio180024784) and Deprecations (174892111, 180455992); Foundation, New Features (volumeAvailableCapacityKey75545872) and Resolved Issues (NSURL161588649, FB20439045); App Intents, Known Issues (photos.asset181800016, FB23652582) and Deprecations (calendar.deleteEvent176751155); 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). - 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.
- Author reproduction on Xcode 27.0 (27A266a) with
DEVELOPER_DIRpointed at it, macOS 26.6.2 (25G83), September 15, 2026. Builds:iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plisthasProductBuildVersion24A430 andProductVersion27.0;xcrun simctl list runtimesprints “iOS 27.0 (27.0 - 24A434)”. Headers and interfaces, all underiPhoneOS.sdk/System/Library/Frameworks:UIKit.framework/Headers/UIApplication.hline 98 (canOpenURL:);Foundation.framework/Headers/NSBundle.hlines 721 to 796 (NSBundleResourceRequest);Photos.framework/Headers/PHAssetResource.hlines 29 and 33;MetricKit.framework/Headers/MXMetricManager.hline 32;MetricKit.framework/Modules/MetricKit.swiftmodule/arm64e-apple-ios.swiftinterface, zero matches forScrollHitchTimeMetricorscrollHitchTime, four forHitchTimeRatio;SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterfacelines 23088 to 23093 (FileDocument), 9334 to 9338 (ReferenceFileDocument), 1728 to 1731 (Document), 9489 (.roundedBordermessage), 13763 (toolbarMinimizationBehavior); zero whole-identifier matches forbarMinimizeBehavior,barMinimizationSafeAreaAdjustment, ortoolbarMinimizeBehavioracrossUIKit.framework/Headers,UIKit.framework/Modules, andSwiftUI.framework/Modules(the only substring hits are thetoolbarMinimizationSafeAreaAdjustmentmodifier and itsToolbarMinimizationSafeAreaAdjustmenttype), whileUINavigationItem.hdeclaresnavigationBarMinimization;AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterface, zero matches fordeleteEvents,deleteEvent: some AppIntents::AppSchemaIntentat line 12608;PencilKit.framework/Headers/PKStrokeRenderState.hlines 15 to 17, andPencilKit.framework/Modules/PencilKit.swiftmodule/arm64e-apple-ios.swiftinterfacewith zero matches forasObjC,convenience public init(_ swiftValue: PencilKit::PKStroke.PencilKit::RenderState)onPKStrokeRenderStateReferenceat line 46, and the reversepublic init(_ objcValue: PencilKit::PKStrokeRenderStateReference)insidePKStroke.RenderStateat line 38;StoreKit.framework/Modules/StoreKit.swiftmodule/arm64e-apple-ios.swiftinterfacelines 311 to 322;HealthKit.framework/Modules/HealthKit.swiftmodule/arm64e-apple-ios.swiftinterfacelines 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.swiftinterfacelines 180 to 182 and 276 to 278;_CoreSpotlight_FoundationModels.framework/Modules/_CoreSpotlight_FoundationModels.swiftmodule/arm64e-apple-ios.swiftinterfacelines 64 to 78 and 100 to 129.photos.assetprobe: a 15-line Swift file importing AppIntents and CoreLocation that declares@AppEntity(schema: .photos.asset) struct ProbeAssetwith anEntityQuery, anid, adisplayRepresentation, and no schema properties;swiftc -c -target arm64-apple-ios27.0-simulatorcompiled it with exit 0 and no diagnostics, and-Xfrontend -dump-macro-expansionsshowed 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 emptyAppEntityextension. Re-running the driver’s ownswift-frontendline (captured withswiftc -###) with-emit-const-values-pathand-const-gather-protocols-filepointed at an 18-protocol list I wrote (AppIntent,AppEntity,AppEnum,AssistantSchemaEntity,EntityQuery, and the other App Intents protocols) produced a.swiftconstvaluesfile, andappintentsmetadataprocessor --module-name ProbeMod --sdk-root --xcode-version 27A266a --platform-family iOS --deployment-target 27.0 --target-triple arm64-apple-ios27.0-simulatoron 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?” (theassetTypeandfilterfix-its carry<#PhotoAssetType#>?and<#PhotoFilterEffectType#>?placeholders;AppIntents.framework/Modules/AppIntents.swiftmodule/arm64e-apple-ios.swiftinterfacedeclares those names at lines 11695 and 11705 asAppSchema.Enum("PhotoAssetType")underassetTypeandAppSchema.Enum("PhotoFilterEffectType")underfilterType); the invocation mirrors Xcode’s metadata step but is not byte-for-byte the build system’s, whose protocol list comes fromSWIFT_EMIT_CONST_VALUE_PROTOCOLS. Deprecation-warning probe: an 11-line Swift file importing UIKit, Foundation, and Photos that callscanOpenURL(_:), constructsNSBundleResourceRequest(tags:), and readsPHAssetResource.originalFilename, compiled withswiftc -cagainst the iPhoneSimulator 27.0 SDK at-target arm64-apple-ios17.0-simulator,ios26.0, andios27.0: zero diagnostics at 17.0 and 26.0, three[#DeprecatedDeclaration]warnings at 27.0, quoted in the text.NSURLprobe: a 16-line Swift file printingNSURL(string:)?.absoluteStringfor the three inputs in the table, compiled withswiftc -Ofor the host and, once, withswiftc -O -target arm64-apple-ios26.0-simulatoragainst the iPhoneSimulator 27.0 SDK (otool -lon the result showsLC_BUILD_VERSIONwithminos 26.0andsdk 27.0); I ran that single simulator binary withxcrun simctl spawnon 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])plusstatfs; simulator run printedvolumeAvailableCapacity = 226009026560,f_bavail = 55177985,f_bsize = 4096; host run printedvolumeAvailableCapacity = 226009079808,f_bavail = 55177998. - 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.”
- 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
deprecatedAt27.0 on each, and the deprecation summary reads “Use MetricManager instead.”