Skip to content

自動更新検出

Electron アプリ検出

AppPorts は、以下の3つの検出条件(優先度順にチェック、ショートサーキット評価)を通じて Electron アプリを識別します:

#検出項目パス / パターン
1Electron フレームワークContents/Frameworks/Electron Framework.framework ディレクトリが存在する
2Electron Helper バリアントContents/Frameworks/ 以下に Electron Helper を含むエントリが存在する
3Info.plist 識別キーContents/Info.plistElectronDefaultApp または electron キーが存在する

Electron 自動更新検出

さらに、Contents/Resources/app-update.yml ファイル(electron-updater の設定ファイル)の存在をチェックします。存在する場合、その Electron アプリは自動更新機能を持つとマークされます。

Sparkle アプリ検出

AppPorts は、以下の3つの検出条件を通じて Sparkle アプリを識別します:

#検出項目パス / パターン
1Sparkle フレームワークContents/Frameworks/Sparkle.framework または Contents/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 = 3つの Electron 検出条件のいずれかを満たす
isSparkle  = 3つの Sparkle 検出条件のいずれかを満たす(Electron アプリは条件 #2 をスキップ)

2つのフラグは独立しており、同時に true になることができます。

移行後の動作

属性判定条件
hasSelfUpdaterisSparkle または(isElectron かつ app-update.yml が存在)またはカスタムアップデーターが存在
needsLockisSparkle または(isElectron かつ app-update.yml が存在)

needsLocktrue の場合、AppPorts は移行完了後に外部ストレージアプリに対して chflags -R uchg(イミュータブルフラグの設定)を実行し、自動更新プログラムが外部コピーを削除または変更するのを防止します。

カスタムアップデーター検出

Sparkle でも Electron でもないネイティブ自動更新アプリ(例:Chrome、Edge、Parallels)について、AppPorts は以下のパターンを通じて識別します:

検出パスマッチングパターン代表的なアプリ
Contents/Library/LaunchServices/ファイル名に update が含まれるChrome、Edge、Thunderbird
Contents/MacOS/バイナリファイル名に update または upgrade が含まれる(electron は除外)Parallels、Thunderbird
Contents/SharedSupport/ファイル名に update が含まれるWPS Office
Contents/Info.plistKSProductID キーが存在するGoogle Keystone(Chrome)

レガシー戦略の識別

復元またはリンク解除の際、AppPorts は旧バージョンで作成されたレガシーエントリを識別する必要があります:

ローカル構造の特徴識別結果
ルートパスがシンボリックリンクwholeAppSymlink
Contents/ がシンボリックリンクdeepContentsWrapper
Contents/Info.plist がシンボリックリンクwholeAppSymlink(レガシー Sparkle ハイブリッドスキーム)
Contents/Frameworks/ がシンボリックリンクwholeAppSymlink(レガシー Electron ハイブリッドスキーム)
Contents/MacOS/launcher が存在するstubPortal
上記のいずれにも一致しないAppPorts で管理されていない
最近更新