Instans Tunggal
Membatasi aplikasi Anda agar hanya menjalankan satu instans
Penguncian instans tunggal adalah mekanisme yang mencegah beberapa instans aplikasi Anda berjalan secara bersamaan. Mekanisme ini berguna untuk aplikasi yang dirancang untuk membuka file dari baris perintah atau penjelajah file OS.
Penggunaan
Untuk mengaktifkan fungsi instans tunggal di aplikasi Anda, berikan struct SingleInstanceOptions saat membuat aplikasi:
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(),
},
},
})Struct SingleInstanceOptions memiliki bidang berikut:
-
UniqueID: Pengidentifikasi unik untuk aplikasi Anda. Nilainya sebaiknya berupa string unik, biasanya dalam notasi domain terbalik (misalnya, “com.company.appname”). -
EncryptionKey: Array 32 byte opsional untuk mengenkripsi data yang diteruskan antarinstans menggunakan AES-256-GCM. Jika diberikan sebagai array yang tidak seluruh elemennya nol, semua komunikasi antarinstans akan dienkripsi. -
OnSecondInstanceLaunch: Fungsi callback yang dipanggil saat instans kedua aplikasi Anda diluncurkan. Callback menerima structSecondInstanceDatayang berisi:Args: Argumen baris perintah yang diteruskan ke instans keduaWorkingDir: Direktori kerja instans keduaAdditionalData: Data tambahan apa pun yang diteruskan dari instans kedua (jika diberikan)
-
AdditionalData: Map opsional berisi pasangan kunci-nilai string yang akan diteruskan ke instans pertama saat instans berikutnya diluncurkan
Komunikasi Aman
Untuk mengaktifkan komunikasi aman antarinstans, berikan kunci enkripsi sepanjang 32 byte. Kunci ini harus sama untuk semua instans aplikasi Anda:
// 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 ...
}Pengelolaan Jendela
Saat menangani peluncuran instans kedua, Anda sering kali ingin membawa jendela aplikasi ke depan. Anda dapat melakukannya menggunakan metode Focus() milik jendela. Jika jendela diminimalkan, Anda mungkin perlu memulihkannya terlebih dahulu:
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()
}
},
}Cara kerjanya
Penguncian instans tunggal menggunakan mutex bernama. Nama mutex dibuat dari ID unik yang Anda berikan. Data diteruskan ke instans pertama melalui NSDistributedNotificationCenter
Penguncian instans tunggal menggunakan mutex bernama. Nama mutex dibuat dari ID unik yang Anda berikan. Data diteruskan ke instans pertama melalui jendela bersama menggunakan SendMessage