cf19ca2d34
根因:launch_at_startup 0.5.1 在 macOS 无自带实现,需宿主接 MethodChannel,而我们 Runner 从没实现 → enable() 抛 MissingPluginException 被 try/catch 吞掉 → 登录项从未注册,自启失败。 学 Tailscale(LoginItemHelper-macsys + SMAppService): - 新增无界面 LoginItem helper(macos/login_helper,LSBackgroundOnly),登录时带 --autostart 拉起主 app(→隐藏到托盘); - build_login_helper.sh 构建期编译+签名+嵌入 Contents/Library/LoginItems/(新 Run Script 阶段); - MainFlutterWindow 接 launch_at_startup MethodChannel → SMAppService.loginItem 注册/注销。 构建通过:helper 嵌入+签名,主 app --deep --strict 校验过。Windows 自启(schtasks)不变。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
50 lines
2.1 KiB
Bash
Executable File
50 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# build_login_helper.sh — Xcode 构建阶段:编译 + 打包 + 签名 PangolinLoginHelper,
|
|
# 嵌入主 app 的 Contents/Library/LoginItems/(供 SMAppService.loginItem 注册)。
|
|
# 学 Tailscale 的 LoginItemHelper-macsys。须在主 app 最终签名前运行(即作为 Runner 的构建阶段)。
|
|
set -euo pipefail
|
|
|
|
HELPER_NAME="PangolinLoginHelper"
|
|
HELPER_ID="com.pangolin.pangolin.LoginHelper"
|
|
SRC="${SRCROOT}/login_helper/main.swift"
|
|
DEST="${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems/${HELPER_NAME}.app"
|
|
WORK="${DERIVED_FILE_DIR}/login_helper"
|
|
SDK="$(xcrun --sdk macosx --show-sdk-path)"
|
|
|
|
rm -rf "${DEST}"
|
|
mkdir -p "${WORK}" "${DEST}/Contents/MacOS"
|
|
|
|
# 按 ARCHS 逐架构编译,多架构则 lipo 成 universal。
|
|
BIN="${DEST}/Contents/MacOS/${HELPER_NAME}"
|
|
SLICES=()
|
|
for arch in ${ARCHS}; do
|
|
out="${WORK}/${HELPER_NAME}-${arch}"
|
|
swiftc -O -sdk "${SDK}" -target "${arch}-apple-macos13.0" "${SRC}" -o "${out}"
|
|
SLICES+=("${out}")
|
|
done
|
|
if [ "${#SLICES[@]}" -gt 1 ]; then
|
|
lipo -create "${SLICES[@]}" -output "${BIN}"
|
|
else
|
|
cp "${SLICES[0]}" "${BIN}"
|
|
fi
|
|
|
|
# Info.plist:LSBackgroundOnly(无界面/无 Dock)+ helper bundle ID。
|
|
cat > "${DEST}/Contents/Info.plist" <<PLIST
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0"><dict>
|
|
<key>CFBundleExecutable</key><string>${HELPER_NAME}</string>
|
|
<key>CFBundleIdentifier</key><string>${HELPER_ID}</string>
|
|
<key>CFBundleName</key><string>${HELPER_NAME}</string>
|
|
<key>CFBundlePackageType</key><string>APPL</string>
|
|
<key>CFBundleShortVersionString</key><string>1.0</string>
|
|
<key>CFBundleVersion</key><string>1</string>
|
|
<key>LSBackgroundOnly</key><true/>
|
|
<key>LSMinimumSystemVersion</key><string>13.0</string>
|
|
</dict></plist>
|
|
PLIST
|
|
|
|
# 与主 app 同身份签名(hardened runtime);时间戳跟随构建环境(可达即打,否则由外层流程决定)。
|
|
codesign --force --options runtime --timestamp -s "${EXPANDED_CODE_SIGN_IDENTITY}" "${DEST}"
|
|
echo "embedded + signed login helper → ${DEST}"
|