Einzelinstanz
Beschränken der App auf eine einzige laufende Instanz
Die Einzelinstanzsperre verhindert, dass mehrere Instanzen Ihrer App gleichzeitig ausgeführt werden. Sie ist für Apps nützlich, die Dateien über die Befehlszeile oder den Dateimanager des Betriebssystems öffnen sollen.
Verwendung
Um die Einzelinstanzfunktion in Ihrer App zu aktivieren, übergeben Sie beim Erstellen Ihrer Anwendung eine SingleInstanceOptions-Struktur:
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(),
},
},
})Die SingleInstanceOptions-Struktur enthält die folgenden Felder:
-
UniqueID: Eine eindeutige Kennung für Ihre Anwendung. Dies sollte eine eindeutige Zeichenfolge sein, üblicherweise in umgekehrter Domainnotation (z. B. „com.company.appname“). -
EncryptionKey: Optionales 32-Byte-Array zum Verschlüsseln der zwischen Instanzen übertragenen Daten mit AES-256-GCM. Wenn Sie ein Array angeben, das nicht ausschließlich Nullwerte enthält, wird die gesamte Kommunikation zwischen den Instanzen verschlüsselt. -
OnSecondInstanceLaunch: Eine Callback-Funktion, die beim Starten einer zweiten Instanz Ihrer App aufgerufen wird. Der Callback erhält eineSecondInstanceData-Struktur mit folgenden Daten:Args: Die an die zweite Instanz übergebenen BefehlszeilenargumenteWorkingDir: Das Arbeitsverzeichnis der zweiten InstanzAdditionalData: Alle zusätzlichen Daten, die von der zweiten Instanz übergeben wurden (sofern vorhanden)
-
AdditionalData: Optionale Map mit Schlüssel-Wert-Paaren aus Zeichenfolgen, die beim Starten weiterer Instanzen an die erste Instanz übergeben wird
Sichere Kommunikation
Um die sichere Kommunikation zwischen Instanzen zu aktivieren, geben Sie einen 32 Byte langen Verschlüsselungsschlüssel an. Dieser Schlüssel muss für alle Instanzen Ihrer Anwendung identisch sein:
// 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 ...
}Fensterverwaltung
Beim Verarbeiten des Starts einer zweiten Instanz möchten Sie das Anwendungsfenster häufig in den Vordergrund holen. Verwenden Sie dazu die Methode Focus() des Fensters. Wenn Ihr Fenster minimiert ist, müssen Sie es möglicherweise zuerst wiederherstellen:
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()
}
},
}Funktionsweise
Die Einzelinstanzsperre verwendet einen benannten Mutex. Der Mutexname wird aus der von Ihnen angegebenen eindeutigen ID erzeugt. Die Daten werden über NSDistributedNotificationCenter an die erste Instanz übergeben.
Die Einzelinstanzsperre verwendet einen benannten Mutex. Der Mutexname wird aus der von Ihnen angegebenen eindeutigen ID erzeugt. Die Daten werden über ein gemeinsam verwendetes Fenster mithilfe von SendMessage an die erste Instanz übergeben.