

Este pacote permite adicionar suporte para atalhos globais de teclado globaistomizáveis pelo usuário ao seu aplicativo MacOS em minutos. É totalmente compatível com a Sandbox e Mac App Store. E é usado na produção por Dato, Jiffy, Plash e Lungo.
Fico feliz em aceitar mais configurabilidade e recursos. PR Bem -vindo! O que você vê aqui é exatamente o que eu precisava para meus próprios aplicativos.

MacOS 10.15+
Adicione https://github.com/sindresorhus/KeyboardShortcuts na guia "Swift Package Manager" no Xcode.
Primeiro, registre um nome para o atalho do teclado.
Constants.swift
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let toggleUnicornMode = Self ( " toggleUnicornMode " )
}Você pode se referir a esse nome fortemente tipo em outros lugares.
Você deseja fazer uma visualização onde o usuário pode escolher um atalho de teclado.
SettingsScreen.swift
import SwiftUI
import KeyboardShortcuts
struct SettingsScreen : View {
var body : some View {
Form {
KeyboardShortcuts . Recorder ( " Toggle Unicorn Mode: " , name : . toggleUnicornMode )
}
}
}Há também apoio ao cacau em vez de Swiftui.
KeyboardShortcuts.Recorder cuida do armazenamento do atalho do teclado no UserDefaults e também avisando o usuário se o atalho de teclado escolhido já for usado pelo sistema ou pelo menu principal do aplicativo.
Adicione um ouvinte para quando o usuário pressionar o atalho de teclado escolhido.
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 ( )
}
}
} Você também pode ouvir o Key Down with .onKeyDown()
Isso é tudo!
Você pode encontrar um exemplo completo no diretório "Exemplo".
Você também pode encontrar um exemplo do mundo real no meu aplicativo Plash.
Usando KeyboardShortcuts.RecorderCocoa em vez de KeyboardShortcuts.Recorder :
import AppKit
import KeyboardShortcuts
final class SettingsViewController : NSViewController {
override func loadView ( ) {
view = NSView ( )
let recorder = KeyboardShortcuts . RecorderCocoa ( for : . toggleUnicornMode )
view . addSubview ( recorder )
}
} Este pacote suporta localizações. PR Bem -vindo para mais!
.lproj . Mais aqui.Localizable.strings no novo diretório de idiomas e copie o conteúdo de KeyboardShortcuts/Localization/en.lproj/Localizable.strings para o novo arquivo que você acabou de criar.Veja os documentos da API.
NSMenuItem Veja NSMenuItem#setShortcut .
Seu aplicativo pode precisar oferecer suporte a atalhos de teclado para ações definidas pelo usuário. Normalmente, você registria estaticamente os atalhos de teclado antecipadamente na extension KeyboardShortcuts.Name {} . No entanto, isso não é um requisito. É apenas por conveniência para que você possa usar o Dot-Syntax ao chamar várias APIs (por exemplo, .onKeyDown(.unicornMode) {} ). Você pode criar KeyboardShortcut.Name dinamicamente e armazená -los você mesmo. Você pode ver isso em ação no projeto de exemplo.
Definir um atalho de teclado padrão pode ser útil se você estiver migrando de um pacote diferente ou apenas fazendo algo para si mesmo. No entanto, não defina isso para um aplicativo distribuído publicamente. Os usuários acham irritante quando aplicativos aleatórios roubam seus atalhos de teclado existentes. Geralmente, é melhor mostrar uma tela de boas -vindas no primeiro aplicativo para o lançamento do aplicativo que permite que o usuário defina o atalho.
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let toggleUnicornMode = Self ( " toggleUnicornMode " , default : . init ( . k , modifiers : [ . command , . option ] ) )
} Para obter todos os Name de atalho do teclado, Conform KeyboardShortcuts.Name para CaseIterable .
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 ) E para obter todo o Name com um atalho de teclado definido:
print ( KeyboardShortcuts . Name . allCases . filter { $0 . shortcut != nil } ) MASShortcut ?Este pacote:
NSMenuItem .NSMenu está aberto (por exemplo, aplicativos de barra de menus). MASShortcut :
HotKey ? HotKey é boa para adicionar atalhos de teclado com código duro, mas não fornece nenhum componente de interface do usuário para o usuário escolher seus próprios atalhos de teclado.
Carbon ? Isso não está depreciado?A maioria das APIs de carbono foi preterida anos atrás, mas restam alguns para os quais a Apple nunca enviou substituições modernas. Isso inclui o registro de atalhos globais de teclado. No entanto, você não precisa se preocupar com isso. A Apple enviará com certeza novas APIs antes de descontinuar as APIs de carbono usadas aqui.
Não.
Isso está fora do escopo deste pacote. Você pode usar NSEvent.addLocalMonitorForEvents , NSMenuItem com atalho de teclado (ele pode até ser oculto) ou o modificador View#keyboardShortcut() de Swiftui.
Não, pois não funcionaria para aplicativos de sandbox. Se o seu aplicativo não estiver em caixa de areia, você poderá usar MediaKeyTap .
Não. No entanto, não há nada que o impeça de usar o Swift Package Manager apenas para este pacote, mesmo que você normalmente use Cocoapods ou Cartago.