Single Instance
Single instance locking adalah mekanisme yang mencegah beberapa instance aplikasi Anda berjalan bersamaan. Fitur ini berguna untuk aplikasi yang dirancang untuk membuka file dari command line atau dari file explorer OS.
Penggunaan
Section titled “Penggunaan”Untuk mengaktifkan fungsionalitas single instance 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 field berikut:
UniqueID: Pengidentifikasi unik untuk aplikasi Anda. Ini harus berupa string unik, biasanya dalam notasi reverse domain (misalnya, “com.company.appname”).EncryptionKey: Array 32-byte opsional untuk mengenkripsi data yang diteruskan antar instance menggunakan AES-256-GCM. Jika disediakan sebagai array non-zero, semua komunikasi antar instance akan dienkripsi.OnSecondInstanceLaunch: Fungsi callback yang dipanggil ketika instance kedua aplikasi Anda diluncurkan. Callback menerima structSecondInstanceDatayang berisi:Args: Argumen command line yang diteruskan ke instance keduaWorkingDir: Working directory instance keduaAdditionalData: Data tambahan apa pun yang diteruskan dari instance kedua (jika disediakan)
AdditionalData: Map opsional pasangan key-value string yang akan diteruskan ke instance pertama ketika instance berikutnya diluncurkan
Komunikasi Aman
Section titled “Komunikasi Aman”Untuk mengaktifkan komunikasi aman antar instance, berikan encryption key 32-byte. Key ini harus sama untuk semua instance 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 SingleInstanceOptionsSingleInstance: &application.SingleInstanceOptions{ UniqueID: "com.myapp.unique-id", // Enable encryption for instance communication EncryptionKey: encryptionKey, // ... other options ...}Manajemen Window
Section titled “Manajemen Window”Ketika menangani peluncuran instance kedua, Anda sering ingin membawa window aplikasi ke depan. Anda dapat melakukannya menggunakan method Focus() pada window. Jika window Anda 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
Section titled “Cara kerjanya”Single instance lock menggunakan named mutex. Nama mutex dihasilkan dari unique id yang Anda berikan. Data diteruskan ke instance pertama melalui NSDistributedNotificationCenter
Single instance lock menggunakan named mutex. Nama mutex dihasilkan dari unique id yang Anda berikan. Data diteruskan ke instance pertama melalui shared window menggunakan SendMessage
Single instance lock menggunakan dbus. Nama dbus dihasilkan dari unique id yang Anda berikan. Data diteruskan ke instance pertama melalui dbus