シングルインスタンス
アプリの実行中のインスタンスを1つに制限する
シングルインスタンスロックは、アプリの複数のインスタンスが同時に実行されるのを防ぐ仕組みです。 コマンドラインやOSのファイルエクスプローラーからファイルを開くように設計されたアプリに役立ちます。
使用方法
アプリでシングルインスタンス機能を有効にするには、アプリケーションの作成時に SingleInstanceOptions 構造体を指定します。
app := application.New(application.Options{
// ... other options ...
SingleInstance: &application.SingleInstanceOptions{
UniqueID: "com.myapp.unique-id",
OnSecondInstanceLaunch: func(data application.SecondInstanceData) {
log.Printf("Second instance launched with args: %v", data.Args)
log.Printf("Working directory: %s", data.WorkingDir)
log.Printf("Additional data: %v", data.AdditionalData)
},
// Optional: Pass additional data to second instance
AdditionalData: map[string]string{
"launchtime": time.Now().String(),
},
},
})SingleInstanceOptions 構造体には、次のフィールドがあります。
-
UniqueID:アプリケーションの一意の識別子です。一意の文字列を指定してください。通常は逆ドメイン表記を使用します(例:“com.company.appname”)。 -
EncryptionKey:AES-256-GCMを使用してインスタンス間で渡されるデータを暗号化するための、省略可能な 32 バイト配列です。ゼロ以外の配列を指定すると、インスタンス間のすべての通信が暗号化されます。 -
OnSecondInstanceLaunch:アプリの2つ目のインスタンスが起動されたときに呼び出されるコールバック関数です。このコールバックは、次の情報を含むSecondInstanceData構造体を受け取ります。Args:2つ目のインスタンスに渡されたコマンドライン引数WorkingDir:2つ目のインスタンスの作業ディレクトリAdditionalData:2つ目のインスタンスから渡された追加データ(指定されている場合)
-
AdditionalData:後続のインスタンスが起動されたときに最初のインスタンスへ渡される、文字列のキーと値のペアからなる省略可能なマップ
セキュアな通信
インスタンス間のセキュアな通信を有効にするには、32 バイトの暗号化キーを指定します。このキーは、アプリケーションのすべてのインスタンスで同一でなければなりません。
// Define your encryption key (must be exactly 32 bytes)
var encryptionKey = [32]byte{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
}
// Use the key in SingleInstanceOptions
SingleInstance: &application.SingleInstanceOptions{
UniqueID: "com.myapp.unique-id",
// Enable encryption for instance communication
EncryptionKey: encryptionKey,
// ... other options ...
}ウィンドウ管理
2つ目のインスタンスの起動を処理する際は、アプリケーションウィンドウを最前面に表示したいことがよくあります。これには、ウィンドウの Focus() メソッドを使用できます。ウィンドウが最小化されている場合は、先に元の状態に戻す必要があるかもしれません:
var mainWindow *application.WebviewWindow
SingleInstance: &application.SingleInstanceOptions{
// Other options...
OnSecondInstanceLaunch: func(data application.SecondInstanceData) {
// Focus the window if needed
if mainWindow != nil {
mainWindow.Restore()
mainWindow.Focus()
}
},
}仕組み
名前付きミューテックスを使用してシングルインスタンスをロックします。ミューテックス名は、指定した一意のIDから生成されます。データは NSDistributedNotificationCenter を介して最初のインスタンスに渡されます。
名前付きミューテックスを使用してシングルインスタンスをロックします。ミューテックス名は、指定した一意のIDから生成されます。データは、SendMessage を使用する共有ウィンドウを介して最初のインスタンスに渡されます。