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 管理的應用
最近更新