From 354b0fb59e87b1505314092230ced107bec5cf77 Mon Sep 17 00:00:00 2001 From: Qiu Yuzhou Date: Sat, 26 Sep 2026 23:04:26 +0800 Subject: [PATCH] fix(agent): correct LaunchAgent ProgramArguments path for SMAppService SMAppService resolves ProgramArguments relative to the app bundle's Contents/ directory, not the bundle root. The plist used Contents/MacOS/ShadowsocksX-NG2Agent which resolved to a nonexistent Contents/Contents/MacOS/... path, causing launchd to report EX_CONFIG / spawn failed and the wrapper never started. Change to MacOS/ShadowsocksX-NG2Agent so launchd finds the binary. --- ShadowsocksX-NG2/App/LaunchAgentService.swift | 3 ++- .../LaunchAgent/com.qiuyuzhou.ShadowsocksX-NG2.agent.plist | 2 +- ShadowsocksX-NG2/project.yml | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ShadowsocksX-NG2/App/LaunchAgentService.swift b/ShadowsocksX-NG2/App/LaunchAgentService.swift index 4d2fe690..81756033 100644 --- a/ShadowsocksX-NG2/App/LaunchAgentService.swift +++ b/ShadowsocksX-NG2/App/LaunchAgentService.swift @@ -10,7 +10,8 @@ protocol LaunchAgentControlling { } /// 生产实现:plist 必须位于 app bundle `Contents/Library/LaunchAgents/`, -/// ProgramArguments 为 bundle 相对路径(launchd 按注册 app 的 bundle 解析)。 +/// ProgramArguments 为 Contents/ 相对路径(launchd 按注册 app 的 Contents/ +/// 解析)。 struct SMAppLaunchAgentService: LaunchAgentControlling { static let plistName = "com.qiuyuzhou.ShadowsocksX-NG2.agent.plist" diff --git a/ShadowsocksX-NG2/LaunchAgent/com.qiuyuzhou.ShadowsocksX-NG2.agent.plist b/ShadowsocksX-NG2/LaunchAgent/com.qiuyuzhou.ShadowsocksX-NG2.agent.plist index 746b222b..8c54a042 100644 --- a/ShadowsocksX-NG2/LaunchAgent/com.qiuyuzhou.ShadowsocksX-NG2.agent.plist +++ b/ShadowsocksX-NG2/LaunchAgent/com.qiuyuzhou.ShadowsocksX-NG2.agent.plist @@ -11,7 +11,7 @@ com.qiuyuzhou.ShadowsocksX-NG2.agent ProgramArguments - Contents/MacOS/ShadowsocksX-NG2Agent + MacOS/ShadowsocksX-NG2Agent ThrottleInterval 2 diff --git a/ShadowsocksX-NG2/project.yml b/ShadowsocksX-NG2/project.yml index 2bab6ac2..60a5d4d0 100644 --- a/ShadowsocksX-NG2/project.yml +++ b/ShadowsocksX-NG2/project.yml @@ -24,8 +24,8 @@ targets: # 领域核心:配置目录树、凭据引用与持久化(spec #21 D3/D5) - path: Domain # LaunchAgent 注册清单:SMAppService.agent(plistName:) 从 bundle 内 - # Contents/Library/LaunchAgents/ 读取;ProgramArguments 用 bundle 相对路径 - # (spec #21 D2,issue #27)。 + # Contents/Library/LaunchAgents/ 读取;ProgramArguments 用 Contents/ + # 相对路径(launchd 按注册 app 的 Contents/ 解析,spec #21 D2,issue #27)。 - path: LaunchAgent/com.qiuyuzhou.ShadowsocksX-NG2.agent.plist buildPhase: copyFiles: @@ -97,7 +97,7 @@ targets: - ShadowsocksX-NG2Tests dependencies: # 代理运行时 wrapper(BundleProgram,spec #21 D2):以独立可执行文件装入 - # Contents/MacOS,由 LaunchAgent plist 以 bundle 相对路径引用。 + # Contents/MacOS,由 LaunchAgent plist 以 Contents/ 相对路径引用。 - target: ShadowsocksX-NG2Agent copy: destination: wrapper