Contribuer

Modifier cette documentation

Traduisez la documentation ou ouvrez le projet complet sur votre ordinateur.

Rien n’est publié tant que vous ne choisissez pas de soumettre votre travail.

Instance unique

Limiter votre application à une seule instance en cours d’exécution

Le verrouillage d’instance unique est un mécanisme qui empêche l’exécution simultanée de plusieurs instances de votre application. Il est utile pour les applications conçues pour ouvrir des fichiers depuis la ligne de commande ou l’explorateur de fichiers du système d’exploitation.

Utilisation

Pour activer la fonctionnalité d’instance unique dans votre application, fournissez une structure SingleInstanceOptions lors de sa création :

go
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(),
        },
    },
})

La structure SingleInstanceOptions comporte les champs suivants :

  • UniqueID : identifiant unique de votre application. Il devrait s’agir d’une chaîne unique, généralement au format de nom de domaine inversé (par exemple, “com.company.appname”).

  • EncryptionKey : tableau facultatif de 32 octets permettant de chiffrer avec AES-256-GCM les données transmises entre les instances. Si vous fournissez un tableau non nul, toutes les communications entre les instances seront chiffrées.

  • OnSecondInstanceLaunch : fonction de rappel appelée lorsqu’une deuxième instance de votre application est lancée. Cette fonction reçoit une structure SecondInstanceData contenant :

    • Args : les arguments de ligne de commande transmis à la deuxième instance
    • WorkingDir : le répertoire de travail de la deuxième instance
    • AdditionalData : toute donnée supplémentaire transmise par la deuxième instance (si elle est fournie)
  • AdditionalData : table de paires clé-valeur de chaînes facultative, transmise à la première instance lors du lancement d’instances ultérieures

Communication sécurisée

Pour sécuriser la communication entre les instances, fournissez une clé de chiffrement de 32 octets. Cette clé doit être identique pour toutes les instances de votre application :

go
// 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 ...
}

Gestion des fenêtres

Lorsque vous gérez le lancement d’une deuxième instance, vous souhaiterez souvent ramener la fenêtre de votre application au premier plan. Pour ce faire, utilisez la méthode Focus() de la fenêtre. Si celle-ci est réduite, vous devrez peut-être d’abord la restaurer :

go

    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()
            }
        },
    }

Fonctionnement

Le verrouillage d’instance unique utilise un mutex nommé. Le nom du mutex est généré à partir de l’identifiant unique que vous fournissez. Les données sont transmises à la première instance via NSDistributedNotificationCenter.

Modifier la page

Dernière mise à jour :