After the release of iOS 16.3.1 on February 13, Apple closed the verification channels for the previous iOS version, iOS 16.3, making it impossible to downgrade to these versions after upgrading to iOS 16.3.1. To encourage users to keep the operating system updated, Apple typically closes the verification channel for the previous version shortly after the release of the new version.
According to the reports, currently, iPhone users experience the latest version of the iOS update. Apple recently released iOS 16.4 along with iPadOS 16.4 and macOS. You can check what’s new in the iOS 16.4 update which is mentioned below.
Backup and Restore
Known Issues
- Watch migration might fail when restoring a backup to a new phone. (105416351)
Workaround: Unpair the watch from the source phone, then pair it to the destination phone.
Beta enrollment for iPhone and iPad
New Features
- Beginning with iOS & iPadOS 16.4 beta, members of the Apple Developer Program will see a new option to enable developer betas directly from Software Update in Settings. This new option will be automatically enabled on devices already enrolled in the program that update to the latest beta release. Your iPhone or iPad must be signed in with the same Apple ID you used to enroll in the Apple Developer Program in order to see this option in Settings. In future iOS and iPadOS releases, this new setting will be the way to enable developer betas and configuration profiles will no longer grant access. (101692915)
Core ML
Deprecations
- Core ML Model Deployment is being deprecated. Consider using Background Assets or
NSURLSession
instead. (102993813)
Core Telephony
Deprecations
CTCarrier
, a deprecated API, returns static values for apps that are built with the iOS 16.4 SDK or later. (76283818)
Home
New Features
- Both manual and automatic Software Update support is now available for Matter Accessories. (102727759)
Known Issues
- The iOS device that initiates the pairing needs to be on the same iCloud account with the home hub. Only the owner of a home, not an invited user, can pair Matter accessories. (76012945)
- You might receive an error when pairing a Matter accessory using the 11 digit setup code. (101554366)
Workaround: Pair the accessory using the QR code instead.
- When a manual software update is attempted on a Matter accessory with an available update, Home might not indicate that the update has been requested and continue to indicate an update is available. (104902918)
Workaround: Check the Software Update pane in Home Settings at a later time, as the update might be taking place in the background. The Updated Recently section will display the new software version once the Matter accessory has completed the software update.
- The software update screen for Matter accsories might display the incorrect version number while an update is in progress. (105031569)
iCloud Drive
Known Issues
- Filesystem APIs such as
NSFile
might trigger materialization of dataless files and/or directory structures in iCloud Drive, leading to hangs or performance problems for the calling application. (105009536)Manager Workaround: Avoid calling anything which performs I/O on the main thread. Adopt
UICollection
and load cells asynchronously. I/O should be wrapped underView Data Source Prefetching -[NSFile
to avoid blocking a thread on a synchronous call. Alternatively, opt out of this behavior by setting your IO policy toCoordinator coordinate Access With Intents: queue: by Accessor:] IOPOL
but expect that I/O might fail with_MATERIALIZE _DATALESS _FILES _OFF EDEADLK
, if any component of the path is dataless (SF
)._DATALESS - iCloud Drive might become unresponsive when opened from the Files app. (105438692)
Workaround: Restart your device.
Keyboards
New Features
- Updates to Keyboards include:
- Support for new Unicode 15.0 Emoji.
- Autocorrect for the Korean keyboard is enabled by default for testing and feedback.
- Ukrainian keyboard now supports predictive text.
- Gujarati, Punjabi, and Urdu keyboards add support for transliteration layouts.
- New keyboard layouts are available for Choctaw and Chickasaw. (105243233)
MapKit
Resolved Issues
- Fixed: Improved performance of
MKOverlay
objects. (102187262)
Pages, Numbers, and Keynote
Known Issues
- When Advanced Data Protection for iCloud is turned on, Pages, Numbers, and Keynote might unexpectedly require collaborative documents to be closed. (103463223)
Workaround: Close the affected document, spreadsheet, or presentation and reopen it after a few minutes.
Passkeys and Authentication Services
New Features
- Web browsers on iOS with the
com
entitlement now have passkey AutoFill within their.apple .developer .web-browser WKWeb
. This capability works without requiring any code changes or needing to rebuild. (97576198)View - A new AuthorizationController API allows you to perform passkey and other types of authorization requests from SwiftUI views. (97576703)
- A new WebAuthenticationSession API allows you to perform
OAuth
and other types of web-based authentication flows from SwiftUI views. (101259868)
Resolved Issues
- Fixed: AutoFill, including AutoFill for passkeys and passwords, now works with input elements contained in a Shadow DOM in web content. (103859657)
- Fixed: Calling
Public
orKey Credential .is User Verifying Platform Authenticator Available() Public
from a web page in aKey Credential .is Conditional Mediation Available() WKWeb
now correctly returns whether passkeys can be used, based on the Associated Domains of the calling app. (104094169)View
Known Issues
- Conditional mediation requests (passkey AutoFill) in web content don’t abort when their
Abort
is fired. (99535627)Signal
Pencil
New Features
- Apple Pencil hover now provides Tilt and Azimuth support. (105412781)
Safari Web Extensions
New Features
- Added support for
modify
action type forHeaders declarative
rules. (71867709)Net Request - Added support for
browser
to store up to 10MB of data in-memory. (79283961).storage .session - Added support for persistent content scripts via
browser
,.scripting .register Content Script browser
,.scripting .get Registered Content Scripts browser
, and.scripting .unregister Content Scripts scripting
. (91261369).update Content Scripts
Resolved Issues
- Fixed
browser
events firing for hosts where the extension didn’t have access. Extensions should request host permissions for sites to receive events. (100204850).web Navigation
SKAdNetwork
Resolved Issues
- Fixed an issue where
SKAd
for Web Ads didn’t accept ad impressions. (104839712)Network
StoreKit
New Features
- New StoreKit 2 APIs are available for promoted in-app purchases. Apps can receive promoted product purchase data from the App Store with
Purchase
and can manage promoted order and visibility withIntent .intents Product
. (85321849).Promotion Info
SwiftUI
New Features
- A family of new view modifiers lets you build even richer resizable sheet experience with SwiftUI. Use these new modifiers to make the view behind a sheet interactive, provide a translucent background, control scrolling and expansion behavior, and even adjust the corner radius of the sheet.
To let people interact with the content behind a sheet, use the
.presentation
modifier. The following example enables people to interact with the view behind the sheet when the sheet is at the smallest detent, but not at the other detents:Background Interaction(_:) struct ContentView: View { private var showSettings = false var body: some View { Button("View Settings") { showSettings = true } .sheet(isPresented: $showSettings) { SettingsView() .presentationDetents( [.height(120), .medium, .large]) .presentationBackgroundInteraction( .enabled(upThrough: .height(120))) } } }
Give your sheet a translucent background with the new
presentation
modifier. The following example uses the thick material as the sheet background:Background(_:) struct ContentView: View { private var showSettings = false var body: some View { Button("View Settings") { showSettings = true } .sheet(isPresented: $showSettings) { SettingsView() .presentationBackground(.thickMaterial) } } }
Add a custom view as the background of your sheet with the
presentation
modifier.Background(alignment: content:) By default, when a person swipes up on a scroll view in a resizable presentation, the presentation grows to the next detent. A scroll view embedded in the presentation only scrolls after the presentation reaches its largest size. Use the new
presentation
modifier to control which action takes precedence.Content Interaction(_:) For example, you can request that swipe gestures scroll content first, resizing the sheet only after hitting the end of the scroll view, by passing the
.scrolls
value to this modifier:struct ContentView: View { private var showSettings = false var body: some View { Button("View Settings") { showSettings = true } .sheet(isPresented: $showSettings) { SettingsView() .presentationDetents([.medium, .large]) .presentationContentInteraction(.scrolls) } } }
(101565636)
- Apply the new
.presentation
modifier to the content of a modal presentation to control how it adapts to compact size classes on iPad and iPhone.Compact Adaptation(_:) For example, the
popover
modifier presents a popover on iPad. By default, a popover adapts to the narrow horizontal size class on iPhone by showing as a sheet. In the example below, the.presentation
modifier asks SwiftUI to show this as a popover on iPhone as well.Compact Adaptation(.none) struct PopoverExample: View { private var isShowingPopover = false var body: some View { Button("Show Popover") { self.isShowingPopover = true } .popover(isPresented: $isShowingPopover) { Text("Popover Content") .padding() .presentationCompactAdaptation(.none) } } }
Use
.presentation
to adapt differently in horizontally and vertically compact size classes. (103257577)Compact Adaptation(horizontal: vertical:)
Resolved Issues
- Fixed:
Scroll
has improved support for right to left languages by default. If you have aView Scroll
that shouldn’t change its behavior in right to left languages, use theView .environment(\.layout
modifier to ensure theDirection, .left To Right) Scroll
always sees a left to right layout direction. (65108729)View - Fixed: Refreshable modifiers applied to lists will no longer also apply to lists or scroll views within the content of that list. Re-apply a refreshable modifier to the content of the list if this is desired behavior. (102052575)
Deprecations
- TimelineView initializers that pass an instance of
Timeline
into its content closure have been deprecated in this release, and replaced with equivalent versions that pass an instance ofView<_, _>.Context Timeline
instead.View Default Context In TimelineView code that does not generate a warning, no action is needed: code that does not explicitly annotate the context type will use the new API when recompiled, without any change in functionality.
In TimelineView code that does show this new deprecation warning, changing type annotations from
Timeline
toView<_, _>.Context Timeline
will resolve the warning.View Default Context This change improves the performance of compiling Swift and SwiftUI code. The new initializer uncouples the generic type of the TimelineView being instantiated from the generic type of the context passed into its content closure, avoiding the need for the compiler to reconcile those types during compilation. (100641618)
- Several table initializers that were previously deprecated and replaced in iOS 16.2 and macOS 13.1 have now been removed from the API. Using these initializers will now generate a build error, with a Fix-It to switch to the replacement initializer API. For code that doesn’t generate this error, no action is needed.
This change, along with other improvements in the Swift compiler, improve the performance of compiling Swift and SwiftUI code.
The new, replacement API adds a parameter,
of:
, that identifies the type of the Table’s row values separately from the initializer’s row and column content closure parameters. This improves compilation performance in two ways. First, by knowing the row value type up-front, the compiler doesn’t need to infer that type from the body implementations of each closure. Second, the compiler can immediately enforce that each closure uses the same row value type in its body implementation, instead of needing to verify that the inferred types are equal after evaluating each closure.The following examples show code for creating a Table before and after adoption of the new API:
// before (will now produce an error):Table { TableColumn("Name", value: \.name) TableColumn("Email", value: \.email)} rows: { ForEach(people) { person in TableRow(person) }} // after:Table(of: Person.self) { TableColumn("Name", value: \.name) TableColumn("Email", value: \.email)} rows: { ForEach(people) { person in TableRow(person) }}
(102910184)
SwiftUI Navigation
Resolved Issues
- Fixed: Navigation destinations nested within
Navigation
andStack Navigation
are detected more performantly and reliably, no longer logging update cycles. (97597634)Split View - Fixed: Navigation destinations that present a new view on top of a
Navigation
(rather than pushing a view onto a stack in that column) no longer cause an assertion failure on iOS or infinite loop on macOS when the destination view is itself aSplit View Column Navigation
.Stack For example, the below construction is functional
NavigationSplitView { SidebarView() .navigationDestination(isPresented: $present) { NavigationStack { ... } }} detail: { ... }
(103278180)
- Fixed: Navigation destinations with data dependencies captured from ancestor views update more reliably.
struct DataDependentNavigation: View { var changeColor: Bool = false var present: Bool = false var body: some View { NavigationSplitView { Color.blue .navigationDestination(isPresented: $present) { // This is a data dependency from an ancestor view changeColor ? Color.green : Color.yellow } } detail: { Color.teal }}
(103429535)
Wallet
Known Issues
- An error might occur when adding or presenting an ID card. (105302759)