Domanda

Voglio fare una preferenza per nascondere l'icona del Dock e mostrare un NSStatusItem . Posso creare StatusItem ma non so come rimuovere l'icona dal Dock. : - /

Qualche idea?

È stato utile?

Soluzione

Penso che tu stia cercando il LSUIElement nell'Info.plist

  

LSUIElement (stringa). Se questa chiave è impostata su & # 8220; 1 & # 8221 ;, Launch Services esegue l'applicazione come applicazione agente. Le applicazioni degli agenti non vengono visualizzate nel Dock o nella finestra Uscita forzata. Sebbene in genere vengano eseguiti come applicazioni in background, possono venire in primo piano per presentare un'interfaccia utente, se lo si desidera.

Guarda una breve discussione qui su come trasformarlo on / off

Altri suggerimenti

Per farlo rispettando le linee guida Apple per non modificare i pacchetti di applicazioni e per garantire che le app / (le app Lion? del Mac App Store) non abbiano la firma spezzata dalla modifica di info.plist, puoi impostare LSUIElement su 1 per impostazione predefinita quindi quando l'applicazione viene avviata:

ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);

per mostrare l'icona del dock o ignorarla se l'utente ha scelto di non voler l'icona.

C'è solo un effetto collaterale, il menu dell'applicazione non viene mostrato fino a quando non perde e riacquista attenzione.

Fonte: Creazione di una casella di controllo Attiva / disattiva l'icona del dock On e Off

Personalmente preferisco non impostare alcuna opzione Info.plist e utilizzare TransformProcessType (& amp; psn, kProcessTransformToForegroundApplication) o TransformProcessType (& amp; psn, kProcessTransformToUIElementApplication) in base a ciò che è l'impostazione dell'utente.

Puoi usare ciò che viene chiamato Politica di attivazione:

Objective-C

// The application is an ordinary app that appears in the Dock and may
// have a user interface.
[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular];

// The application does not appear in the Dock and does not have a menu
// bar, but it may be activated programmatically or by clicking on one
// of its windows.
[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

// The application does not appear in the Dock and may not create
// windows or be activated.
[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];

Swift 4

// The application is an ordinary app that appears in the Dock and may
// have a user interface.
NSApp.setActivationPolicy(.regular)

// The application does not appear in the Dock and does not have a menu
// bar, but it may be activated programmatically or by clicking on one
// of its windows.
NSApp.setActivationPolicy(.accessory)

// The application does not appear in the Dock and may not create
// windows or be activated.
NSApp.setActivationPolicy(.prohibited)

Questo dovrebbe nascondere l'icona del dock.

Vedi anche

In Xcode 4 è mostrato come " L'applicazione è agente (UIElement) " ed è booleano.

Nel tuo Info.plist fai clic tenendo premuto il tasto Ctrl su uno spazio vuoto e seleziona " Aggiungi riga " dal menu Digitare " L'applicazione è agente (UIElement) " Impostalo SÌ.

Per renderlo facoltativo ho aggiunto la seguente riga al mio codice (grazie Valexa!)

 // hide/display dock icon
if (![[NSUserDefaults  standardUserDefaults] boolForKey:@"hideDockIcon"]) {
    //hide icon on Dock
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
} 

Aggiornamento per Swift: (utilizzare entrambi i modi è stato presentato sopra, hanno lo stesso risultato)

public class func toggleDockIcon_Way1(showIcon state: Bool) -> Bool {
    // Get transform state.
    var transformState: ProcessApplicationTransformState
    if state {
        transformState = ProcessApplicationTransformState(kProcessTransformToForegroundApplication)
    }
    else {
        transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication)
    }

    // Show / hide dock icon.
    var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess))
    let transformStatus: OSStatus = TransformProcessType(&psn, transformState)
    return transformStatus == 0
}

public class func toggleDockIcon_Way2(showIcon state: Bool) -> Bool {
    var result: Bool
    if state {
        result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Regular)
    }
    else {
        result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory)
    }
    return result
}

Se vuoi renderlo una preferenza dell'utente, non puoi usare UIElement. UIElement risiede nel bundle dell'applicazione che non dovresti modificare nessuno dei file nel bundle dell'app in quanto ciò invaliderà la firma del bundle.

La migliore soluzione che ho trovato si basa su questo eccellente articolo . La mia soluzione si basa sul commento di Dan. In breve, non c'è modo di farlo con Cocoa, ma è possibile con un po 'di codice Carbon.

L'articolo suggerisce inoltre di creare un'app di supporto che gestisca esclusivamente l'icona del dock. L'app principale quindi avvia e uccide questa app in base alle preferenze degli utenti. Questo approccio mi sembra più robusto rispetto all'utilizzo del codice Carbon, ma non l'ho ancora provato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top