What’s new
App Tracking Transparency gets an expanded prompt
The App Tracking Transparency framework now supports an alternative, expanded permission prompt, plus re-prompting on a yearly basis for users in the EU. The expanded prompt is required for apps serving users in France, Germany, Italy, Poland and Romania.
Why it matters: if you monetise with ad or analytics SDKs and you ship to those five markets, the single standard alert is no longer the whole story. You need to handle the expanded interface and expect the authorization status to be asked again once a year rather than once per install.
The API to reach for is ATTrackingManager.requestTrackingAuthorization(preferExpandedInterface:additionalInformationAction:completionHandler:). The additionalInformationAction closure is where you hang your own explanation screen, since the expanded prompt gives you room to say what tracking is actually used for.
import AppTrackingTransparency
if #available(iOS 27.2, *) {
ATTrackingManager.requestTrackingAuthorization(
preferExpandedInterface: true,
additionalInformationAction: { /* present your own context screen */ },
completionHandler: { status in
// .authorized, .denied, .restricted, .notDetermined
print(status.rawValue)
}
)
} else {
ATTrackingManager.requestTrackingAuthorization { status in
print(status.rawValue)
}
}
Note the naming: earlier seeds of this cycle shipped the same call as usingExpandedInterface: and then as requestTrackingAuthorizationPreferExpandedInterface:. Both renames are listed as resolved issues, so if you adopted either old spelling, it will not compile against the 27.2 SDK. Search your project for usingExpandedInterface and for the Objective-C requestTrackingAuthorizationPreferExpandedInterface selector and update them.
UIView default layout margins are now zero
On iOS 27.1 and later, the default layout margins for a UIView are zero. A view controller still hands its own view a set of systemMinimumLayoutMargins that vary by presentation context (full screen, sheet, split view), but plain subviews no longer inherit them automatically.
Why it matters: this is a quiet visual regression for anyone who built padding-dependent layouts on the old defaults. Content that used to sit inset from the edges can now run flush to the safe area or the view bounds.
The documented fix is to opt back in on the subview:
final class CardView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
preservesSuperviewLayoutMargins = true
}
required init?(coder: NSCoder) {
super.init(coder: coder)
preservesSuperviewLayoutMargins = true
}
}
With preservesSuperviewLayoutMargins = true, the subview inherits the view controller’s margins instead of using its own zero defaults. Set it on the containers you care about rather than globally, and check both full-screen and sheet presentations — systemMinimumLayoutMargins is not the same in each.
SDK and tooling
The iOS & iPadOS 27.2 SDK supports building apps for iPhone and iPad on 27.2 and ships bundled with Xcode 27.2. Compatibility requirements for the IDE are in the Xcode 27.2 release notes, not here.
Known issues and workarounds
Health: personalized summaries and the missing redesigned app
Personalized summaries might not generate as expected in the Insights tab.
The redesigned Health app is not included in this build — the notes state it was available in the previous beta for testing only. If you update, Health data created in that earlier beta stays on the device and remains viewable in Settings; the redesigned app returns in a later iOS beta. Practical workaround: don’t plan Health UI work or screenshots against this build, and if you rely on Insights summaries for a demo, capture them before updating.
Nearby Interaction: NISession invalidated by resource timeout
An NISession running a DL-TDoA configuration in a foreground app can be invalidated unexpectedly with a resource timeout, surfaced as NIErrorCodeResourceUsageTimeout.
The workaround from the notes is to start a fresh session with the same DL-TDoA configuration — don’t try to revive the invalidated one:
import NearbyInteraction
let session = NISession()
session.delegate = self
session.run(configuration) // same DL-TDoA configuration as before
Shortcuts: Describe a Shortcut fails
Describe a Shortcut might fail with Something went wrong. Try again later. The notes list no workaround. Retry later; if you are testing a shortcut flow, keep a manual path so the rest of your QA is not blocked.
Simulator: cloning a 27.2 device fails on file permissions
Cloning a simulator device running the 27.2 runtime might fail because of incorrect file permissions (FB24939277). The notes give a command that deletes the stale sandbox files from the source device before you clone again:
find ~/Library/Developer/CoreSimulator/Devices/<SOURCE_UDID>/data -name '*.sb-????????-??????' -delete
Replace <SOURCE_UDID> with the UDID of the device you are cloning from — Xcode’s Devices and Simulators window and xcrun simctl list devices both show it. Quit Simulator first, run the command, then retry the clone. Keep CI images in mind: a fresh runner won’t have the leftovers, but a cached one will.
StoreKit Testing: subscription bundles unbundle incorrectly
When you make an in-app purchase for a subscription that is a member of a subscription bundle, the user is incorrectly allowed to unbundle it instead of the purchase throwing an error. No workaround is given. If bundle behaviour is part of your paywall logic, verify it on a real sandbox account and don’t sign off on bundle error handling based on Xcode testing alone in this cycle.
Quest Lab Appointments
If you have an upcoming lab appointment, the notes advise waiting to update iOS until you have your results, and contacting Quest directly to reschedule if something goes wrong. Results are also available under Browse > Lab Results. This one is aimed at testers rather than at shipping apps.
Resolved issues worth knowing
- The expanded ATT API is now spelled
requestTrackingAuthorization(preferExpandedInterface:additionalInformationAction:completionHandler:); the earlierusingExpandedInterface:name is gone (187149729). - The Objective-C selector
requestTrackingAuthorizationPreferExpandedInterface:...is nowrequestTrackingAuthorizationPreferringExpandedInterface:...(187610745). SKTestSession.clearTransactions()now resets intro offer eligibility immediately instead of leaving a stale eligibility state (FB24137836).- Changing storefront or locale through
SKTestSessionnow propagates throughStorefront.updates. - Failed test purchases no longer show error dialogs when
dialogsDisabledis set totrue.
That last StoreKit cluster is worth a re-run of your paywall UI tests. A configuration like this is now dependable for intro-offer and storefront-localisation checks:
import StoreKitTest
let session = try SKTestSession(configurationFileNamed: "StoreKitTestConfiguration")
session.dialogsDisabled = true
try session.clearTransactions()
// intro offer eligibility is now reset for the next purchase
Should you update?
Update now if you ship an app that runs ad or analytics SDKs to users in France, Germany, Italy, Poland or Romania — the expanded ATT prompt is a requirement, and you want the SDK rename behind you before submission. Also update if your layouts are margin-dependent: you need to see the zero-margin behaviour on a 27.2 device now, not after release.
Wait if you rely on the redesigned Health app for testing, on Insights summaries, or on subscription-bundle error paths in StoreKit Testing. All three are broken or absent in this build.
Checklist before you switch your whole team over:
- Search for
usingExpandedInterfaceandrequestTrackingAuthorizationPreferExpandedInterfaceand migrate to the current names. - Audit views that depended on inherited default margins; add
preservesSuperviewLayoutMargins = truewhere needed and re-check sheets and split view. - Re-run paywall and intro-offer UI tests against
SKTestSession. - If simulator cloning fails, clear the stale sandbox files and re-clone before blaming the runtime.
- Keep a fallback path for any flow that starts a DL-TDoA
NISession.
FAQ
Is the expanded App Tracking Transparency prompt required everywhere?
No. The notes say the alternative expanded prompt is required for users in France, Germany, Italy, Poland and Romania. Outside those markets you can keep the standard prompt, but you should still handle yearly re-prompting for EU users and make sure your code compiles against the renamed API.
Why did my views suddenly lose their side padding after updating?
Because on iOS 27.1 and later the default layout margins for a UIView are zero. The view controller’s own view still has systemMinimumLayoutMargins, but subviews no longer inherit them. Set preservesSuperviewLayoutMargins = true on the subviews that need the inherited insets.
What do I do about the NIErrorCodeResourceUsageTimeout in Nearby Interaction?
The release notes’ workaround is to create a new NISession with the same DL-TDoA configuration after the timeout, rather than attempting to reuse the invalidated session. Treat the timeout as a signal to restart the ranging session.
