Единственный экземпляр
Ограничение приложения одним запущенным экземпляром
Блокировка единственного экземпляра — это механизм, который предотвращает одновременный запуск нескольких экземпляров приложения. Он полезен для приложений, предназначенных для открытия файлов из командной строки или файлового менеджера ОС.
Использование
Чтобы включить поддержку единственного экземпляра в приложении, передайте структуру 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: необязательный массив из 32 байт для шифрования передаваемых между экземплярами данных с помощью AES-256-GCM. Если передан массив, в котором хотя бы один байт отличен от нуля, весь обмен данными между экземплярами будет зашифрован. -
OnSecondInstanceLaunch: функция обратного вызова, которая вызывается при запуске второго экземпляра приложения. Она получает структуруSecondInstanceData, содержащую:Args: аргументы командной строки, переданные второму экземпляруWorkingDir: рабочий каталог второго экземпляраAdditionalData: дополнительные данные, переданные из второго экземпляра (если они указаны)
-
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 ...
}Управление окном
При обработке запуска второго экземпляра часто требуется вывести окно приложения на передний план. Для этого можно использовать метод окна 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()
}
},
}Принцип работы
Для блокировки единственного экземпляра используется именованный мьютекс. Имя мьютекса формируется на основе указанного вами уникального идентификатора. Данные передаются первому экземпляру через NSDistributedNotificationCenter
Для блокировки единственного экземпляра используется именованный мьютекс. Имя мьютекса формируется на основе указанного вами уникального идентификатора. Данные передаются первому экземпляру через общее окно с помощью SendMessage