Skip to content

自更新应用识别

Electron 应用识别

AppPorts 通过以下三个检测条件识别 Electron 应用(按优先级依次检查,短路求值):

#检测项路径 / 模式
1Electron FrameworkContents/Frameworks/Electron Framework.framework 目录存在
2Electron Helper 变体Contents/Frameworks/ 下存在名称包含 Electron Helper 的条目
3Info.plist 标识键Contents/Info.plist 中存在 ElectronDefaultAppelectron

Electron 自更新检测

额外检查是否存在 Contents/Resources/app-update.yml 文件(electron-updater 的配置文件),若存在则标记该 Electron 应用具有自更新能力。

Sparkle 应用识别

AppPorts 通过以下三个检测条件识别 Sparkle 应用:

#检测项路径 / 模式
1Sparkle 框架Contents/Frameworks/Sparkle.frameworkContents/Frameworks/Squirrel.framework 存在
2更新器二进制文件Contents/MacOS/Contents/Frameworks/ 下存在匹配 shipitautoupdateupdaterupdate 的文件
3Info.plist Sparkle 键Contents/Info.plist 中存在以下任一键:SUFeedURLSUPublicDSAKeyFileSUPublicEDKeySUScheduledCheckIntervalSUAllowsAutomaticUpdates

⚠️ Electron 应用的特殊处理

当应用已被识别为 Electron 应用时,检测条件 #2(更新器二进制文件)会被跳过,以避免 electron-updaterupdater 二进制文件导致误判为 Sparkle 应用。

混合 Electron + Sparkle 应用

部分应用同时包含 Electron 框架和 Sparkle 更新器。AppPorts 对两个标志独立检测,允许 isElectronisSparkle 同时为 true

检测逻辑

text
isElectron = 满足 Electron 三个检测条件之一
isSparkle  = 满足 Sparkle 三个检测条件之一(Electron 应用跳过条件 #2)

两个标志互不影响,可同时成立。

迁移后行为

属性判定条件
hasSelfUpdaterisSparkle 或 (isElectron 且存在 app-update.yml) 或 存在自定义更新器
needsLockisSparkle 或 (isElectron 且存在 app-update.yml)

needsLocktrue 时,AppPorts 在迁移完成后对外部存储上的应用执行 chflags -R uchg(设置不可变标志),防止自更新程序删除或修改外部副本。

自定义更新器检测

对于非 Sparkle、非 Electron 的原生自更新应用(如 Chrome、Edge、Parallels),AppPorts 通过以下模式识别:

检测路径匹配模式典型应用
Contents/Library/LaunchServices/文件名包含 updateChrome、Edge、Thunderbird
Contents/MacOS/二进制文件名包含 updateupgrade(排除 electronParallels、Thunderbird
Contents/SharedSupport/文件名包含 updateWPS Office
Contents/Info.plist存在 KSProductIDGoogle Keystone(Chrome)

遗留策略识别

在还原或解除链接时,AppPorts 需要识别旧版本创建的遗留入口:

本地结构特征识别为
根路径为符号链接wholeAppSymlink
Contents/ 为符号链接deepContentsWrapper
Contents/Info.plist 为符号链接wholeAppSymlink(遗留 Sparkle 混合方案)
Contents/Frameworks/ 为符号链接wholeAppSymlink(遗留 Electron 混合方案)
Contents/MacOS/launcher 存在stubPortal
以上均不匹配非 AppPorts 管理的应用
最近更新