Post

Replies

Boosts

Views

Activity

Selecting ~/Library in open panel doesn't give access to ~/Library/Mail
A user of my app brought to my attention that unless they select their ~/Library/Mail folder explicitly in an open panel, they get an error when scanning it inside my app. I can confirm that I also get a permission error when trying to scan it as a subfolder of ~/Library, but not if I select it directly. I'm assuming this is intentional, but it would be nice to have an explanation or some documentation that I can point my users to when they encounter what appears to them as a bug in my app. What makes this matter even more confusing is that selecting a folder in any open panel of an app gives the app access to it for the lifetime of the app, but after restarting the app, access is lost again (unless it has a bookmark to it). This was probably the reason why the user thought that it worked in another app but not in mine. This is the code I use to scan: let openPanel = NSOpenPanel() openPanel.canChooseDirectories = true if openPanel.runModal() == .cancel { return } let enumerator = FileManager.default.enumerator(at: openPanel.urls[0], includingPropertiesForKeys: nil) { url, error in print(url.path, error) return true } while let url = enumerator?.nextObject() as? URL { } And this the error related to the Mail folder: ~/Library/Mail Error Domain=NSCocoaErrorDomain Code=257 "The file “Mail” couldn’t be opened because you don’t have permission to view it." UserInfo={NSURL=file:///~/Library/Mail, NSFilePath=/~/Library/Mail, NSUnderlyingError=0x600002991470 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
4
0
126
Sep ’25
Control status item and login item from within app
In macOS 26 I noticed there is a section Menu Bar in System Settings which allows to toggle visibility of status items created with NSStatusItem. I'm assuming this is new, since I never noticed it before. Currently my app has a menu item that allows toggling its status item, but now I wonder whether it should always create the status item and let the user control its visibility from System Settings. Theoretically, keeping this option inside the app could lead to confusion if the user has previously disabled the status item in System Settings, then perhaps forgot about it, and then tries to enable it inside the app, but apparently nothing happens because System Settings overrides the app setting. Should I remove the option inside the app? This also makes me think of login items, which can be managed both in System Settings and inside the app via SMAppService. Some users ask why my app doesn't have a launch at login option, and I tell them that System Settings already offers that functionality. Since there is SMAppService I could offer an option inside the app that is kept in sync with System Settings, but I prefer to avoid duplicating functionality, particularly if it's something that is changed once by the user and then rarely (if ever) changed afterwards. But I wonder: why can login items be controlled by an app, and the status item cannot (at least I'm not aware of an API that allows to change the option in System Settings)? If the status item can be overridden in System Settings, why do login items behave differently?
7
0
188
Sep ’25
Window title bar in macOS 26 is drawn even if titlebarAppearsTransparent = true
macOS 26 sometimes draws the title bar background even when setting NSWindow.titlebarAppearsTransparent = true and I don't understand the logic behind it, or how I can turn this off. I'm trying to do something similar to Xcode's "Welcome to Xcode" window which has a left view and a right table view. In my simplified example, the window contains a label and a text view. This used to work in macOS 15, but in macOS 26 the text view is partially covered by the title bar: As soon as I remove the line scrollView.hasVerticalScroller = true, the title bar isn't drawn anymore: The title bar also isn't drawn when removing the view on the left of the text view: I created FB20341654. This may be related to this other issue: NSWindow.titlebarAppearsTransparent only works after collapsing and expanding sidebar @main class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { let window = NSWindow(contentViewController: ViewController()) window.titlebarAppearsTransparent = true window.titleVisibility = .hidden window.styleMask = [.titled, .closable, .fullSizeContentView] window.makeKeyAndOrderFront(nil) } } class ViewController: NSViewController { override func loadView() { view = NSView(frame: CGRect(x: 0, y: 0, width: 400, height: 200)) let scrollView = NSScrollView() scrollView.hasVerticalScroller = true // commenting this line out solves the issue scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.automaticallyAdjustsContentInsets = false let documentView = NSTextView() documentView.string = (0..<10).map({ "\($0)" }).joined(separator: "\n") scrollView.documentView = documentView let stack = NSStackView(views: [ NSTextField(labelWithString: "asdfasdfasdfasdf"), // commenting this line out also solves the issue scrollView ]) stack.orientation = .horizontal view.addSubview(stack) NSLayoutConstraint.activate([stack.topAnchor.constraint(equalTo: view.topAnchor), stack.leadingAnchor.constraint(equalTo: view.leadingAnchor), stack.trailingAnchor.constraint(equalTo: view.trailingAnchor), stack.bottomAnchor.constraint(equalTo: view.bottomAnchor)]) } }
Topic: UI Frameworks SubTopic: AppKit Tags:
2
0
246
Sep ’25
App sometimes crashes when inserting String into Set with assertion ELEMENT_TYPE_OF_SET_VIOLATES_HASHABLE_REQUIREMENTS
Xcode downloaded a crash report for my app that crashed when trying to insert a String into a Set<String>. Apparently there was an assertion failure ELEMENT_TYPE_OF_SET_VIOLATES_HASHABLE_REQUIREMENTS. I assume that this assertion failure happened because the hash of the new element didn't match the hash of an equal already inserted element, but regardless, I don't understand how inserting a simple string could trigger this assertion. Here is essentially the code that leads to the crash. path is any file system directory, and basePath is a directory higher in the hierarchy, or path itself. var scanErrorPaths = Set<String>() func main() { let path = "/path/to/directory" let basePath = "/path" let fileDescriptor = open(path, O_RDONLY) if fileDescriptor < 0 { if (try? URL(fileURLWithPath: path, isDirectory: false).checkResourceIsReachable()) == true { scanErrorPaths.insert(path.relativePath(from: basePath)!) return } } extension String { func relativePath(from basePath: String) -> String? { if basePath == "" { return self } guard let index = range(of: basePath, options: .anchored)?.upperBound else { return nil } return if index == endIndex || basePath == "/" { String(self[index...]) } else if let index = self[index...].range(of: "/", options: .anchored)?.upperBound { String(self[index...]) } else { nil } } } crash.crash
7
0
900
Oct ’25
Trying to print NSAttributedString via many UITextViews causes crash
My Mac app uses many NSTextViews just fine for printing a long string, but trying to do the same on iOS with many UITextViews and associated UIViewPrintFormatters just causes a crash.*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' *** First throw call stack: ( 0 CoreFoundation 0x00007fff23c7127e __exceptionPreprocess + 350 1 libobjc.A.dylib 0x00007fff513fbb20 objc_exception_throw + 48 2 CoreFoundation 0x00007fff23d03ab1 _CFThrowFormattedException + 194 3 CoreFoundation 0x00007fff23b83bf9 -[__NSArrayM objectAtIndex:] + 169 4 UIKitCore 0x00007fff48029503 -[UITextViewPrintFormatter rectForPageAtIndex:] + 86 5 UIKitCore 0x00007fff4806bc79 __57-[UIPrintPageRenderer drawPrintFormatter:forPageAtIndex:]_block_invoke + 41 6 UIKitCore 0x00007fff4806bcf9 __57-[UIPrintPageRenderer drawPrintFormatter:forPageAtIndex:]_block_invoke.43 + 29 7 libdispatch.dylib 0x000000010e4f6d48 _dispatch_client_callout + 8 8 libdispatch.dylib 0x000000010e505b24 _dispatch_async_and_wait_invoke + 175 9 libdispatch.dylib 0x000000010e4f6d48 _dispatch_client_callout + 8 10 libdispatch.dylib 0x000000010e504de6 _dispatch_main_queue_callback_4CF + 1500 11 CoreFoundation 0x00007fff23bd4049 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 12 CoreFoundation 0x00007fff23bceca9 __CFRunLoopRun + 2329 13 CoreFoundation 0x00007fff23bce066 CFRunLoopRunSpecific + 438 14 GraphicsServices 0x00007fff384c0bb0 GSEventRunModal + 65 15 UIKitCore 0x00007fff48092d4d UIApplicationMain + 1621 16 myApp 0x000000010e1ca61b main + 75 17 libdyld.dylib 0x00007fff5227ec25 start + 1 18 ??? 0x0000000000000001 0x0 + 1 )Here's the code:class ViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { let printController = UIPrintInteractionController.shared let printPageRenderer = PrintPageRenderer() printController.printPageRenderer = printPageRenderer printController.present(animated: true) } } class PrintPageRenderer: UIPrintPageRenderer { let layoutManager = NSLayoutManager() let textStorage = NSTextStorage(string: "fhdjksalhfj dskla fjf") var textViews = [UITextView]() override func prepare(forDrawingPages range: NSRange) { DispatchQueue.main.sync { for (i, textView) in textViews.enumerated() { let printFormatter = textView.viewPrintFormatter() addPrintFormatter(printFormatter, startingAtPageAt: i) } } } override var numberOfPages: Int { textStorage.addLayoutManager(layoutManager) let size = CGFloat(50) for _ in 0..&lt;2 { let textContainer = NSTextContainer(size: CGSize(width: size, height: size)) layoutManager.addTextContainer(textContainer) let textView = UITextView(frame: CGRect(x: 0, y: 0, width: size, height: size), textContainer: textContainer) textViews.append(textView) } return textViews.count } }My goal is printing a document from an attributed string and showing a custom header and footer on each page.
Topic: UI Frameworks SubTopic: UIKit Tags:
9
0
2k
Jul ’22
Playing back audio recorded with AVCaptureAudioDataOutput
I'm trying to record video and audio and sending them over the network so that they can be played back in real time on other clients. I've managed to record and play back video successfully, but audio still cannot be played back (see AVAudioPlayer at the bottom of the code below). What am I doing wrong or what is missing? Thank you in advance for any input. let captureSession = AVCaptureSession() private func startVideoAudioFeed() {     let sessionPreset = AVCaptureSession.Preset.low     if captureSession.canSetSessionPreset(sessionPreset) {         captureSession.sessionPreset = sessionPreset     }     switch AVCaptureDevice.authorizationStatus(for: .video) {     case .notDetermined:         AVCaptureDevice.requestAccess(for: .video) { success in             self.startVideoAudioFeed()         }     case .authorized:         captureSession.beginConfiguration()         let captureVideoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front)!         let captureVideoInput = try! AVCaptureDeviceInput(device: captureVideoDevice)         if captureSession.canAddInput(captureVideoInput) {             captureSession.addInput(captureVideoInput)         }         let captureVideoOutput = AVCaptureVideoDataOutput()         captureVideoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main)         if captureSession.canAddOutput(captureVideoOutput) {             captureSession.addOutput(captureVideoOutput)         }         captureSession.commitConfiguration()         captureSession.startRunning()     default:         break     }     switch AVCaptureDevice.authorizationStatus(for: .audio) {     case .notDetermined:         AVCaptureDevice.requestAccess(for: .audio) { success in             self.startVideoAudioFeed()         }     case .authorized:         captureSession.beginConfiguration()         let captureAudioDevice = AVCaptureDevice.default(for: .audio)!         let captureAudioInput = try! AVCaptureDeviceInput(device: captureAudioDevice)         if captureSession.canAddInput(captureAudioInput) {             captureSession.addInput(captureAudioInput)         }         let captureAudioOutput = AVCaptureAudioDataOutput()         captureAudioOutput.audioSettings = [AVFormatIDKey: kAudioFormatLinearPCM, AVNumberOfChannelsKey: NSNumber(value: 1), AVSampleRateKey: NSNumber(value: 44100)]         captureAudioOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main)         if captureSession.canAddOutput(captureAudioOutput) {             captureSession.addOutput(captureAudioOutput)         }         captureSession.commitConfiguration()     default:         break     } } func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {     if let imageBuffer = sampleBuffer.imageBuffer {         let ciImage = CIImage(cvPixelBuffer: imageBuffer)         let cgImage = CIContext().createCGImage(ciImage, from: ciImage.extent)!         let data = CFDataCreateMutable(nil, 0)!         let imageDestination = CGImageDestinationCreateWithData(data, kUTTypeJPEG, 1, nil)!         CGImageDestinationAddImage(imageDestination, cgImage, [kCGImageDestinationLossyCompressionQuality: NSNumber(value: 0)] as CFDictionary)         CGImageDestinationFinalize(imageDestination)         play(data: data as Data)     } else if let dataBuffer = sampleBuffer.dataBuffer {         let data = try! dataBuffer.dataBytes()         play(data: data)     } } private func play(data: Data) {     if let image = CGImage(jpegDataProviderSource: CGDataProvider(data: data as CFData)!, decode: nil, shouldInterpolate: false, intent: .defaultIntent) { &#9;&#9;&#9;&#9;// image is a valid image     } else if let audioPlayer = try? AVAudioPlayer(data: data) {         audioPlayer.play() &#9;&#9;&#9;&#9;// audioPlayer is always nil with error: Error Domain=NSOSStatusErrorDomain Code=1954115647 "(null)"     } }
0
0
992
Feb ’21
SceneKit objects become sharp when viewed through non-opaque objects with depth of field enabled
By adding this code to the default SceneKit Xcode project, one can reproduce the issue (the default ship object is blurred when viewed directly by the camera, and sharp when viewed through the semi-transparent square): cameraNode.camera!.wantsDepthOfField = true cameraNode.camera!.focusDistance = 2 cameraNode.camera!.fStop = 0.5 let plane = SCNNode(geometry: SCNPlane(width: 1, height: 1)) plane.position = SCNVector3(x: 0.5, y: 0, z: 13) plane.opacity = 0.5 scene.rootNode.addChildNode(plane) Is this something expected, and is there a workaround for making objects seen through semi-transparent objects appear blurred as well?
0
0
628
Feb ’21
How to disable weekly "We are interested in investigating your feedback" reminders
Since a year or so I get frequent email reminders for feedbacks to which Apple answered and to which I still didn't reply. The interval between Apple's answer and the automatic reminder can be as small as 5 days and are repeated weekly until I respond to them. There is apparently no way of disabling them. How can it be that I have to respond within 5 days and Apple can take up to 8 years (the longest I've waited for a response for now)? I've already reported this several times but to no avail. I would also like to be able to send weekly reminders to Apple for not responding to pressing issues, but unfortunately that's not possible and this comes across as being quite arrogant.
2
0
662
Jun ’21
Resolve bookmark created in iOS app in Share Extension
I create a URL bookmark with URL.bookmarkData(options: [], includingResourceValuesForKeys: [.localizedNameKey]) and resolve it with NSURL(resolvingBookmarkData: bookmarkData, options: [], relativeTo: nil, bookmarkDataIsStale: nil) asURL. This works fine within my main app, but when sharing the bookmarkData via an App Group with my Share Extension, it gives the error "The file couldn't be opened because you don't have permission to view it.". Is there any way I can do this?
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
488
Nov ’21
"Frame for "View" will be different at runtime" keeps reappearing with always different frame
For a couple of years now Xcode has been showing many similar warnings when opening a storyboard file. I have opened FB8245368 more than a year ago without response. If there is a way of solving these warnings inside the storyboard without adding artificial constraints that are removed at build time? Open the project at https://www.icloud.com/iclouddrive/0bNxa2_8jNRVFbpKsTyrB5yMg#problem Select that warning, then click Update Frames at the bottom right of the canvas. You can keep pressing the button until the view is entirely collapsed.
0
0
722
Nov ’21
How to download and install old macOS versions
I haven‘t yet found an official Apple website that lists older macOS versions. Fortunately, I have kept the installers on a separate external storage after each major upgrade, but when launching them from a macOS version newer that the installer itself, macOS shows an error that it‘s not possible to install it. What is the official way of installing older macOS versions so that I can test my App Store apps?
4
0
3.5k
Nov ’21
Setting UITextView text color after text change causes caret rect to jump up and down
It seems that when typing inside a textview that has insets and padding, the caret keeps jumping up and down on most keystrokes. Is there a solution to this? class ViewController: UIViewController, UITextViewDelegate {     @IBOutlet weak var textView: TextView!     override func viewDidLayoutSubviews() {         let h = textView.bounds.size.height / 2         textView.textContainerInset = UIEdgeInsets(top: h, left: 0, bottom: h, right: 0)         textView.textContainer.lineFragmentPadding = 200     }     func textViewDidChange(_ textView: UITextView) {         textView.textStorage.addAttribute(.foregroundColor, value: UIColor.red, range: NSRange(location: 0, length: 1))     } } class TextView: UITextView {     override func caretRect(for position: UITextPosition) -> CGRect {         let r = super.caretRect(for: position)         print(r)         return r     } } A complete project can be found here: https://www.icloud.com/iclouddrive/0yEBQZPUCZQH1o3HiL8_6q_gQ#problem_copia
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
634
Nov ’21
Xcode thinks iPad is not connected when deploying
Every now and then (say at least once a week, but possibly many times within a day) when I try to deploy to my iPad Xcode shows a sheet reading "iPad is not connected", even if it was working a minute earlier. I have reported this already several months ago, but apparently there is no fix for this yet. Usually, restarting Mac and/or iPad solves the issue, but it's really annoying when I have to do this repeatedly. Is there an easier workaround?
0
0
353
Nov ’21