Dear Apple Developer Support,
I’m developing a Chromium-based iOS browser and want to open the Safari settings page (Settings → Apps→ Safari) like Chrome’s “Import data from Safari” feature, where clicking “Go to settings” opens the Safari settings page.
To reproduce this behavior in Chrome:
1.In Chrome, search “Import password from Safari.”
2.Restart Chrome.
3.Go to Chrome → Settings → Safari import → Import to Chrome → Go to settings.
4.You will see it opens Settings → Apps → Safari.
Please see the attached file for steps to trigger this feature in Chrome.
My attempt with App-Prefs:root=SAFARI only opens the Settings main page ,Is there a public API to open the Safari settings page directly?
Look forward to your reply,many thanks
UIKit
RSS for tagConstruct and manage graphical, event-driven user interfaces for iOS or tvOS apps using UIKit.
Posts under UIKit tag
200 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
We are using three column split view as root of our app and wants to hide the supplementary column alone in some cases and behaves like two column split view.
With the existing apis we are unable to achieve this since it hides primary column as well and not giving expected results.
.hide(.supplementary)
setViewController(nil, for: .supplementary)
But seen this behavior in Native Notes app when using the View as List and Gallery option.
is there any way to achieve this with maintaining three column split view itself ?
I have a SwiftUI View containing a basic NavigationStack structure. I host this in a UIHostingController and display modally as a sheet in UIKit using UIViewController.present().
Problem: When I rotate my iOS device to landscape from portrait, the navigation bar's back button extends past the safe area into the left corner of the device. Then, rotating back to portrait the back button is pushed further towards the center - not matching the intended position. (see images below).
Is there an API call I am missing to handle this rotation case? Thanks!
Code Example
SwiftUI view - ContentView.swift
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationStack {
Form {
NavigationLink {
Form {
Text("Hello")
}
.navigationTitle("Filter")
.navigationBarTitleDisplayMode(.inline)
} label: {
Text("Filter")
}
}
.navigationTitle("Filter")
.navigationBarTitleDisplayMode(.inline)
}
}
}
Main UIKit ViewController - ViewController.swift
import UIKit
import SwiftUI
class ViewController: UIViewController {
let swiftUIView = ContentView()
var hostingController: UIHostingController<ContentView>?
override func viewDidLoad() {
super.viewDidLoad()
hostingController = UIHostingController(rootView: swiftUIView)
guard let hostingController else { return }
hostingController.modalPresentationStyle = .formSheet
// Immediately present modally
DispatchQueue.main.async {
self.present(hostingController, animated: true)
}
}
}
More Detail
The issue only seems to appear for sheet modal presentation including these UIModalPresentationStyle:
.formSheet
.pageSheet
.popover
The issue does not appear in an app with SwiftUI app lifecycle or when using UIKit and adding the hosting controller as a child view controller. This specifically happens when presenting modally and when the view gets rendered as a sheet.
I tried various combinations of UIHostingController.sizingOptions and UIHostingController.safeAreaRegions, but never found something that fixed the issue.
To Build and Reproduce
Make a new Xcode project > iOS > App > Storyboard UI
Add file ContentView.swift with contents above.
Replace contents of existing file ViewController.swift with contents above.
Set minimum deployment target to iOS 18
Build and deploy to device running iOS 18.
Hold device in portrait.
Rotate device to landscape - observe back button extends past safe area.
Rotate device to portrait - observe back button is shifted too far towards the center.
Device & Builds Specs
iOS 18.6.2 - minimum deployment of 18.0
Devices Observed:
iPhone 12 Pro Max
iPhone 16 Pro Max
Xcode 26
Image Examples
Area: Software Update
Type of Feedback: Application Bug
Description
Device: iPhone 13 Pro running iOS 26
Build environment: Xcode 16.4
Problem description:
When a text field has secureTextEntry = YES and Password Autofill / Passkeys is active, the autofill panel is not included in the rect reported from the keyboard notifications (UIKeyboardFrameEndUserInfoKey or others).
As a result, when calculating the offset to move the screen up and reveal the hidden input field, the field is not displayed correctly because the reported keyboard height is smaller than the actual visible height.
Observed behavior:
This only occurs on devices running iOS 26 built with Xcode 16.4.
On previous versions of iOS, with the same settings (secureTextEntry and Autofill active), the rect correctly includes the autofill panel height, and the UI works as expected.
I tested with both UIKeyboardDidShowNotification and UIKeyboardWillChangeFrameNotification, and in both cases the behavior is the same: the height is incorrect (smaller than expected with the autofill panel).
What I expect / questions:
That UIKeyboardFrameEndUserInfoKey (or the related notification) correctly reports the total area covered by the keyboard, including any password autofill panel, when secureTextEntry is active.
That the new behavior in iOS 26 be documented if this omission is intentional, or otherwise considered a bug if it is not.
If there is any official workaround suggested by Apple for developers affected by this issue while a fix is provided.
Thank you for your support.
Hello! I've been using Objective-C to write a single-view application and have been using AppDelegate for my window setup.
However, with the next release of iOS, I need to adopt SceneDelegate into my app for it to work.
I'm having trouble getting my main ViewController to show up when the app starts. It just shows up as a black screen.
I built this app entirely programmatically. When I go into my info.plist file, I have everything but the Storyboard setup since, obviously, I don't have one.
I've left my code below.
Thank you!
My current AppDelegate:
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
#pragma mark - UISceneSession Configuration
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
// Create the configuration object
return [[UISceneConfiguration alloc] initWithName: @"Default" sessionRole: connectingSceneSession.role];
}
#pragma mark - Application Configuration
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
- (void) dealloc {
[super dealloc];
}
@end
My Current SceneDelegate:
#import "SceneDelegate.h"
#import "ViewController.h"
@interface SceneDelegate ()
@end
@implementation SceneDelegate
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Ensure we have a UIWindowScene
if (![scene isKindOfClass:[UIWindowScene class]]) {
return;
}
UIWindowScene *windowScene = (UIWindowScene *)scene;
// Create and attach the window to the provided windowScene
self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
// Set up the root view controller
ViewController *homeViewController = [[[ViewController alloc] init] autorelease];
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController: homeViewController] autorelease];
// Present the window
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
}
@end
I'm developing an iOS application in Swift that performs API calls using URLSession.shared. The requests work correctly when the app is in the foreground. However, when the app transitions to the background (for example, when the user switches to another app), the ongoing API calls are either paused or do not complete as expected.
What I’ve tried:
Using URLSession.shared.dataTask(with:) to initiate the API requests
Observing application lifecycle events like applicationDidEnterBackground, but haven't found a reliable solution to allow requests to complete when backgrounded
Goal:
I want certain API requests to continue running or be allowed to complete even if the app enters the background.
Question:
What is the correct approach to allow API calls to continue running or complete when the app moves to the background?
Should I be using a background URLSessionConfiguration instead of URLSession.shared?
If so, how should it be properly configured and used in this scenario?
Error: "Attrubute can only be applied to types not declarations" on line 2 : @unchecked
@unchecked
enum ReminderRow : Hashable, Sendable {
case date
case notes
case time
case title
var imageName : String? {
switch self {
case .date: return "calendar.circle"
case .notes: return "square.and.pencil"
case .time: return "clock"
default : return nil
}
}
var image : UIImage? {
guard let imageName else { return nil }
let configuration = UIImage.SymbolConfiguration(textStyle: .headline)
return UIImage(systemName: imageName, withConfiguration: configuration)
}
var textStyle : UIFont.TextStyle {
switch self {
case .title : return .headline
default : return .subheadline
}
}
}
I have a UIKit app with a custom navigation controller. I want my view title to go up into the navigation bar when the user scrolls down the screen. It looks like UIScrollEdgeElementContainerInteraction should do what I want, but I am having trouble using it.
Below is a sample, where a header view represents a title. I added the interaction to the header view, but it seems to have no effect. Am I missing a step? Perhaps I misunderstand what this is supposed to do, or perhaps I do not understand the preconditions to make this work.
I am hoping someone can tell me what I am doing wrong, or point me to some working sample code.
Thank you.
John
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var headerView: UIVisualEffectView!
var tableView: UITableView!
var interaction: UIScrollEdgeElementContainerInteraction!
override func viewDidLoad() {
super.viewDidLoad()
self.tableView = UITableView()
self.tableView.translatesAutoresizingMaskIntoConstraints = false
self.tableView.topEdgeEffect.style = .soft
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.view.addSubview(self.tableView)
self.view.addConstraints([
self.tableView.topAnchor.constraint(equalTo: self.view.topAnchor),
self.tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
self.tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
self.tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
])
self.headerView = UIVisualEffectView(effect: UIGlassEffect(style: .regular))
self.headerView.translatesAutoresizingMaskIntoConstraints = false
self.headerView.backgroundColor = .green
self.view.addSubview(self.headerView)
self.view.addConstraints([
self.headerView.topAnchor.constraint(equalTo: self.view.topAnchor),
self.headerView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
self.headerView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
self.headerView.heightAnchor.constraint(equalToConstant: 100.0),
])
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "my text"
self.headerView.contentView.addSubview(label)
self.headerView.contentView.addConstraints([
label.centerXAnchor.constraint(equalTo: self.headerView.contentView.centerXAnchor),
label.centerYAnchor.constraint(equalTo: self.headerView.contentView.centerYAnchor),
])
self.interaction = UIScrollEdgeElementContainerInteraction()
self.interaction.scrollView = self.tableView
self.interaction.edge = .top
self.headerView.addInteraction(self.interaction)
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "row \(indexPath.row + 1)"
return cell
}
}
iPadOS 26, dark mode
Open Safari
Search for anything or open a website that has white background
Kill Safari
Open Safari again
I still can reproduce it with Safari on iPadOS 26.0.1
This issue also happens to my app when opening a HTML/JS on WKWebView with white background while using dark mode. I did send a feedback ticket when using iPadOS 26 beta but havent seen any reply. This is my first time sending a feedback so I dont know if Apple would reply or not.
I recently was thinking about which is the best format to use for my little icons in the app, and was considering the performance of PNG versus SVG . I know that PNG decoders are hardware accelerated and parallelized, and the rendering is as simple as placing the pixels on the screen.
On the other hand, SVG requires computation to determine the placement of pixels based on mathematical equations.
Considering this, my current assumption is that PNG is faster to render than SVG. However, if SVG is also hardware-accelerated, it could alter the situation, although this may not be the case.
When a TextField is set to a rightToLeft layout, it gets strange and unnecessary padding on the left side. This pushes the text away from the edge. This issue doesn't occur in the leftToRight layout, where the text aligns correctly. Does anyone know how to get rid of this extra padding?
Environment:
Xcode version: 26.0.1
Device: iPhone 13
iOS version: 26.0
Code:
struct ContentView: View {
@State var textInput: String = ""
var body: some View {
VStack {
Text("rightToLeft")
TextField("placeholder", text: $textInput)
.background(Color.red)
.environment(\.layoutDirection, .rightToLeft)
Text("leftToRight")
TextField("placeholder", text: $textInput)
.background(Color.red)
.environment(\.layoutDirection, .leftToRight)
}
.padding()
}
}
I've got an iOS app with a custom top toolbar view that uses a UIScrollEdgeElementContainerInteraction to achieve the iOS 26 progressive blur background. It's over top of a web view, and I've set the top edge effect style on its scroll view to .hard so the toolbar's edges are more defined.
I'm noticing that the blur doesn't extend fully to the bottom edge of the toolbar, and I'm curious to know if this is a bug or expected behavior. If the latter, what exactly are the details of what's expected? What determines the bottom extent of the blur?
I've got this result in a sample project on iOS 26.0. The white border is the label, and the red border is the title bar view itself. Note that the Daring Fireball logo visible inside the bounds of the bar view, and is cut off at the bottom edge of the label.
This is the code from the demo app that produced the screenshot.
let config = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: config)
self.view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true;
webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true;
webView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true;
webView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true;
webView.scrollView.topEdgeEffect.style = .hard
webView.load(URLRequest(url: URL(string: "https://daringfireball.net")!))
let barView = UIView()
self.view.addSubview(barView)
barView.translatesAutoresizingMaskIntoConstraints = false
barView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true;
barView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
barView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
let edgeEffect = UIScrollEdgeElementContainerInteraction()
edgeEffect.scrollView = webView.scrollView
edgeEffect.edge = .top
barView.addInteraction(edgeEffect)
barView.layer.borderColor = UIColor.red.cgColor
barView.layer.borderWidth = 1
let titleLabel = UILabel()
barView.addSubview(titleLabel)
titleLabel.translatesAutoresizingMaskIntoConstraints = false
titleLabel.leftAnchor.constraint(equalTo: barView.leftAnchor).isActive = true
titleLabel.rightAnchor.constraint(equalTo: barView.rightAnchor).isActive = true
titleLabel.bottomAnchor.constraint(equalTo: barView.bottomAnchor, constant: -20).isActive = true
titleLabel.topAnchor.constraint(equalTo: barView.safeAreaLayoutGuide.topAnchor, constant: 8).isActive = true
titleLabel.textAlignment = .center
titleLabel.text = "Title Here"
titleLabel.layer.borderColor = UIColor.green.cgColor
titleLabel.layer.borderWidth = 1
We are trying to use UITabAccessory to persist information across Tabs. When a new view onto the stack we hide the tab bar. It appears that UITabAccessory does not hide when the TabBar is hidden. Is there a way to hide/present it along with the TabBar?
There seems to be a regression in the behavior of UIScrollEdgeElementContainerInteraction on iOS 26.1 when it's over a WKWebView. If the web view's scroll view's topEdgeEffect.style is changed to .hard and then back to .soft, it will stop tracking the color of the content underneath it and use the wrong-mix in color in its blur.
I've filed this as FB20655398.
Here's some sample code to illustrate the issue. The test.html file being loaded is just a bunch of div elements with lorem ipsum.
private var webView: WKWebView? = nil
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: config)
webView.navigationDelegate = self
self.view.addSubview(webView)
webView.autoPinEdgesToSuperviewEdges()
webView.isInspectable = true
self.webView = webView
let url = Bundle.main.url(forResource: "test", withExtension: "html")!
webView.loadFileURL(url, allowingReadAccessTo: Bundle.main.bundleURL)
let blurView = UIView()
self.view.addSubview(blurView)
blurView.autoPinEdgesToSuperviewEdges(with: .zero, excludingEdge: .bottom)
let label = UILabel()
label.text = "This is a title bar"
blurView.addSubview(label)
label.autoAlignAxis(toSuperviewAxis: .vertical)
label.autoPinEdge(toSuperviewEdge: .bottom, withInset: 8)
label.autoPinEdge(toSuperviewSafeArea: .top, withInset: 8)
let interaction = UIScrollEdgeElementContainerInteraction()
interaction.scrollView = webView.scrollView
interaction.edge = .top
blurView.addInteraction(interaction)
self.webView?.scrollView.topEdgeEffect.style = .hard
DispatchQueue.main.asyncAfterUnsafe(deadline: .now() + .seconds(2)) {
self.webView?.scrollView.topEdgeEffect.style = .soft
}
registerForTraitChanges([UITraitUserInterfaceStyle.self]) { (self: Self, previousTraitCollection: UITraitCollection) in
self._updateWebViewColors()
}
}
private func _updateWebViewColors() {
let dark = self.traitCollection.userInterfaceStyle == .dark
let text = dark ? "#FFFFFF" : "#000000"
let bg = dark ? "#000000" : "#FFFFFF"
let js = "document.body.style.color = '\(text)';\ndocument.body.style.backgroundColor = '\(bg)';"
self.webView?.evaluateJavaScript(js) { res, err in
if let err {
print("JS error: \(err)")
}
}
}
If you run that, then change the system them to dark mode, you get this. Has anyone else seen this before? Know how to work around it?
I'm working on a UIBarButtonItem that is supposed to be a filter button - it shows a menu in which the user can (un)check menu items. Using the UIMenuElementAttributesKeepsMenuPresented attribute on the UIActions prevents the menu to hide after the user clicks an item.
The button is put alongside another button as the leftBarButtonItems of my navigation item. In iOS 26 they are grouped into a single glass container automatically.
Now when the user starts filtering, I want to highlight the UIBarButton item to signal to the user that the filter is active (similar to what Apple does in the Mail app). I do that by setting the UIBarButtonItemStyle to prominent. Now that works too, but it causes the automatic glass grouping to break up and the menu to hide.
I'm fine with the grouping to break up, but the menu shouldn't hide.
Is this a bug or can this be prevented somehow?
Cannot find any guidance in the forums and Developer Doc, the WWDC session Meet TextKit2 says this protocol is served for any location type espacially useful when the underlying doc model is not linear. But when I try to subclass the NSTextLocation with my own type to define a more structured location rather than a linear one, also with my own NSTextContentManager subclass implementation, I keep receiving the system internal Location model like NSCountableTextLocation compare to my location which cause the app to crash.
-[NSCountableTextLocation compare:] receiving unmatching type <MarkdownTK2.ChildIndexPathLocation: 0x9b2402aa0>
In my own NSTextContentManager subclass:
public override func offset(
from: any NSTextLocation,
to: any NSTextLocation
) -> Int {
this method will also both receive my own location and some times receiving the system defined location that I can not calculate the offset then just return zero.
The doc only says
If you provide your own implementation of the NSTextLocation protocol to manage locations in your content, subclass NSTextContentManager and implement your own storage object to support those locations.
OS
Development environment: Xcode 26.0, macOS 26.0
Run-time configuration: macOS 26.0
Prior to iOS 26, this successfully gave me a modal view with a transparent background:
let settingsVC = MySettingsViewController()
settingsVC.modalPresentationStyle = .automatic
//settingsVC.modalPresentationStyle = .overCurrentContext
self.present(settingsVC, animated: true, completion: {
}
MySettingsViewController:
self.view.backgroundColor = UIColor(white: 0, alpha: 0.5)
Now in iOS 26, modal view is presented in a opaque grey background.
To reproduce this bug create a new Xcode Project for IOS choose UIKit. In the app delegate add the following lines.
As you can see in the above image . Line 19 with the initialization of PHPickerViewController has no compilation failure.
Now lets add import WidgetKit
As soon as widgetKit is imported a compiler error is thrown which is PHPickerViewController is not in scope.
This worked with Xcode 16.4
It was possible to have a swift file with both WidgetKit implementations and PhotosUI implementations. This behavior has changed in Xcode 26/26.0.1 .
Does anybody know why this happens , could not find any clues within the different versions of documentations.
P.S
Found a work around which raises further questions
Adding import SwiftUI fixes this problem , I am genuinely curious on how this is happening on a compiler level.
LINKS
To my previously published post :https://developer.apple.com/forums/thread/804059
I have an App with a UITabBarController. When one of the Tabs is selected then it presents a UINavigationController. This in turn presents a UIViewController to start with. (Call it myViewVC)
myViewVC has a UITableView. This is the only subview of myViewVC.
When I scroll I expect the UINavigationBar to collapse from a large Title to a small title. But instead I see no small title. This all worked fine in iOS18.x
I have tried various things suggested on forums and by AI and none of these have fixed the problem
I have set both self.navigationItem.title = @"My VC"; and self.navigationItem.largeTitle = @"My VC (New in iOS26)
It was suggested that I tie the UITableView constraints to the top of the view rather than the safe area. That did not help.
I have removed any custom appearance settings for the UINavigationBar. That did not help.
I also tried to add this line but it did not help
myTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
I have a UINavigation controller which on the second viewController has a Google Map view. In iOS 18 you would navigate normally around the map, and swipe your finger from the left side of the screen to move the map, this worked correctly.
However, in iOS 26 swiping from left to right from anywhere but the far right side of the screen will cause the UI to try to pop the viewController.
This does not happen when I add Apple Maps or other map frameworks to the VC.
Is there a way to disable the "swipe from middle" in iOS 26?