iOS is the operating system for iPhone.

All subtopics
Posts under iOS topic

Post

Replies

Boosts

Views

Activity

UITableView behavior on iPhone Duo
I’m adapting a UIKit app for iPhone Duo and noticed that UITableViewController separators extend underneath the navigation and tab bar controls when those controls move to the side. The cell content appears to respect the safe area, but the separators continue to the screen edge. When using a UITableView inside a regular UIViewController, constraining its horizontal edges to the parent’s safeAreaLayoutGuide prevents this. With UITableViewController, however, the table view is the controller’s root view. The attached screenshots show the difference: Screenshot 1: Separators extend underneath the side controls. Screenshot 2: Separators stop at the safe area boundary. Should UITableViewController respect these safe area boundaries out of the box, including for separators, when system controls move to the side? Or is drawing separators underneath those controls the intended behavior? If automatic adaptation is expected, could this be a UIKit issue?
1
0
437
Oct ’26
iOS 27: SwiftUI keyboard safe area is not restored after returning to a UIHostingController
I have a SwiftUI view embedded in a UIHostingController. It contains a numeric text field at the top and a .borderedProminent button at the bottom. The text field is automatically focused when the view appears. The bottom button pushes another instance of the same hosting controller. On the initial appearance, SwiftUI correctly positions the button above the keyboard. However, after navigating back from VC2 to VC1, the text field is focused and the keyboard is visible, but the button remains behind the keyboard. This occurs regardless of whether VC2 is closed using the navigation bar back button or the interactive back gesture. This appears to be an iOS 27 regression involving SwiftUI keyboard avoidance inside a UIHostingController. The issue is especially problematic with a numeric keyboard because it has no Return or Done key. If the covered button is the primary way to continue or dismiss the keyboard, the user can no longer access it. Interestingly, the button is repositioned correctly as soon as I begin moving the app into the background. This suggests that SwiftUI still knows about the keyboard safe area but does not update the layout correctly when the hosting controller reappears after being popped to. Minimal reproducible example import SwiftUI import UIKit final class NumericInputHostingController: UIHostingController<NumericInputView> { init() { super.init( rootView: NumericInputView(onContinue: {}) ) rootView = NumericInputView { [weak self] in self?.navigationController?.pushViewController( NumericInputHostingController(), animated: true ) } } @available(*, unavailable) @MainActor required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } struct NumericInputView: View { @State private var value = "" @FocusState private var isTextFieldFocused: Bool let onContinue: () -> Void var body: some View { VStack(spacing: 24) { TextField("Enter a number", text: $value) .keyboardType(.numberPad) .focused($isTextFieldFocused) .padding(.horizontal, 16) .frame(height: 52) .background { RoundedRectangle(cornerRadius: 10) .stroke( Color.accentColor, lineWidth: 1.5 ) } Spacer() Button("Open Another", action: onContinue) .buttonStyle(.borderedProminent) .controlSize(.large) .frame(maxWidth: .infinity) } .padding(20) .background(Color(.systemBackground)) .onAppear { DispatchQueue.main.async { isTextFieldFocused = true } } .onDisappear { isTextFieldFocused = false } } } The initial controller is embedded in a navigation controller: let controller = NumericInputHostingController() let navigationController = UINavigationController( rootViewController: controller ) Steps to reproduce Present VC1. VC1 automatically focuses the numeric text field. Confirm that the bottom button is above the keyboard. Tap the button to push VC2. Navigate back to VC1. VC1 focuses its text field and displays the numeric keyboard. Observe that the bottom button is now behind the keyboard. Begin putting the app into the background. Observe that the button suddenly moves to the correct position above the keyboard. UIKit’s keyboardLayoutGuide handles the equivalent UIKit layout correctly. Is this a known issue with keyboard safe-area updates when a UIHostingController reappears after navigation? Is there a supported SwiftUI solution that does not require observing keyboard notifications manually?
3
2
549
Oct ’26
UX pain point - iOS - Stopping foreground apps from cutting audio - Neurodivergent users
TL;DR Requesting a system-level iOS feature or API to prioritize background audio over foreground app interruptions for enhanced neurodivergent accessibility. Granular Audio Session Priority and Control Center Override For users who rely on parallel cognitive processing - such as neurodivergent individuals managing attention through sensory layering like jumping across apps - abrupt audio interruptions are deeply disruptive. One scenario - a user is deep in cognitive flow listening to audio via Apple Music. They then switch to Instagram to check a text or post as natural neurodivergent attention switching and a video automatically fires up audio and instantly cuts the track playing on Apple Music. Regaining the audio stream requires manual intervention and therefore a breaking of focus. Proposal - I would love and suggest a native iOS feature or Control Center overlay allowing users to define audio hierarchy across apps, e.g. by locking background media as primary; open for ideas of course. This may as well be useful in therapeutical setups to easily silence potential notifications of lower priority over audio media designed to sensorically set guidelines for a session. Scope - while potentially helpful to users in the audio engineering and music playing scene running third-party-apps like Ableton and such, the feature request is intended to assist a basic and non-teh-savvy iOS user. Technical Question - is there any undocumented or upcoming capability within ⁠AVAudioSession⁠ categories/modes that could allow a developer to gracefully intercept or suppress automatic audio ducking/interruption from third-party foreground apps? PS First post. Nothing similar found on the forum. Nice request. Would love feedback or a technical review on feasibility.
0
0
382
Oct ’26
Can we opt out of the Horizontal Bar on the iPhone Duo?
We are aware that we can opt out of the vertical bar to make it horizontal for folded and unfolded landscape: https://developer.apple.com/documentation/uikit/uiviewcontroller/preferredverticalbarbehavior As per the title, we would like to know if if the reverse is possible (i.e. can we have the unfolded portrait display a vertical bar instead of a horizontal one)
1
0
448
Oct ’26
Spatial Scene API for iOS Apps
As part of the WWDC25 Keynote, a technology was announced that can present 2D images as 3D spatial scenes. This announcement is supported by a Press Release. ...developers can use the Spatial Scene API to make their app experience even more immersive. Zillow is taking advantage of the API for their Zillow Immersive app, allowing users to see images of homes and apartments with the rich depth and dimension that spatial scenes offer. The feature also appears in the Photos App on iOS 26 Developer Beta 1. Tapping "Spatial Scene" on any photo opens a view of that photo with a parallax effect. I've searched the WWDC sessions and new documentation and have come up short. Reaching out here for help. Is there any documentation for Spatial Scene API? Or any guidance on how to implement the spatial scene in iOS?
2
2
920
Oct ’26
Core Data Transformable attribute with IN %@ predicate returns empty results when array contains more than 100 items on iOS 27
I’m seeing what appears to be a Core Data regression on iOS 27 when using an IN %@ predicate with a Transformable attribute containing String values. Before iOS 27, the following predicate worked correctly regardless of the number of values in the array: [NSPredicate predicateWithFormat:@"field IN %@", valuesArray] On iOS 27, I get different results depending on the number of items in valuesArray: valuesArray.count <= 100 → works correctly and returns the expected objects. valuesArray.count > 100 → returns an empty result, even though matching objects exist in the Core Data database. Reproduction Create a Core Data entity with a Transformable attribute containing String values. Store objects with values in this attribute. Create an array containing matching values. Execute a fetch using: [NSPredicate predicateWithFormat:@"field IN %@", valuesArray] Test with 100 values and then with more than 100 values. The issue is consistently reproducible on iOS 27. Interestingly, I also tested manually transforming the values in the array to the same representation used by the Transformable attribute. When doing this, the predicate works correctly even with more than 100 values. This makes me suspect that iOS 27/Core Data may not correctly transform the values supplied to the IN predicate when the array contains more than 100 items. Has anyone else observed this behavior on iOS 27? Is there a known limitation or change in Core Data predicate handling for Transformable attributes in iOS 27? The same Core Data model and predicate worked correctly on previous iOS versions.
0
0
163
Oct ’26
iPhone sync on MacOS Golden Gate 27.0.1 (26A434) caused data exposure out of sandbox
Hi guys, I connected iPhone using USB cable to Mac running Golden Gate 27.0.1 (26A434) and in Finder I selected iPhone to open sync page I was looking at Files tab and trying to get data from one of the apps. As I was doing that at certain point after disconnecting and connecting USB cable I wanted to avoid sync, so when dialog "Trust this computer" showed up on iPhone, I tapped "Cancel". Then when disconnecting cable and connecting again, it started sync and under Files under the app in treeview original data disappeared (a database file and 2 folders with images) and iTunes_Control and Recordings folders showed up instead. I copied these folders to my Mac and there were files containing data. It looks like instead of Documents folder belonging to the app the sync mapped completely different storage location, which should have been protected by sandbox (I'm assuming). I clicked "Eject" icon in Finder, disconnected cable, connected again and it started sync, but ultimately failed with an error that some file does not exist. That dialog presented title with a completely different name than is the name of my iPhone, it presented something like Robert's iPhone, which is a name usually chosen by default when setting up new iPhone. I tried sync 3 times, but nothing helped to fix the problem. Has anyone seen this issue? I completely shutdown iPhone and started again. Sync completed successfully and under that app its original data showed up again (database file and 2 folder with images), iTunes_Control and Recordings folders didn't show up. Is it possible that sync mounted wrong location and exposed data that should have been protected by sandbox and never exposed this way and under wrong app?
1
0
272
Oct ’26
TimelineView's custom schedule termination
Hello, How should I terminate my custom implementation of TimelineSchedule? Should I return nil or .distantFuture? Is there actual difference? Please find my sample implementation below: struct FixedNumberSchedule: TimelineSchedule { let count: Int func entries( from startDate: Date, mode: Mode ) -> Entries { Entries(startDate: startDate, count: count) } struct Entries: Sequence, IteratorProtocol { var currentDate: Date? let initialCount: Int var count: Int init(startDate: Date,count: Int) { self.currentDate = startDate self.initialCount = count self.count = count } mutating func next() -> Date? { defer { if count > 1 { currentDate?.addTimeInterval(1) count -= 1 } else { self.currentDate = nil } } print("Seq \(initialCount), \(currentDate, default: "none")") return currentDate } } } Here's the catch: For FixedNumberSchedule(count: 1) I get logs in console: Seq 1, 2026-10-03 10:04:33 +0000 Seq 1, none For FixedNumberSchedule(count: 2) I get infinite logs in console: Seq 2, 2026-10-03 10:04:33 +0000 Seq 2, 2026-10-03 10:04:34 +0000 Seq 2, none Seq 2, none ... Side note: the displayed result is the same for both sequences (the last valid element from second sequence is never displayed). So, If the sequence has more than a single entry to return, it actually never ends. Is this a bug? Of course, if the sequence has ended, I could keep the code as simple as possible. But the loop still troubles me, thus my initial question: Should I actually return nil or .distantFuture? BR, Krystian
0
0
381
Oct ’26
Xcode 27: CLLocationManager kCLErrorDomain Code=5
Dear Apple Developer Community, Our app monitors a user-defined region by using startMonitoring on an instance of CLLocationManager. While it works as intended on a real device, starting with Xcode 27, this method invocation always results in >locationManager ... monitoringDidFailFor< being called. The error code is always kCLErrorDomain Code=5 but this only occurs within iOS 27 simulators. It works perfectly in iOS 26 simulators. Additionally, CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) always returns false on these iOS 27 simulators. This issue blocks parts of our automated system tests. Is it a bug or on purpose? Thank you in advance.
1
1
531
Oct ’26
Apple Watch remote keyboard (iPhone): pasted text arrives empty on the watch, typed text works (watchOS 27.2)
When a text field on Apple Watch is filled through the iPhone's remote keyboard, text that I PASTE into the iPhone field is displayed correctly on the iPhone but arrives EMPTY on the watch. Typing the same text character by character works fine. This happens in both secure (password) fields and regular text fields, so it doesn't look like a password-field restriction. Steps to reproduce On the watch, open a text field (I tested a password field and a regular one). Open the keyboard on the iPhone when prompted. Copy a short test string (e.g. "test12345") from another app. Paste it into the iPhone field. The iPhone shows the text. Confirm on the watch. Expected: the watch receives the pasted text. Actual: the watch field receives empty input. What I tried Typing the string by hand: arrives correctly. Pasting in a secure field: arrives empty. Pasting in a regular field: arrives empty. Environment iPhone 15 Pro Max, iOS 27.0 [confirm current version] Apple Watch Ultra 2, watchOS 27.2 (24S5091f) MacBook Pro (M1), macOS 27.2 Has anyone else seen this? Any workaround other than typing the text manually would be appreciated.
0
0
499
Oct ’26
Tab bar item title doesn't reappear after rotation on iPhone Duo
On iPhone Duo, if a tab bar item's title is set to an empty string while the device is in landscape, setting a non-empty title again after rotating back to portrait doesn't display it. The title stays missing. Filled in FB25015689 Repro: import UIKit @main final class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions ) -> UISceneConfiguration { let config = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role) config.delegateClass = SceneDelegate.self return config } } final class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene( _ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions ) { guard let windowScene = scene as? UIWindowScene else { return } let tab = TitleViewController() tab.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0) let tabBarController = UITabBarController() tabBarController.viewControllers = [tab] let window = UIWindow(windowScene: windowScene) window.rootViewController = tabBarController self.window = window window.makeKeyAndVisible() } } final class TitleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground let hide = UIButton(configuration: .bordered(), primaryAction: UIAction(title: "hidden") { [weak self] _ in self?.setTabTitle("") }) let show = UIButton(configuration: .bordered(), primaryAction: UIAction(title: "visible") { [weak self] _ in self?.setTabTitle("Favorites") }) let stack = UIStackView(arrangedSubviews: [hide, show]) stack.axis = .vertical stack.spacing = 16 stack.translatesAutoresizingMaskIntoConstraints = false view.addSubview(stack) NSLayoutConstraint.activate([ stack.centerXAnchor.constraint(equalTo: view.centerXAnchor), stack.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } private func setTabTitle(_ newTitle: String) { title = newTitle tabBarItem.title = newTitle } }
0
2
260
Oct ’26
UITabBarItemStateAppearance selected badgeBackgroundColor is ignored on iOS 27
On iOS 27, selected.badgeBackgroundColor is ignored and the selected tab's badge uses the normal colour instead. This happens on both iPhone Duo (iOS 27.1) and iPhone 18 Pro (iOS 27.0), while iOS 26.2 and 18.6 work correctly. Filled as FB25014925 Repro: import UIKit @main final class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions ) -> UISceneConfiguration { let config = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role) config.delegateClass = SceneDelegate.self return config } } final class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene( _ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions ) { guard let windowScene = scene as? UIWindowScene else { return } let purple = UIColor(red: 0xb0 / 255.0, green: 0x7e / 255.0, blue: 0xff / 255.0, alpha: 1) let blue = UIColor(red: 0x00 / 255.0, green: 0xa9 / 255.0, blue: 0xf0 / 255.0, alpha: 1) // Tab1: badge "1", no appearance. let tab1 = makeTab(title: "Tab1", badge: "1", text: "Tab1\nNo appearance set") // Tab3: badge "NEW!", normal PURPLE, selected BLUE. let tab3 = makeTab( title: "Tab3", badge: "NEW!", text: "Tab3\nnormal badgeBackgroundColor: PURPLE\nselected badgeBackgroundColor: BLUE") let appearance = UITabBarAppearance() appearance.stackedLayoutAppearance.normal.badgeBackgroundColor = purple appearance.stackedLayoutAppearance.selected.badgeBackgroundColor = blue tab3.tabBarItem.standardAppearance = appearance let tabBarController = UITabBarController() tabBarController.viewControllers = [tab1, tab3] tabBarController.selectedIndex = ProcessInfo.processInfo.arguments.contains("-selectFirst") ? 0 : 1 let window = UIWindow(windowScene: windowScene) window.rootViewController = tabBarController self.window = window window.makeKeyAndVisible() } private func makeTab(title: String, badge: String, text: String) -> UIViewController { let vc = UIViewController() vc.view.backgroundColor = .systemBackground vc.tabBarItem = UITabBarItem(title: title, image: UIImage(systemName: "star"), selectedImage: nil) vc.tabBarItem.badgeValue = badge let label = UILabel() label.text = text label.numberOfLines = 0 label.textAlignment = .center label.translatesAutoresizingMaskIntoConstraints = false vc.view.addSubview(label) NSLayoutConstraint.activate([ label.centerXAnchor.constraint(equalTo: vc.view.centerXAnchor), label.centerYAnchor.constraint(equalTo: vc.view.centerYAnchor), label.widthAnchor.constraint(lessThanOrEqualTo: vc.view.widthAnchor, constant: -32), ]) return vc } }
0
2
192
Oct ’26
Universal Links: Source countries or IP ranges used to retrieve AASA file
I’m looking for clarification on how Apple retrieves the apple-app-site-association (AASA) file for Universal Links / Associated Domains. Assume a domain exposes the AASA file at: https://example.com/.well-known/apple-app-site-association The domain is protected by Geo-Blocking, where access from certain countries/regions is restricted. I would like to understand the expected network behavior for AASA retrieval: Can requests to retrieve the AASA file originate from Apple infrastructure in different countries or regions globally? Does Apple publish a list of source countries, IP addresses, IP ranges, or network ranges specifically used for AASA retrieval? Can the source country or IP address change over time due to Apple's infrastructure, CDN, or routing? Is there any supported way to force AASA retrieval through a particular region, such as the US? If certain countries are blocked, is there any way to determine whether Apple may use infrastructure from those countries for AASA retrieval? Is the recommended approach to allow the following endpoint to be publicly reachable regardless of source geography? The objective is to restrict access as much as possible while ensuring that Universal Links continue to work reliably. If there is any official Apple documentation covering the source network, IP ranges, geographic locations, or accessibility requirements for AASA retrieval, a reference would be greatly appreciated.
1
0
318
Oct ’26
Xcode is not supported by this device
Hi, When I run a build and select my iPhone, I get this error: "The capability “Fetch Extended Device Info” is not supported by this device." Although it works correctly when I run the build on the Simulator on my Mac. I recently updated my iPhone to iOS 27.2. Could this be the problem? Is there any way to fix it, or should I wait for an Xcode update? I tried running it in version Xcode 26.5 and 27Beta Thanks!
0
0
281
Sep ’26
iOS 27: UIBarButtonItem custom view is clipped to its Liquid Glass capsule only while pressed, not at rest (regression from iOS 26)
I have a UIBarButtonItem created with init(customView:). The custom view draws some content outside its own bounds (clipsToBounds = false). On iOS 26, that content is clipped to the item's Liquid Glass capsule all the time, both at rest and while the item is pressed. On iOS 27, the clipping is inconsistent. At rest, the content outside the custom view's bounds is fully visible. While I press the item, it gets clipped to the shape of the Liquid Glass bubble. When I let go, it's fully visible again. So the item's content changes shape during a touch. iOS 26.2, at rest: clipped to the capsule iOS 26.2, while pressed: clipped to the capsule iOS 27, at rest: not clipped, the overflowing content is visible iOS 27, while pressed: clipped to the bubble Reproduced on the iPhone Duo simulator (iOS 27.1) and an iPhone 18 Pro (iOS 27). On an iPhone 17 Pro simulator with iOS 26.2 the behavior is consistent. Filed as FB25001846. Steps: Put the view controller below in a UINavigationController and run it on iOS 27. Look at the right bar button item at rest: the yellow area is visible around the green button. Press and hold the button: the yellow area is clipped to the rounded bubble. Run the same code on iOS 26: the yellow area is never visible. final class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() title = "Clipping" view.backgroundColor = .systemBackground // A button used as the bar button item's custom view. let button = UIButton(type: .custom) button.backgroundColor = .systemGreen button.setTitle("Press me", for: .normal) button.setTitleColor(.white, for: .normal) button.addAction(UIAction { _ in print("Pressed") }, for: .touchUpInside) button.sizeToFit() let size = button.bounds.size // The custom view is exactly as big as the button, but draws a yellow background // that extends 12pt outside its bounds on every side. let customView = UIView() customView.clipsToBounds = false customView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ customView.widthAnchor.constraint(equalToConstant: size.width), customView.heightAnchor.constraint(equalToConstant: size.height), ]) let overflow = UIView(frame: CGRect(origin: .zero, size: size).insetBy(dx: -12, dy: -12)) overflow.backgroundColor = .systemYellow customView.addSubview(overflow) customView.addSubview(button) navigationItem.rightBarButtonItem = UIBarButtonItem(customView: customView) } }
0
2
272
Sep ’26
In iOS26, UITableview can't display cell,but cells can be selected!
We have received several cases that our app can not display uitableview cell in iOS26, but users said that they can select cells with single tab and the uitableview didselectcell delegate can response! I have reported a feedback but no response. Does anyone have the same bugs with me? You guys can see that the page is blank, I have a video a user sent to me can proved that he can select cell with gesture. We cannot reproduce the bug and don't konw how to fixed, we think this is the bug with iOS26, so here for some help. This bug block our distribution of new version(support iOS26) This is the feedback https://feedbackassistant.apple.com/feedback/20677046
2
0
613
Sep ’26
iOS leaves an accessory's no-internet Wi-Fi (NEHotspotConfiguration) for a saved network mid-session
We're building an iOS and Android app that transfers files to and from a device over a Wi-Fi network the device creates. That network has no internet access. The app gets the Wi-Fi credentials from the device (over Bluetooth, or from a QR code on its screen) and joins with NEHotspotConfiguration. Android works reliably. On iOS, partway through a session the phone leaves the device's network and joins a saved network that has internet, which breaks our connection to the device. Setup: iPhone 13 Pro, iOS 26.x NEHotspotConfiguration(ssid:passphrase:isWEP: false) with joinOnce = false. With joinOnce = true, iOS usually stays on the current internet Wi-Fi and never joins the device's network. WPA2. The device is at 192.168.4.1, and its DHCP server hands out the device as router and DNS. Device traffic: NWConnection (TCP) with prohibitedInterfaceTypes = [.cellular]. Server traffic: a separate NWConnection with requiredInterfaceType = .cellular. Wi-Fi Assist is off. Example: we read an 8 MB file from the device (30 s, no problem), then post it to our server over cellular (93 s). During the post, the device connection carries only a small message every ~15 s. 28 s into the post, NWPathMonitor shows Wi-Fi drop out for 3 s, and when it returns the phone is on the our primary network. Occasionally iOS shows a prompt asking whether to stay connected without internet, but usually it switches without asking. We haven't seen it switch during the file read, while the device connection is busy. Questions: Is there a supported way to keep iOS on a device's no-internet network for a whole session? Does traffic on the Wi-Fi interface (such as an active NWConnection) affect whether iOS switches away? Would a DHCP configuration without a router or DNS server change how iOS treats the network? Is joinOnce = false right for this, or can joinOnce = true join when the phone is already on an internet-capable Wi-Fi?
1
0
552
Sep ’26
UITableView behavior on iPhone Duo
I’m adapting a UIKit app for iPhone Duo and noticed that UITableViewController separators extend underneath the navigation and tab bar controls when those controls move to the side. The cell content appears to respect the safe area, but the separators continue to the screen edge. When using a UITableView inside a regular UIViewController, constraining its horizontal edges to the parent’s safeAreaLayoutGuide prevents this. With UITableViewController, however, the table view is the controller’s root view. The attached screenshots show the difference: Screenshot 1: Separators extend underneath the side controls. Screenshot 2: Separators stop at the safe area boundary. Should UITableViewController respect these safe area boundaries out of the box, including for separators, when system controls move to the side? Or is drawing separators underneath those controls the intended behavior? If automatic adaptation is expected, could this be a UIKit issue?
Replies
1
Boosts
0
Views
437
Activity
Oct ’26
iOS 27: SwiftUI keyboard safe area is not restored after returning to a UIHostingController
I have a SwiftUI view embedded in a UIHostingController. It contains a numeric text field at the top and a .borderedProminent button at the bottom. The text field is automatically focused when the view appears. The bottom button pushes another instance of the same hosting controller. On the initial appearance, SwiftUI correctly positions the button above the keyboard. However, after navigating back from VC2 to VC1, the text field is focused and the keyboard is visible, but the button remains behind the keyboard. This occurs regardless of whether VC2 is closed using the navigation bar back button or the interactive back gesture. This appears to be an iOS 27 regression involving SwiftUI keyboard avoidance inside a UIHostingController. The issue is especially problematic with a numeric keyboard because it has no Return or Done key. If the covered button is the primary way to continue or dismiss the keyboard, the user can no longer access it. Interestingly, the button is repositioned correctly as soon as I begin moving the app into the background. This suggests that SwiftUI still knows about the keyboard safe area but does not update the layout correctly when the hosting controller reappears after being popped to. Minimal reproducible example import SwiftUI import UIKit final class NumericInputHostingController: UIHostingController<NumericInputView> { init() { super.init( rootView: NumericInputView(onContinue: {}) ) rootView = NumericInputView { [weak self] in self?.navigationController?.pushViewController( NumericInputHostingController(), animated: true ) } } @available(*, unavailable) @MainActor required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } struct NumericInputView: View { @State private var value = "" @FocusState private var isTextFieldFocused: Bool let onContinue: () -> Void var body: some View { VStack(spacing: 24) { TextField("Enter a number", text: $value) .keyboardType(.numberPad) .focused($isTextFieldFocused) .padding(.horizontal, 16) .frame(height: 52) .background { RoundedRectangle(cornerRadius: 10) .stroke( Color.accentColor, lineWidth: 1.5 ) } Spacer() Button("Open Another", action: onContinue) .buttonStyle(.borderedProminent) .controlSize(.large) .frame(maxWidth: .infinity) } .padding(20) .background(Color(.systemBackground)) .onAppear { DispatchQueue.main.async { isTextFieldFocused = true } } .onDisappear { isTextFieldFocused = false } } } The initial controller is embedded in a navigation controller: let controller = NumericInputHostingController() let navigationController = UINavigationController( rootViewController: controller ) Steps to reproduce Present VC1. VC1 automatically focuses the numeric text field. Confirm that the bottom button is above the keyboard. Tap the button to push VC2. Navigate back to VC1. VC1 focuses its text field and displays the numeric keyboard. Observe that the bottom button is now behind the keyboard. Begin putting the app into the background. Observe that the button suddenly moves to the correct position above the keyboard. UIKit’s keyboardLayoutGuide handles the equivalent UIKit layout correctly. Is this a known issue with keyboard safe-area updates when a UIHostingController reappears after navigation? Is there a supported SwiftUI solution that does not require observing keyboard notifications manually?
Replies
3
Boosts
2
Views
549
Activity
Oct ’26
UX pain point - iOS - Stopping foreground apps from cutting audio - Neurodivergent users
TL;DR Requesting a system-level iOS feature or API to prioritize background audio over foreground app interruptions for enhanced neurodivergent accessibility. Granular Audio Session Priority and Control Center Override For users who rely on parallel cognitive processing - such as neurodivergent individuals managing attention through sensory layering like jumping across apps - abrupt audio interruptions are deeply disruptive. One scenario - a user is deep in cognitive flow listening to audio via Apple Music. They then switch to Instagram to check a text or post as natural neurodivergent attention switching and a video automatically fires up audio and instantly cuts the track playing on Apple Music. Regaining the audio stream requires manual intervention and therefore a breaking of focus. Proposal - I would love and suggest a native iOS feature or Control Center overlay allowing users to define audio hierarchy across apps, e.g. by locking background media as primary; open for ideas of course. This may as well be useful in therapeutical setups to easily silence potential notifications of lower priority over audio media designed to sensorically set guidelines for a session. Scope - while potentially helpful to users in the audio engineering and music playing scene running third-party-apps like Ableton and such, the feature request is intended to assist a basic and non-teh-savvy iOS user. Technical Question - is there any undocumented or upcoming capability within ⁠AVAudioSession⁠ categories/modes that could allow a developer to gracefully intercept or suppress automatic audio ducking/interruption from third-party foreground apps? PS First post. Nothing similar found on the forum. Nice request. Would love feedback or a technical review on feasibility.
Replies
0
Boosts
0
Views
382
Activity
Oct ’26
Can we opt out of the Horizontal Bar on the iPhone Duo?
We are aware that we can opt out of the vertical bar to make it horizontal for folded and unfolded landscape: https://developer.apple.com/documentation/uikit/uiviewcontroller/preferredverticalbarbehavior As per the title, we would like to know if if the reverse is possible (i.e. can we have the unfolded portrait display a vertical bar instead of a horizontal one)
Replies
1
Boosts
0
Views
448
Activity
Oct ’26
Spatial Scene API for iOS Apps
As part of the WWDC25 Keynote, a technology was announced that can present 2D images as 3D spatial scenes. This announcement is supported by a Press Release. ...developers can use the Spatial Scene API to make their app experience even more immersive. Zillow is taking advantage of the API for their Zillow Immersive app, allowing users to see images of homes and apartments with the rich depth and dimension that spatial scenes offer. The feature also appears in the Photos App on iOS 26 Developer Beta 1. Tapping "Spatial Scene" on any photo opens a view of that photo with a parallax effect. I've searched the WWDC sessions and new documentation and have come up short. Reaching out here for help. Is there any documentation for Spatial Scene API? Or any guidance on how to implement the spatial scene in iOS?
Replies
2
Boosts
2
Views
920
Activity
Oct ’26
Core Data Transformable attribute with IN %@ predicate returns empty results when array contains more than 100 items on iOS 27
I’m seeing what appears to be a Core Data regression on iOS 27 when using an IN %@ predicate with a Transformable attribute containing String values. Before iOS 27, the following predicate worked correctly regardless of the number of values in the array: [NSPredicate predicateWithFormat:@"field IN %@", valuesArray] On iOS 27, I get different results depending on the number of items in valuesArray: valuesArray.count <= 100 → works correctly and returns the expected objects. valuesArray.count > 100 → returns an empty result, even though matching objects exist in the Core Data database. Reproduction Create a Core Data entity with a Transformable attribute containing String values. Store objects with values in this attribute. Create an array containing matching values. Execute a fetch using: [NSPredicate predicateWithFormat:@"field IN %@", valuesArray] Test with 100 values and then with more than 100 values. The issue is consistently reproducible on iOS 27. Interestingly, I also tested manually transforming the values in the array to the same representation used by the Transformable attribute. When doing this, the predicate works correctly even with more than 100 values. This makes me suspect that iOS 27/Core Data may not correctly transform the values supplied to the IN predicate when the array contains more than 100 items. Has anyone else observed this behavior on iOS 27? Is there a known limitation or change in Core Data predicate handling for Transformable attributes in iOS 27? The same Core Data model and predicate worked correctly on previous iOS versions.
Replies
0
Boosts
0
Views
163
Activity
Oct ’26
iPhone sync on MacOS Golden Gate 27.0.1 (26A434) caused data exposure out of sandbox
Hi guys, I connected iPhone using USB cable to Mac running Golden Gate 27.0.1 (26A434) and in Finder I selected iPhone to open sync page I was looking at Files tab and trying to get data from one of the apps. As I was doing that at certain point after disconnecting and connecting USB cable I wanted to avoid sync, so when dialog "Trust this computer" showed up on iPhone, I tapped "Cancel". Then when disconnecting cable and connecting again, it started sync and under Files under the app in treeview original data disappeared (a database file and 2 folders with images) and iTunes_Control and Recordings folders showed up instead. I copied these folders to my Mac and there were files containing data. It looks like instead of Documents folder belonging to the app the sync mapped completely different storage location, which should have been protected by sandbox (I'm assuming). I clicked "Eject" icon in Finder, disconnected cable, connected again and it started sync, but ultimately failed with an error that some file does not exist. That dialog presented title with a completely different name than is the name of my iPhone, it presented something like Robert's iPhone, which is a name usually chosen by default when setting up new iPhone. I tried sync 3 times, but nothing helped to fix the problem. Has anyone seen this issue? I completely shutdown iPhone and started again. Sync completed successfully and under that app its original data showed up again (database file and 2 folder with images), iTunes_Control and Recordings folders didn't show up. Is it possible that sync mounted wrong location and exposed data that should have been protected by sandbox and never exposed this way and under wrong app?
Replies
1
Boosts
0
Views
272
Activity
Oct ’26
TimelineView's custom schedule termination
Hello, How should I terminate my custom implementation of TimelineSchedule? Should I return nil or .distantFuture? Is there actual difference? Please find my sample implementation below: struct FixedNumberSchedule: TimelineSchedule { let count: Int func entries( from startDate: Date, mode: Mode ) -> Entries { Entries(startDate: startDate, count: count) } struct Entries: Sequence, IteratorProtocol { var currentDate: Date? let initialCount: Int var count: Int init(startDate: Date,count: Int) { self.currentDate = startDate self.initialCount = count self.count = count } mutating func next() -> Date? { defer { if count > 1 { currentDate?.addTimeInterval(1) count -= 1 } else { self.currentDate = nil } } print("Seq \(initialCount), \(currentDate, default: "none")") return currentDate } } } Here's the catch: For FixedNumberSchedule(count: 1) I get logs in console: Seq 1, 2026-10-03 10:04:33 +0000 Seq 1, none For FixedNumberSchedule(count: 2) I get infinite logs in console: Seq 2, 2026-10-03 10:04:33 +0000 Seq 2, 2026-10-03 10:04:34 +0000 Seq 2, none Seq 2, none ... Side note: the displayed result is the same for both sequences (the last valid element from second sequence is never displayed). So, If the sequence has more than a single entry to return, it actually never ends. Is this a bug? Of course, if the sequence has ended, I could keep the code as simple as possible. But the loop still troubles me, thus my initial question: Should I actually return nil or .distantFuture? BR, Krystian
Replies
0
Boosts
0
Views
381
Activity
Oct ’26
Xcode 27: CLLocationManager kCLErrorDomain Code=5
Dear Apple Developer Community, Our app monitors a user-defined region by using startMonitoring on an instance of CLLocationManager. While it works as intended on a real device, starting with Xcode 27, this method invocation always results in >locationManager ... monitoringDidFailFor< being called. The error code is always kCLErrorDomain Code=5 but this only occurs within iOS 27 simulators. It works perfectly in iOS 26 simulators. Additionally, CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) always returns false on these iOS 27 simulators. This issue blocks parts of our automated system tests. Is it a bug or on purpose? Thank you in advance.
Replies
1
Boosts
1
Views
531
Activity
Oct ’26
Migrate app from personal account to business account
I want to release an app under my company's name. From what I understand you need a DUNS number to verify your business. Because that takes about 30 days to be granted, I was thinking of releasing the app under my personal name and then moving it to the business account. Is that something I could do? Thanks
Replies
3
Boosts
0
Views
919
Activity
Oct ’26
Apple Watch remote keyboard (iPhone): pasted text arrives empty on the watch, typed text works (watchOS 27.2)
When a text field on Apple Watch is filled through the iPhone's remote keyboard, text that I PASTE into the iPhone field is displayed correctly on the iPhone but arrives EMPTY on the watch. Typing the same text character by character works fine. This happens in both secure (password) fields and regular text fields, so it doesn't look like a password-field restriction. Steps to reproduce On the watch, open a text field (I tested a password field and a regular one). Open the keyboard on the iPhone when prompted. Copy a short test string (e.g. "test12345") from another app. Paste it into the iPhone field. The iPhone shows the text. Confirm on the watch. Expected: the watch receives the pasted text. Actual: the watch field receives empty input. What I tried Typing the string by hand: arrives correctly. Pasting in a secure field: arrives empty. Pasting in a regular field: arrives empty. Environment iPhone 15 Pro Max, iOS 27.0 [confirm current version] Apple Watch Ultra 2, watchOS 27.2 (24S5091f) MacBook Pro (M1), macOS 27.2 Has anyone else seen this? Any workaround other than typing the text manually would be appreciated.
Replies
0
Boosts
0
Views
499
Activity
Oct ’26
Tab bar item title doesn't reappear after rotation on iPhone Duo
On iPhone Duo, if a tab bar item's title is set to an empty string while the device is in landscape, setting a non-empty title again after rotating back to portrait doesn't display it. The title stays missing. Filled in FB25015689 Repro: import UIKit @main final class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions ) -> UISceneConfiguration { let config = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role) config.delegateClass = SceneDelegate.self return config } } final class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene( _ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions ) { guard let windowScene = scene as? UIWindowScene else { return } let tab = TitleViewController() tab.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0) let tabBarController = UITabBarController() tabBarController.viewControllers = [tab] let window = UIWindow(windowScene: windowScene) window.rootViewController = tabBarController self.window = window window.makeKeyAndVisible() } } final class TitleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground let hide = UIButton(configuration: .bordered(), primaryAction: UIAction(title: "hidden") { [weak self] _ in self?.setTabTitle("") }) let show = UIButton(configuration: .bordered(), primaryAction: UIAction(title: "visible") { [weak self] _ in self?.setTabTitle("Favorites") }) let stack = UIStackView(arrangedSubviews: [hide, show]) stack.axis = .vertical stack.spacing = 16 stack.translatesAutoresizingMaskIntoConstraints = false view.addSubview(stack) NSLayoutConstraint.activate([ stack.centerXAnchor.constraint(equalTo: view.centerXAnchor), stack.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } private func setTabTitle(_ newTitle: String) { title = newTitle tabBarItem.title = newTitle } }
Replies
0
Boosts
2
Views
260
Activity
Oct ’26
UITabBarItemStateAppearance selected badgeBackgroundColor is ignored on iOS 27
On iOS 27, selected.badgeBackgroundColor is ignored and the selected tab's badge uses the normal colour instead. This happens on both iPhone Duo (iOS 27.1) and iPhone 18 Pro (iOS 27.0), while iOS 26.2 and 18.6 work correctly. Filled as FB25014925 Repro: import UIKit @main final class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions ) -> UISceneConfiguration { let config = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role) config.delegateClass = SceneDelegate.self return config } } final class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene( _ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions ) { guard let windowScene = scene as? UIWindowScene else { return } let purple = UIColor(red: 0xb0 / 255.0, green: 0x7e / 255.0, blue: 0xff / 255.0, alpha: 1) let blue = UIColor(red: 0x00 / 255.0, green: 0xa9 / 255.0, blue: 0xf0 / 255.0, alpha: 1) // Tab1: badge "1", no appearance. let tab1 = makeTab(title: "Tab1", badge: "1", text: "Tab1\nNo appearance set") // Tab3: badge "NEW!", normal PURPLE, selected BLUE. let tab3 = makeTab( title: "Tab3", badge: "NEW!", text: "Tab3\nnormal badgeBackgroundColor: PURPLE\nselected badgeBackgroundColor: BLUE") let appearance = UITabBarAppearance() appearance.stackedLayoutAppearance.normal.badgeBackgroundColor = purple appearance.stackedLayoutAppearance.selected.badgeBackgroundColor = blue tab3.tabBarItem.standardAppearance = appearance let tabBarController = UITabBarController() tabBarController.viewControllers = [tab1, tab3] tabBarController.selectedIndex = ProcessInfo.processInfo.arguments.contains("-selectFirst") ? 0 : 1 let window = UIWindow(windowScene: windowScene) window.rootViewController = tabBarController self.window = window window.makeKeyAndVisible() } private func makeTab(title: String, badge: String, text: String) -> UIViewController { let vc = UIViewController() vc.view.backgroundColor = .systemBackground vc.tabBarItem = UITabBarItem(title: title, image: UIImage(systemName: "star"), selectedImage: nil) vc.tabBarItem.badgeValue = badge let label = UILabel() label.text = text label.numberOfLines = 0 label.textAlignment = .center label.translatesAutoresizingMaskIntoConstraints = false vc.view.addSubview(label) NSLayoutConstraint.activate([ label.centerXAnchor.constraint(equalTo: vc.view.centerXAnchor), label.centerYAnchor.constraint(equalTo: vc.view.centerYAnchor), label.widthAnchor.constraint(lessThanOrEqualTo: vc.view.widthAnchor, constant: -32), ]) return vc } }
Replies
0
Boosts
2
Views
192
Activity
Oct ’26
Universal Links: Source countries or IP ranges used to retrieve AASA file
I’m looking for clarification on how Apple retrieves the apple-app-site-association (AASA) file for Universal Links / Associated Domains. Assume a domain exposes the AASA file at: https://example.com/.well-known/apple-app-site-association The domain is protected by Geo-Blocking, where access from certain countries/regions is restricted. I would like to understand the expected network behavior for AASA retrieval: Can requests to retrieve the AASA file originate from Apple infrastructure in different countries or regions globally? Does Apple publish a list of source countries, IP addresses, IP ranges, or network ranges specifically used for AASA retrieval? Can the source country or IP address change over time due to Apple's infrastructure, CDN, or routing? Is there any supported way to force AASA retrieval through a particular region, such as the US? If certain countries are blocked, is there any way to determine whether Apple may use infrastructure from those countries for AASA retrieval? Is the recommended approach to allow the following endpoint to be publicly reachable regardless of source geography? The objective is to restrict access as much as possible while ensuring that Universal Links continue to work reliably. If there is any official Apple documentation covering the source network, IP ranges, geographic locations, or accessibility requirements for AASA retrieval, a reference would be greatly appreciated.
Replies
1
Boosts
0
Views
318
Activity
Oct ’26
Xcode is not supported by this device
Hi, When I run a build and select my iPhone, I get this error: "The capability “Fetch Extended Device Info” is not supported by this device." Although it works correctly when I run the build on the Simulator on my Mac. I recently updated my iPhone to iOS 27.2. Could this be the problem? Is there any way to fix it, or should I wait for an Xcode update? I tried running it in version Xcode 26.5 and 27Beta Thanks!
Replies
0
Boosts
0
Views
281
Activity
Sep ’26
iOS 27: UIBarButtonItem custom view is clipped to its Liquid Glass capsule only while pressed, not at rest (regression from iOS 26)
I have a UIBarButtonItem created with init(customView:). The custom view draws some content outside its own bounds (clipsToBounds = false). On iOS 26, that content is clipped to the item's Liquid Glass capsule all the time, both at rest and while the item is pressed. On iOS 27, the clipping is inconsistent. At rest, the content outside the custom view's bounds is fully visible. While I press the item, it gets clipped to the shape of the Liquid Glass bubble. When I let go, it's fully visible again. So the item's content changes shape during a touch. iOS 26.2, at rest: clipped to the capsule iOS 26.2, while pressed: clipped to the capsule iOS 27, at rest: not clipped, the overflowing content is visible iOS 27, while pressed: clipped to the bubble Reproduced on the iPhone Duo simulator (iOS 27.1) and an iPhone 18 Pro (iOS 27). On an iPhone 17 Pro simulator with iOS 26.2 the behavior is consistent. Filed as FB25001846. Steps: Put the view controller below in a UINavigationController and run it on iOS 27. Look at the right bar button item at rest: the yellow area is visible around the green button. Press and hold the button: the yellow area is clipped to the rounded bubble. Run the same code on iOS 26: the yellow area is never visible. final class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() title = "Clipping" view.backgroundColor = .systemBackground // A button used as the bar button item's custom view. let button = UIButton(type: .custom) button.backgroundColor = .systemGreen button.setTitle("Press me", for: .normal) button.setTitleColor(.white, for: .normal) button.addAction(UIAction { _ in print("Pressed") }, for: .touchUpInside) button.sizeToFit() let size = button.bounds.size // The custom view is exactly as big as the button, but draws a yellow background // that extends 12pt outside its bounds on every side. let customView = UIView() customView.clipsToBounds = false customView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ customView.widthAnchor.constraint(equalToConstant: size.width), customView.heightAnchor.constraint(equalToConstant: size.height), ]) let overflow = UIView(frame: CGRect(origin: .zero, size: size).insetBy(dx: -12, dy: -12)) overflow.backgroundColor = .systemYellow customView.addSubview(overflow) customView.addSubview(button) navigationItem.rightBarButtonItem = UIBarButtonItem(customView: customView) } }
Replies
0
Boosts
2
Views
272
Activity
Sep ’26
In iOS26, UITableview can't display cell,but cells can be selected!
We have received several cases that our app can not display uitableview cell in iOS26, but users said that they can select cells with single tab and the uitableview didselectcell delegate can response! I have reported a feedback but no response. Does anyone have the same bugs with me? You guys can see that the page is blank, I have a video a user sent to me can proved that he can select cell with gesture. We cannot reproduce the bug and don't konw how to fixed, we think this is the bug with iOS26, so here for some help. This bug block our distribution of new version(support iOS26) This is the feedback https://feedbackassistant.apple.com/feedback/20677046
Replies
2
Boosts
0
Views
613
Activity
Sep ’26
iOS leaves an accessory's no-internet Wi-Fi (NEHotspotConfiguration) for a saved network mid-session
We're building an iOS and Android app that transfers files to and from a device over a Wi-Fi network the device creates. That network has no internet access. The app gets the Wi-Fi credentials from the device (over Bluetooth, or from a QR code on its screen) and joins with NEHotspotConfiguration. Android works reliably. On iOS, partway through a session the phone leaves the device's network and joins a saved network that has internet, which breaks our connection to the device. Setup: iPhone 13 Pro, iOS 26.x NEHotspotConfiguration(ssid:passphrase:isWEP: false) with joinOnce = false. With joinOnce = true, iOS usually stays on the current internet Wi-Fi and never joins the device's network. WPA2. The device is at 192.168.4.1, and its DHCP server hands out the device as router and DNS. Device traffic: NWConnection (TCP) with prohibitedInterfaceTypes = [.cellular]. Server traffic: a separate NWConnection with requiredInterfaceType = .cellular. Wi-Fi Assist is off. Example: we read an 8 MB file from the device (30 s, no problem), then post it to our server over cellular (93 s). During the post, the device connection carries only a small message every ~15 s. 28 s into the post, NWPathMonitor shows Wi-Fi drop out for 3 s, and when it returns the phone is on the our primary network. Occasionally iOS shows a prompt asking whether to stay connected without internet, but usually it switches without asking. We haven't seen it switch during the file read, while the device connection is busy. Questions: Is there a supported way to keep iOS on a device's no-internet network for a whole session? Does traffic on the Wi-Fi interface (such as an active NWConnection) affect whether iOS switches away? Would a DHCP configuration without a router or DNS server change how iOS treats the network? Is joinOnce = false right for this, or can joinOnce = true join when the phone is already on an internet-capable Wi-Fi?
Replies
1
Boosts
0
Views
552
Activity
Sep ’26