From beebaf7b68b3749f4a1bc4d916e23906b8c16d7f Mon Sep 17 00:00:00 2001
From: Ariver <ar@MacBook-Air.local>
Date: Wed, 13 May 2026 23:31:23 +0800
Subject: [PATCH] Release TagLauncher 5.6.0

---
 Apptag/ApptagApp.swift |   43 ++++++++++++++++++++++++++++++-------------
 1 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/Apptag/ApptagApp.swift b/Apptag/ApptagApp.swift
index ff4466d..76f0549 100644
--- a/Apptag/ApptagApp.swift
+++ b/Apptag/ApptagApp.swift
@@ -94,6 +94,9 @@
     // MARK: - Launch at Login (LaunchAgent, zero permissions)
 
     private static let launchAgentLabel = "com.apptag.launcher"
+    static var supportsLaunchAtLogin: Bool {
+        ProcessInfo.processInfo.environment["APP_SANDBOX_CONTAINER_ID"] == nil
+    }
 
     private static var launchAgentURL: URL {
         FileManager.default.homeDirectoryForCurrentUser
@@ -101,6 +104,7 @@
     }
 
     static func enableLaunchAtLogin() {
+        guard supportsLaunchAtLogin else { return }
         let plist: [String: Any] = [
             "Label": Self.launchAgentLabel,
             "ProgramArguments": ["open", Bundle.main.bundlePath, "--hide"],
@@ -118,6 +122,7 @@
     }
 
     static func disableLaunchAtLogin() {
+        guard supportsLaunchAtLogin else { return }
         let uid = getuid()
         let task = Process()
         task.launchPath = "/bin/launchctl"
@@ -129,6 +134,12 @@
     /// On first launch, enable login item by default via LaunchAgent.
     /// Does NOT require App Management permission.
     private func setupLaunchAtLogin() {
+        guard Self.supportsLaunchAtLogin else {
+            if UserDefaults.standard.object(forKey: "launchAtLogin") == nil {
+                UserDefaults.standard.set(false, forKey: "launchAtLogin")
+            }
+            return
+        }
         let key = "launchAtLogin"
         if UserDefaults.standard.object(forKey: key) == nil {
             UserDefaults.standard.set(true, forKey: key)
@@ -577,6 +588,7 @@
                 try TagDatabase.exportTo(url)
             } catch {
                 fputs("[TagLauncher] Export failed: \(error)\n", stderr)
+                showDataAlert(title: tr("settings.exportFailed"), message: error.localizedDescription)
             }
         }
     }
@@ -593,14 +605,17 @@
                 scanApps()
             } catch {
                 fputs("[TagLauncher] Import failed: \(error)\n", stderr)
-                // Show alert on failure
-                let alert = NSAlert()
-                alert.messageText = tr("settings.importFailed")
-                alert.informativeText = error.localizedDescription
-                alert.alertStyle = .warning
-                alert.runModal()
+                showDataAlert(title: tr("settings.importFailed"), message: error.localizedDescription)
             }
         }
+    }
+
+    private func showDataAlert(title: String, message: String) {
+        let alert = NSAlert()
+        alert.messageText = title
+        alert.informativeText = message
+        alert.alertStyle = .warning
+        alert.runModal()
     }
 
     private var appVersion: String {
@@ -635,14 +650,16 @@
             VStack(alignment: .leading, spacing: 0) {
                 // Toggle row — centered as a rectangular block
                 HStack(spacing: 20) {
-                    Toggle(tr("settings.launchAtLogin"), isOn: $launchAtLogin)
-                        .onChange(of: launchAtLogin) { _, enabled in
-                            if enabled {
-                                AppDelegate.enableLaunchAtLogin()
-                            } else {
-                                AppDelegate.disableLaunchAtLogin()
+                    if AppDelegate.supportsLaunchAtLogin {
+                        Toggle(tr("settings.launchAtLogin"), isOn: $launchAtLogin)
+                            .onChange(of: launchAtLogin) { _, enabled in
+                                if enabled {
+                                    AppDelegate.enableLaunchAtLogin()
+                                } else {
+                                    AppDelegate.disableLaunchAtLogin()
+                                }
                             }
-                        }
+                    }
                     Toggle(tr("settings.showInDock"), isOn: $showDockIcon)
                     Toggle(tr("settings.hideAppNames"), isOn: $hideAppNames)
                 }

--
Gitblit v1.9.3