Post

Replies

Boosts

Views

Activity

SKTexture initialized with system UIImage has slightly wrong aspect ratio and ignores system symbol color
On macOS, system symbols displays in a SKTexture as expected, with the correct color and aspect ratio. But on iOS they are always displayed in black, and sometimes with slightly wrong aspect ratio. Is there a solution to this problem? import SpriteKit #if os(macOS) import AppKit #else import UIKit #endif class GameScene: SKScene { override func didMove(to view: SKView) { let systemImage = "square.and.arrow.up" let width = 400.0 #if os(macOS) let image = NSImage(systemSymbolName: systemImage, accessibilityDescription: nil)!.withSymbolConfiguration(.init(hierarchicalColor: .white))! let scale = NSScreen.main!.backingScaleFactor image.size = CGSize(width: width * scale, height: width / image.size.width * image.size.height * scale) #else let image = UIImage(systemName: systemImage)!.applyingSymbolConfiguration(.init(pointSize: width))!.applyingSymbolConfiguration(.init(hierarchicalColor: .white))! #endif let texture = SKTexture(image: image) print(image.size, texture.size(), image.size.width / image.size.height) let size = CGSize(width: width, height: width / image.size.width * image.size.height) addChild(SKSpriteNode(texture: texture, size: size)) } }
8
0
1.2k
Sep ’24
Basic app intent always showing error in Shortcuts app "The action could not run because an internal error occurred."
I have a very basic App Intent extension in my macOS app that does nothing than accepting two parameters, but running it in Shortcuts always produces the error "The action “Compare” could not run because an internal error occurred.". What am I doing wrong? struct CompareIntent: AppIntent { static let title = LocalizedStringResource("intent.compare.title") static let description = IntentDescription("intent.compare.description") static let openAppWhenRun = true @Parameter(title: "intent.compare.parameter.original") var original: String @Parameter(title: "intent.compare.parameter.modified") var modified: String func perform() async throws -> some IntentResult { return .result() } }
8
0
1.2k
Feb ’25
FileManager.removeItem(atPath:) fails with "You don't have permission to access the file" error when trying to remove non-empty directory on NAS
A user of my app reported that when trying to remove a file it always fails with the error "file couldn't be removed because you don't have permission to access it (Cocoa Error Domain 513)". After some testing, we found out that it's caused by trying to delete non-empty directories. I'm using FileManager.removeItem(atPath:) which has worked fine for many years, but it seems that with their particular NAS, it doesn't work. I could work around this by checking if the file is a directory, and if it is, enumerating the directory and remove each contained file before removing the directory itself. But shouldn't this already be taken care of? In the source code of FileManager I see that for Darwin platforms it calls removefile(pathPtr, state, removefile_flags_t(REMOVEFILE_RECURSIVE)) so it seems that it should already work. Is the REMOVEFILE_RECURSIVE flag perhaps ignored by the device? But then, is the misleading "you don't have permission to access the file" error thrown by the device or by macOS? For the FileManager source code, see https://github.com/swiftlang/swift-foundation/blob/1d5d70997410fc8b7700c8648b10d6fc28194202/Sources/FoundationEssentials/FileManager/FileOperations.swift#L444
8
0
202
Jul ’25
No email notification for answers to own posts
It's been known for at least 4 months that there is no email notification for answers to own posts, like an Apple engineer confirmed here https://developer.apple.com/forums/thread/656787?login=true Why does it take so long to fix a basic issue like this? How long will we have to check daily for new answers without being able to count on a simple notification?
9
0
1.5k
Nov ’21
macOS keeps showing "[App] would like to access data from other apps" warning even if accepting it each time
It seems that whenever I scan the contents of ~/Library/Containers with my app, I get the warning [App] would like to access data from other apps, regardless of how often I have already allowed it. When the warning appears, the last scanned file is ~/Library/Containers/com.apple.CloudPhotosConfiguration/Data. My sample code: let openPanel = NSOpenPanel() openPanel.canChooseDirectories = true openPanel.runModal() let url = openPanel.urls[0] let enumerator = FileManager.default.enumerator(at: url, includingPropertiesForKeys: nil) while let url = enumerator?.nextObject() as? URL { print(url.path) } Is it expected that one has to allow this warning every time the app is run?
9
1
9.3k
Nov ’24
NSTextView.shouldDrawInsertionPoint doesn't work with TextKit 2
The following code only ever causes shouldDrawInsertionPoint to be printed (no drawInsertionPoint), but even if that method returns false, the blinking insertion point is still drawn. On the other hand, with TextKit 1 it works as expected. Is there a way to hide the default insertion point in TextKit 2? My app draws its own. I've filed FB13684251. class TextView: NSTextView { override var shouldDrawInsertionPoint: Bool { print("shouldDrawInsertionPoint") return false } override func drawInsertionPoint(in rect: NSRect, color: NSColor, turnedOn flag: Bool) { print("drawInsertionPoint", flag) } } ``
Topic: UI Frameworks SubTopic: AppKit Tags:
9
0
170
Aug ’25
Xcode crashes when distributing product for App Store Connect
After building the Product Archive, the Organizer window opens, I click Distribute App. Next. Next. Next. Next. Crash. The crash happens before I'm able to export anything, so I cannot even use the Application Loader. The last message above the indeterminate progress indicator I can read before it crashes is "Packaging MyApp ...". It would be really nice if an Apple engineer could help sort this out, because I already contacted the App Store Connect support and they told me that the only way I can get help is by writing on this forum, searching the Xcode documentation, or using one of the 2 free TSIs I get each year (which I have already used). Stacktrace (I tried to paste the whole crash report, but I get an error that the message is too long and that I should click on the icon to attach a file instead, but I don't see such an icon): Process:&#9;&#9;&#9;&#9;&#9;&#9;&#9; Xcode [834] Path:&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;/Applications/Xcode.app/Contents/MacOS/Xcode Identifier:&#9;&#9;&#9;&#9;&#9;&#9;com.apple.dt.Xcode Version:&#9;&#9;&#9;&#9;&#9;&#9;&#9; 12.2 (17535) Build Info:&#9;&#9;&#9;&#9;&#9;&#9;IDEFrameworks-17535000000000000~23 (12B45b) App Item ID:&#9;&#9;&#9;&#9;&#9; 497799835 App External ID:&#9;&#9;&#9; 838360538 Code Type:&#9;&#9;&#9;&#9;&#9;&#9; X86-64 (Native) Parent Process:&#9;&#9;&#9;&#9;??? [1] Responsible:&#9;&#9;&#9;&#9;&#9; Xcode [834] User ID:&#9;&#9;&#9;&#9;&#9;&#9;&#9; 501 Date/Time:&#9;&#9;&#9;&#9;&#9;&#9; 2020-12-07 17:22:11.231 +0100 OS Version:&#9;&#9;&#9;&#9;&#9;&#9;macOS 11.0.1 (20B29) Report Version:&#9;&#9;&#9;&#9;12 Bridge OS Version:&#9;&#9; 3.0 (14Y908) Anonymous UUID:&#9;&#9;&#9;&#9;7A3F67B1-D68A-4230-40B2-B7EE13B51792 Sleep/Wake UUID:&#9;&#9;&#9; 4913FE52-7DB5-45E0-9396-EFBA2ADD0B5C Time Awake Since Boot: 47000 seconds Time Since Wake:&#9;&#9;&#9; 5900 seconds System Integrity Protection: enabled Crashed Thread:&#9;&#9;&#9;&#9;17&#9;Dispatch queue: ConcurrentQueue: -[IDEDistributionPackagingStepViewController viewDidInstall]_block_invoke Exception Type:&#9;&#9;&#9;&#9;EXC_CRASH (SIGABRT) Exception Codes:&#9;&#9;&#9; 0x0000000000000000, 0x0000000000000000 Exception Note:&#9;&#9;&#9;&#9;EXC_CORPSE_NOTIFY Application Specific Information: Possibly stale failure hints from 2020-12-07 16:21:03 +0000: &#9;0: Calling block provided by: &#9;0&#9; DVTDispatchAsync (in DVTFoundation) &#9;1&#9; __56-[IDEArchiveProductSource updateArchivesWithCompletion:]_block_invoke_2 (in IDEProducts) &#9;2&#9; DVT_CALLING_CLIENT_BLOCK (in DVTFoundation) &#9;3&#9; __DVTDispatchAsync_block_invoke (in DVTFoundation) &#9;4&#9; _dispatch_call_block_and_release (in libdispatch.dylib) &#9;5&#9; _dispatch_client_callout (in libdispatch.dylib) &#9;6&#9; _dispatch_continuation_pop (in libdispatch.dylib) &#9;7&#9; _dispatch_async_redirect_invoke (in libdispatch.dylib) &#9;8&#9; _dispatch_root_queue_drain (in libdispatch.dylib) &#9;9&#9; _dispatch_worker_thread2 (in libdispatch.dylib) 10&#9; _pthread_wqthread (in libsystem_pthread.dylib) 11&#9; start_wqthread (in libsystem_pthread.dylib) ProductBuildVersion: 12B45b ASSERTION FAILURE in /Library/Caches/com.apple.xbs/Sources/DVTFrameworks/DVTFrameworks-17518/DVTFoundation/FilePaths/DVTFilePath.m:912 Details:&#9;url should be an instance inheriting from NSURL, but it is nil Object:&#9; <DVTFilePath> Method:&#9; +filePathForFileURL: Thread:&#9; <NSThread: 0x7fa6c43458e0>{number = 4468, name = (null)} Open FDs: 115/7168 Hints:&#9; &#9;0: Calling block provided by: &#9;0&#9; DVTDispatchAsync (in DVTFoundation) &#9;1&#9; DVTAsyncPerformBlock (in DVTFoundation) &#9;2&#9; -[IDEDistributionPackagingStepViewController viewDidInstall] (in IDEKit) &#9;3&#9; -[DVTViewController _viewDidInstall] (in DVTViewControllerKit) &#9;4&#9; -[_DVTViewController_ViewLifecycleInterpositions viewDidMoveToWindow] (in DVTViewControllerKit) &#9;5&#9; -[NSView _setWindow:] (in AppKit) &#9;6&#9; -[NSView addSubview:] (in AppKit) &#9;7&#9; -[NSView setSubviews:] (in AppKit) &#9;8&#9; -[DVTBorderedView setContentView:] (in DVTUserInterfaceKit) &#9;9&#9; -[IDEDistributionAssistantWindowController setDistributionStepViewController:] (in IDEKit) 10&#9; -[NSObject(NSKeyValueObservingPrivate) _changeValueForKeys:count:maybeOldValuesDict:maybeNewValuesDict:usingBlock:] (in Foundation) 11&#9; -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:] (in Foundation) 12&#9; _NSSetObjectValueAndNotify (in Foundation) 13&#9; -[IDEDistributionAssistantWindowController next:] (in IDEKit) 14&#9; __79-[IDEDistributionAutomaticSigningAssetsStepViewController _locateSigningAssets]_block_invoke_2 (in IDEKit) 15&#9; DVT_CALLING_CLIENT_BLOCK (in DVTFoundation) 16&#9; ___DVTAsyncPerformBlockOnMainRunLoop_block_invoke (in DVTFoundation) 17&#9; CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK (in CoreFoundation) 18&#9; __CFRunLoopDoBlocks (in CoreFoundation) 19&#9; __CFRunLoopRun (in CoreFoundation) 20&#9; CFRunLoopRunSpecific (in CoreFoundation) 21&#9; RunCurrentEventLoopInMode (in HIToolbox) 22&#9; ReceiveNextEventCommon (in HIToolbox) 23&#9; _BlockUntilNextEventMatchingListInModeWithFilter (in HIToolbox) 24&#9; _DPSNextEvent (in AppKit) 25&#9; -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] (in AppKit) 26&#9; -[DVTApplication nextEventMatchingMask:untilDate:inMode:dequeue:] (in DVTKit) 27&#9; -[NSApplication run] (in AppKit) 28&#9; NSApplicationMain (in AppKit) 29&#9; start (in libdyld.dylib) Backtrace: &#9;0&#9; -[IDEAssertionHandler handleFailureInMethod:object:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in IDEKit) &#9;1&#9; _DVTAssertionHandler (in DVTFoundation) &#9;2&#9; _DVTAssertionFailureHandler (in DVTFoundation) &#9;3&#9; +[DVTFilePath filePathForFileURL:] (in DVTFoundation) &#9;4&#9; -[IDEDistributionSymbolsStep runWithError:] (in IDEFoundation) &#9;5&#9; -[IDEDistributionProcessingPipeline process:] (in IDEFoundation) &#9;6&#9; -[IDEDistributionPackagingStepViewController _runPipeline] (in IDEKit) &#9;7&#9; __60-[IDEDistributionPackagingStepViewController viewDidInstall]_block_invoke_2 (in IDEKit) &#9;8&#9; DVT_CALLING_CLIENT_BLOCK (in DVTFoundation) &#9;9&#9; __DVTDispatchAsync_block_invoke (in DVTFoundation) 10&#9; _dispatch_call_block_and_release (in libdispatch.dylib) 11&#9; _dispatch_client_callout (in libdispatch.dylib) 12&#9; _dispatch_continuation_pop (in libdispatch.dylib) 13&#9; _dispatch_async_redirect_invoke (in libdispatch.dylib) 14&#9; _dispatch_root_queue_drain (in libdispatch.dylib) 15&#9; _dispatch_worker_thread2 (in libdispatch.dylib) 16&#9; _pthread_wqthread (in libsystem_pthread.dylib) 17&#9; start_wqthread (in libsystem_pthread.dylib) abort() called Application Specific Signatures: (url) != nil ...
10
0
3.4k
Apr ’21
Audit token provided by NEFilterDataProvider sometimes fails to provide code object with SecCodeCopyGuestWithAttributes
I'm using this code to get the path of an executable from the audit token provided in NEFilterDataProvider.handleNewFlow(_:), forwarded from the Network Extension to the main app via IPC: private func securePathFromAuditToken(_ auditToken: Data) throws -> String { let secFlags = SecCSFlags() var secCode: SecCode? var status = SecCodeCopyGuestWithAttributes(nil, [kSecGuestAttributeAudit: auditToken] as CFDictionary, secFlags, &secCode) guard let secCode = secCode else { throw NSError(domain: NSOSStatusErrorDomain, code: Int(status)) } var secStaticCode: SecStaticCode? status = SecCodeCopyStaticCode(secCode, secFlags, &secStaticCode) guard let secStaticCode = secStaticCode else { throw NSError(domain: NSOSStatusErrorDomain, code: Int(status)) } var url: CFURL? status = SecCodeCopyPath(secStaticCode, secFlags, &url) guard let url = url as URL? else { throw NSError(domain: NSOSStatusErrorDomain, code: Int(status)) } return url.path } This code sometimes returns paths like /System/Library/PrivateFrameworks/HelpData.framework/Versions/A/Resources/helpd or /Library/Developer/CoreSimulator/Volumes/iOS_21A328/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 17.0.simruntime/Contents/Resources/RuntimeRoot/usr/libexec/mobileassetd. But sometimes the SecCodeCopyGuestWithAttributes fails with status 100001 which is defined in MacErrors.h as kPOSIXErrorEPERM = 100001, /* Operation not permitted */. In these cases I resort to this code, which I have read is not as secure: private func insecurePathFromAuditToken(_ auditToken: Data) throws -> String? { if auditToken.count == MemoryLayout<audit_token_t>.size { let pid = auditToken.withUnsafeBytes { buffer in audit_token_to_pid(buffer.baseAddress!.assumingMemoryBound(to: audit_token_t.self).pointee) } let pathbuf = UnsafeMutablePointer<Int8>.allocate(capacity: Int(PROC_PIDPATHINFO_SIZE)) defer { pathbuf.deallocate() } let ret = proc_pidpath(pid, pathbuf, UInt32(PROC_PIDPATHINFO_SIZE)) if ret <= 0 { throw NSError(domain: NSPOSIXErrorDomain, code: Int(errno)) } return String(cString: pathbuf) } return nil } This insecure code then returns paths like /usr/libexec/trustd, /usr/libexec/rapportd, /usr/libexec/nsurlsessiond and /usr/libexec/timed. From what I can see, SecCodeCopyGuestWithAttributes fails for all processes in /usr/libexec. Some of these processes have executables with the same name placed in another directory, like /Library/Developer/CoreSimulator/Volumes/iOS_21A328/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 17.0.simruntime/Contents/Resources/RuntimeRoot/usr/libexec/mobileassetd for which it succeeds, while for /usr/libexec/mobileassetd it fails. Occasionally, both the secure and the insecure methods fail and in these cases the secure one returns status code 100003, which is defined as kPOSIXErrorESRCH = 100003, /* No such process */. When can this happen? This seems to happen with both NEFilterFlow.sourceAppAuditToken and sourceProcessAuditToken. What is the problem?
10
0
1.4k
Oct ’23
App Intent title and other localized strings not showing correctly in Shortcuts app on macOS 15
I rarely use the Shortcuts app, so it took me a while to notice that my app's app intents all show incorrectly on macOS 15. On macOS 14 and 13, they used to show correctly, but now it seems that all localized strings show the key rather than the localized value. @available(iOS 16.0, macOS 13.0, *) struct MyAppIntent: AppIntent { static let title = LocalizedStringResource("key1", comment: "") static let description = IntentDescription(LocalizedStringResource("key2", comment: "")) ... } In Localizable.xcstrings file I have defined all the strings, for instance I have associated key1 with the value Title, but while the Shortcuts app used to display Title, it now displays key1. Is this a known issue or did something change in macOS 15 that would require me to update something?
10
0
1.2k
Feb ’25
Crash when assigning NSImage to `@objc dynamic var` property
Xcode downloaded a crash report for my app which I don't quite understand. It seems the following line caused the crash: myEntity.image = newImage where myEntity is of type MyEntity: class MyEntity: NSObject, Identifiable { @objc dynamic var image: NSImage! ... } The code is called on the main thread. According to the crash report, thread 0 makes that assignment, and at the same time thread 16 is calling [NSImageView asynchronousPreparation:prepareResultUsingParameters:]. What could cause such a crash? Could I be doing something wrong or is this a bug in macOS? crash.crash
11
0
208
Aug ’25
SceneKit app randomly crashes with EXC_BAD_ACCESS in jet_context::set_fragment_texture
Every now and then my SceneKit game app crashes and I have no idea why. The SCNView has a overlaySKScene, so it might also be SpriteKit's fault. The stack trace is #0 0x0000000241c1470c in jet_context::set_fragment_texture(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, jet_texture*) () #27 0x000000010572fd40 in _pthread_wqthread () Does anyone have an idea where I could start debugging this, without being able to consistently reproduce it?
12
0
1.3k
Nov ’24
Detect and wait until a file has been unzipped to avoid permission errors
In my app the user can select a source folder to be synced with a destination folder. The sync can also happen in response to a change in the source folder detected with FSEventStreamCreate. If the user unzips an archive in the source folder and the sync process begins before the unzip operation has completed, the sync can fail because of a "Permission denied" error. I assume this is related to the posix permissions of the extracted folder being 420 during the unzip operation and (in my case) 511 afterwards. Is there a way to detect than an unzip operation is in progress and wait until it has completed? I thought that using NSFileCoordinator would solve this issue, but unfortunately it's not the case. Since an unzip operation can last any amount of time, it's not ideal to just delay a sync by a fixed number of seconds and let the user deal with any error if the unzip operation takes longer. let openPanel = NSOpenPanel() openPanel.canChooseDirectories = true if openPanel.runModal() == .cancel { return } let url = openPanel.urls[0].appendingPathComponent("extracted", isDirectory: false) var error: NSError? NSFileCoordinator(filePresenter: nil).coordinate(readingItemAt: url, error: &error) { url in do { print(try FileManager.default.attributesOfItem(atPath: url.path).sorted(by: { $0.key.rawValue < $1.key.rawValue }).map({ ($0.key.rawValue, $0.value) })) try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil) } catch { print(error) } } if let error = error { print("file coordinator error:", error) }
13
0
175
Jun ’25
How to create file system snapshots with fs_snapshot_create?
The online documentation for fs_snapshot_create, which is on a website which apparently I'm not allowed to link to on this forum, mentions that some entitlement is necessary, but doesn't specify which one. Searching online I found someone mentioning com.apple.developer.vfs.snapshot, but when adding this to my entitlement file and building my Xcode project, I get the error Provisioning profile "Mac Team Provisioning Profile: com.example.myApp" doesn't include the com.apple.developer.vfs.snapshot entitlement. Searching some more online, I found someone mentioning that one has to request this entitlement from DTS. Is this true? I couldn't find any official documentation. I actually want to make a snapshot of a user-selected directory so that my app can sync it to another volume while avoiding that the user makes changes during the sync process that would make the copy inconsistent. Would fs_snapshot_create be faster than traversing the chosen directory and creating clones of each nested file with filecopy and the flag COPYFILE_CLONE? Although I have the impression that only fs_snapshot_create could make a truly consistent snapshot.
13
0
240
Jul ’25