refactor: Use UNUserNotificationCenter instead of NSUserNotificationCenter, fixes sound on macOS 14+#322
Open
billdaws wants to merge 6 commits intojulienXX:masterfrom
Open
Conversation
NSUserNotification and NSUserNotificationCenter were deprecated in macOS 11 and removed entirely in macOS 14 (Sonoma), breaking all notification delivery including the -sound option on modern systems. Migrates to the UserNotifications framework (UNUserNotificationCenter), which is the supported API from macOS 10.14 onwards. Raises the minimum deployment target from 10.10 to 10.14 accordingly. Changes: - Fix -sound: now uses UNNotificationSound defaultSound/soundNamed: - -group now uses UNNotificationRequest identifiers for deduplication - -remove and -list use async UNUserNotificationCenter equivalents - -contentImage uses UNNotificationAttachment (local files only) - -ignoreDnD uses interruptionLevel .timeSensitive on macOS 12+ - Notification permission is requested via requestAuthorizationWithOptions: - applicationWillFinishLaunching: sets delegate early to handle click-launched activations before applicationDidFinishLaunching: runs Dropped features (no public API equivalent in UNUserNotificationCenter): - -sender: bundle identifier spoofing via NSBundle swizzle no longer has any effect; emits a warning and continues - -appIcon: _identityImage was a private NSUserNotification API with no UNUserNotificationCenter equivalent; emits a warning and continues Bumps version to 3.0.0.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
... Also some minor fixes/cleanups.
Hello, and thank you for the excellent project.
NSUserNotificationCenterwas deprecated in macOS 11 and broke sound playback on macOS 14+.Disclaimer: I know very little about Objective C and macOS application development. Just took a crack at fixing this for my personal use and thought I should upstream it. Could easily be missing some conventions -- if so, happy to update.
Changes
Core migration (
AppDelegate.m,AppDelegate.h,project.pbxproj)NSUserNotificationCenterwithUNUserNotificationCenterthroughoutUserNotifications.frameworklinkage; raisedMACOSX_DEPLOYMENT_TARGETfrom 10.10 -> 10.14 (the minimum required byUNUserNotificationCenter)NSBundle (FakeBundleIdentifier)method-swizzling category andInstallFakeBundleIdentifierHook()- no longer neededrequestAuthorizationWithOptions:before delivering a notificationUNMutableNotificationContent; sound is set viaUNNotificationSound, fixing playback on macOS 14+UNNotificationAttachment(local files only - remote URLs are not supported by this API)-ignoreDnD) usesUNNotificationInterruptionLevelTimeSensitive, available on macOS 12+UNUserNotificationCenterDelegate(didReceiveNotificationResponse:) rather than a launch-time notification keyapplicationWillFinishLaunching:sets the delegate early so click responses are received beforeapplicationDidFinishLaunching:runsRemoved options
-sender: not supported byUNUserNotificationCenter; removed from help and codeUNUser...uses the bundle ID for notification permissions, so the swizzling that was in use here can't really be maintained without likely breaking authn/z. Since-senderonly worked because of that, I dropped it here.-appIcon: not supported byUNUserNotificationCenter; removed from help and codeUNUser..., and it seems to have only worked because of the same bundle swizzling, so I dropped it.Ignoring Do Not Disturb
-ignoreDnDdoesn't really work as expected in my testing. This project would need entitlements forcom.apple.developer.usernotifications.time-sensitive. That requires a paid Apple dev account, which I don't have. I'm not sure if anyone else can test it, but I'm happy to iterate if they do, and it doesn't work.Housekeeping
initializeUserDefaultsclass methoddecodeFragmentInURL:fragment:methodexecuteShellCommand:to use non-deprecatedNSTaskAPI (executableURL,launchAndReturnError:)[NSData dataWithData:]wrapping stdin read/System/Library/Sounds)Testing
Tested manually on macOS 15.5 (Sequoia).
Built with
xcodebuild(Release configuration), copied the resulting.appto/Applications/(for permissions' sake), and ran:The notification appeared and the default sound played. Worth noting that alert sounds needed to be enabled, and notifications from my terminal permitted, etc.
Tested with some other sounds and they worked.
-contentImage,-title, and-subtitlealso work. Didn't test all combinations of flags.Happy to record a video if it helps.