

Este paquete le permite agregar soporte para los atajos globales de teclado globales de usuarios a su aplicación MacOS en minutos. Es completamente compatible con Sandbox y Mac App Store. Y se usa en producción por Dato, Jiffy, Plash y Lungo.
Me complace aceptar más configurabilidad y características. ¡PR Bienvenido! Lo que ves aquí es justo lo que necesitaba para mis propias aplicaciones.

MacOS 10.15+
Agregue https://github.com/sindresorhus/KeyboardShortcuts en la pestaña "Swift Package Manager" en Xcode.
Primero, registre un nombre para el atajo de teclado.
Constants.swift
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let toggleUnicornMode = Self ( " toggleUnicornMode " )
}Luego puede consultar este nombre fuertemente tipado en otros lugares.
Deberá ver donde el usuario puede elegir un atajo de teclado.
SettingsScreen.swift
import SwiftUI
import KeyboardShortcuts
struct SettingsScreen : View {
var body : some View {
Form {
KeyboardShortcuts . Recorder ( " Toggle Unicorn Mode: " , name : . toggleUnicornMode )
}
}
}También hay apoyo para el cacao en lugar de Swiftui.
KeyboardShortcuts.Recorder se encarga de almacenar el acceso directo del teclado en UserDefaults y también advirtiendo al usuario si el atajo de teclado elegido ya es utilizado por el sistema o el menú principal de la aplicación.
Agregue un oyente para cuando el usuario presione su atajo de teclado elegido.
App.swift
import SwiftUI
import KeyboardShortcuts
@ main
struct YourApp : App {
@ State private var appState = AppState ( )
var body : some Scene {
WindowGroup {
// …
}
Settings {
SettingsScreen ( )
}
}
}
@ MainActor
@ Observable
final class AppState {
init ( ) {
KeyboardShortcuts . onKeyUp ( for : . toggleUnicornMode ) { [ self ] in
isUnicornMode . toggle ( )
}
}
} También puedes escuchar a Key Down con .onKeyDown()
¡Eso es todo!
Puede encontrar un ejemplo completo en el directorio "Ejemplo".
También puede encontrar un ejemplo del mundo real en mi aplicación Plash.
Uso KeyboardShortcuts.Recorder KeyboardShortcuts.RecorderCocoa
import AppKit
import KeyboardShortcuts
final class SettingsViewController : NSViewController {
override func loadView ( ) {
view = NSView ( )
let recorder = KeyboardShortcuts . RecorderCocoa ( for : . toggleUnicornMode )
view . addSubview ( recorder )
}
} Este paquete admite localizaciones. ¡PR Bienvenido para más!
.lproj . Más aquí.Localizable.strings en el nuevo directorio de idiomas y luego copie el contenido de KeyboardShortcuts/Localization/en.lproj/Localizable.strings al nuevo archivo que acaba de crear.Ver los documentos de la API.
NSMenuItem Ver NSMenuItem#setShortcut .
Es posible que su aplicación necesite admitir accesos directos de teclado para acciones definidas por el usuario. Normalmente, registraría estáticamente los atajos de teclado por adelantado en extension KeyboardShortcuts.Name {} . Sin embargo, esto no es un requisito. Es solo por conveniencia para que pueda usar DOT-Syntax al llamar a varias API (por ejemplo, .onKeyDown(.unicornMode) {} ). Puede crear dinámicamente KeyboardShortcut.Name y almacenarlos usted mismo. Puede ver esto en acción en el proyecto de ejemplo.
Configurar un atajo de teclado predeterminado puede ser útil si está migrando de un paquete diferente o simplemente haciendo algo para usted. Sin embargo, no configure esto para una aplicación distribuida públicamente. Los usuarios les resulta molesto cuando las aplicaciones aleatorias roban sus atajos de teclado existentes. En general, es mejor mostrar una pantalla de bienvenida en el primer lanzamiento de la aplicación que permite al usuario establecer el atajo.
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let toggleUnicornMode = Self ( " toggleUnicornMode " , default : . init ( . k , modifiers : [ . command , . option ] ) )
} Para obtener todos los Name de acceso directo CaseIterable KeyboardShortcuts.Name
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let foo = Self ( " foo " )
static let bar = Self ( " bar " )
}
extension KeyboardShortcuts . Name : CaseIterable {
public static let allCases : [ Self ] = [
. foo ,
. bar
]
}
// …
print ( KeyboardShortcuts . Name . allCases ) Y para obtener todos los Name con un atajo de teclado establecido:
print ( KeyboardShortcuts . Name . allCases . filter { $0 . shortcut != nil } ) MASShortcut ?Este paquete:
NSMenuItem .NSMenu está abierto (por ejemplo, aplicaciones de barra de menú). MASShortcut :
HotKey ? HotKey es bueno para agregar atajos de teclado con codificación dura, pero no proporciona ningún componente de interfaz de usuario para que el usuario elija sus propios atajos de teclado.
Carbon ? ¿No está en desuso?La mayoría de las API de carbono se desaprecieron hace años, pero quedan algunos para los que Apple nunca envió reemplazos modernos. Esto incluye registrar los atajos globales de teclado. Sin embargo, no debe necesitar preocuparse por esto. Apple seguramente enviará nuevas API antes de desaprobar las API de carbono utilizadas aquí.
No.
Eso está fuera del alcance de este paquete. Puede usar NSEvent.addLocalMonitorForEvents , NSMenuItem con atajo de teclado (incluso se puede ocultar) o el modificador View#keyboardShortcut() de Swiftui.
No, ya que no funcionaría para aplicaciones de sandboxed. Si su aplicación no está en Sandboxed, puede usar MediaKeyTap .
No. Sin embargo, no hay nada que le impida usar Swift Package Manager solo para este paquete, incluso si normalmente usa Cocoapods o Cartago.