diff --git a/CHANGELOG.md b/CHANGELOG.md
index f9820ef9..5747c43b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [2.1.2] - 2026-05-07
+Requires macOS 12.0 and higher.
+
+### Fixed
+- Corrected activation logic when requiredInstallationDate is passed
+ - Addresses [704](https://github.com/macadmins/nudge/issues/704)
+ - **Important Note:** macOS 14 introduced `NSApp.activate()` as a replacement for `NSApp.activate(ignoringOtherApps: true)`, but the new API uses _cooperative_ _activation_ — it only gains focus if the current frontmost app _voluntarily_ _yields_. Chrome (and any other app) never does this, so Nudge ends up sitting just behind it. When Apple removes this API in a future macOS version, Nudge may not be able to gaurantee it launches in front of all applications.
+- Added more logic in counting of CVEs
+ - Potentially Addresses [703](https://github.com/macadmins/nudge/issues/703), a continuation of [650](https://github.com/macadmins/nudge/issues/650)
+
## [2.1.2] - 2026-03-30
Requires macOS 12.0 and higher.
diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj
index 152f2f69..1bead105 100644
--- a/Nudge.xcodeproj/project.pbxproj
+++ b/Nudge.xcodeproj/project.pbxproj
@@ -737,7 +737,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.0;
- MARKETING_VERSION = 2.1.2;
+ MARKETING_VERSION = 2.1.3;
PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.Nudge;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/Nudge/Info.plist b/Nudge/Info.plist
index 13187c79..e2e82a70 100644
--- a/Nudge/Info.plist
+++ b/Nudge/Info.plist
@@ -15,9 +15,9 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 2.1.2
+ 2.1.3
CFBundleVersion
- 2.1.2
+ 2.1.3
LSApplicationCategoryType
public.app-category.utilities
LSMinimumSystemVersion
diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift
index 73e9e83f..dbd18814 100644
--- a/Nudge/UI/Main.swift
+++ b/Nudge/UI/Main.swift
@@ -317,18 +317,22 @@ class AppDelegate: NSObject, NSApplicationDelegate {
LogManager.notice("Assessing macOS version range for active exploits (cross major version): \(versionsToCheck) ", logger: sofaLog)
}
- // Count actively exploited CVEs in the appropriate filtered versions
+ // Count CVEs in the appropriate filtered versions
+ var totalAnyCVEsInRange = 0
for osVersion in macOSSOFAAssets {
if versionsToCheck.contains(osVersion.latest.productVersion) {
totalActivelyExploitedCVEs += osVersion.latest.activelyExploitedCVEs.count
+ totalAnyCVEsInRange += osVersion.latest.cves.count
}
for securityRelease in osVersion.securityReleases {
if versionsToCheck.contains(securityRelease.productVersion) {
totalActivelyExploitedCVEs += securityRelease.activelyExploitedCVEs.count
+ totalAnyCVEsInRange += securityRelease.cves.count
}
}
}
let activelyExploitedCVEs = totalActivelyExploitedCVEs > 0
+ let anyCVEsInRange = totalAnyCVEsInRange > 0
let presentCVEs = selectedOS!.cves.count > 0
let slaExtension: TimeInterval
@@ -367,10 +371,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {
// Check if we should disable Nudge for standard installs
// Exit only if:
// 1. disableNudgeForStandardInstalls is enabled
- // 2. Target OS has no CVEs
- // 3. No actively exploited CVEs exist in intermediate versions (respects minorVersionRecalculationThreshold)
- if OptionalFeatureVariables.disableNudgeForStandardInstalls && !presentCVEs && !activelyExploitedCVEs {
- LogManager.notice("No known CVEs for \(selectedOS!.productVersion), no actively exploited CVEs in intermediate versions, and disableNudgeForStandardInstalls is set to true", logger: sofaLog)
+ // 2. No CVEs exist anywhere in the update path (including non-actively exploited CVEs in intermediate versions)
+ if OptionalFeatureVariables.disableNudgeForStandardInstalls && !anyCVEsInRange {
+ LogManager.notice("No known CVEs in version range up to \(selectedOS!.productVersion), and disableNudgeForStandardInstalls is set to true", logger: sofaLog)
AppStateManager().exitNudge()
}
LogManager.notice("SOFA Actively Exploited CVEs (across version range): \(activelyExploitedCVEs)", logger: sofaLog)
diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift
index 698d1d0d..70255109 100644
--- a/Nudge/Utilities/Utils.swift
+++ b/Nudge/Utilities/Utils.swift
@@ -38,7 +38,8 @@ struct BlurManager {
// Force window to front regardless of space constraints
// This will trigger a space switch if needed
if #available(macOS 14, *) {
- NSApp.activate()
+ // NSApp.activate() co-operative API that doesn't allow Nudge to properly activate
+ NSApp.activate(ignoringOtherApps: true)
} else {
NSApp.activate(ignoringOtherApps: true)
}
@@ -129,7 +130,8 @@ struct BlurManager {
// Ensure main window stays on top and visible
mainWindow.makeKeyAndOrderFront(nil)
if #available(macOS 14, *) {
- NSApp.activate()
+ // NSApp.activate() co-operative API that doesn't allow Nudge to properly activate
+ NSApp.activate(ignoringOtherApps: true)
} else {
NSApp.activate(ignoringOtherApps: true)
}
@@ -164,7 +166,8 @@ struct AppStateManager {
if DateManager().pastRequiredInstallationDate() && OptionalFeatureVariables.aggressiveUserFullScreenExperience {
UIUtilities().centerNudge()
if #available(macOS 14, *) {
- NSApp.activate()
+ // NSApp.activate() co-operative API that doesn't allow Nudge to properly activate
+ NSApp.activate(ignoringOtherApps: true)
} else {
NSApp.activate(ignoringOtherApps: true)
}
@@ -177,7 +180,8 @@ struct AppStateManager {
LogManager.notice("Bypassing activation due to full screen bugs in macOS", logger: uiLog)
} else {
if #available(macOS 14, *) {
- NSApp.activate()
+ // NSApp.activate() co-operative API that doesn't allow Nudge to properly activate
+ NSApp.activate(ignoringOtherApps: true)
} else {
NSApp.activate(ignoringOtherApps: true)
}