

Этот пакет позволяет добавлять поддержку для пользовательских сочетание глобальных клавиатур в ваше приложение MacOS за считанные минуты. Это совместимо с песочницей и Mac App Store. И он используется в производстве Dato, Jiffy, Plash и Lungo.
Я рад принять больше конфигурации и функций. Пиар добро пожаловать! То, что вы видите здесь, это то, что мне нужно для моих собственных приложений.

MacOS 10.15+
Добавьте https://github.com/sindresorhus/KeyboardShortcuts на вкладке «Swift Package Manager» в Xcode.
Во -первых, зарегистрируйте имя для сочетания клавиатуры.
Constants.swift
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let toggleUnicornMode = Self ( " toggleUnicornMode " )
}Затем вы можете обратиться к этому сильному названию в других местах.
Вы захотите сделать представление, где пользователь может выбрать сочетание клавиш.
SettingsScreen.swift
import SwiftUI
import KeyboardShortcuts
struct SettingsScreen : View {
var body : some View {
Form {
KeyboardShortcuts . Recorder ( " Toggle Unicorn Mode: " , name : . toggleUnicornMode )
}
}
}Есть также поддержка какао вместо Swiftui.
KeyboardShortcuts.Recorder позаботится о хранении сочетания клавиатуры в UserDefaults , а также предупреждает пользователя, если выбранный сочетание клавиатуры уже используется системой или главным меню приложения.
Добавьте слушателя, когда пользователь нажимает выбранную их сочетание клавиатуры.
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 ( )
}
}
} Вы также можете прослушать Key Down с .onKeyDown()
Вот и все!
Вы можете найти полный пример в каталоге «Пример».
Вы также можете найти реальный пример в моем приложении Plash.
Использование KeyboardShortcuts.RecorderCocoa вместо KeyboardShortcuts.Recorder :
import AppKit
import KeyboardShortcuts
final class SettingsViewController : NSViewController {
override func loadView ( ) {
view = NSView ( )
let recorder = KeyboardShortcuts . RecorderCocoa ( for : . toggleUnicornMode )
view . addSubview ( recorder )
}
} Этот пакет поддерживает локализацию. PR Добро пожаловать за большим!
.lproj . Больше здесь.Localizable.strings в новом языковом каталоге, а затем скопируйте содержимое KeyboardShortcuts/Localization/en.lproj/Localizable.strings в новый файл, который вы только что создали.Смотрите документы API.
NSMenuItem Смотрите NSMenuItem#setShortcut .
Ваше приложение может потребоваться поддержать сочетания клавиш для пользовательских действий. Обычно вы статически зарегистрируете сочетание клавиатуры в extension KeyboardShortcuts.Name {} . Однако это не является требованием. Это только для удобства, так что вы можете использовать Dot-Syntax при вызове различных API (например, .onKeyDown(.unicornMode) {} ). Вы можете создать KeyboardShortcut.Name динамически и хранить их самостоятельно. Вы можете увидеть это в действии в примере проекта.
Настройка сочетания клавиш по умолчанию может быть полезен, если вы мигрируете из другой пакета или просто делаете что -то для себя. Однако, пожалуйста, не устанавливайте это для общедоступного приложения. Пользователи считают, что это раздражает, когда случайные приложения крадут их существующие сочетания клавиш. Как правило, лучше показать приветственный экран на первом запуске приложения, который позволяет пользователю установить ярлык.
import KeyboardShortcuts
extension KeyboardShortcuts . Name {
static let toggleUnicornMode = Self ( " toggleUnicornMode " , default : . init ( . k , modifiers : [ . command , . option ] ) )
} Чтобы получить все Name сочетания клавиш, 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 ) И чтобы получить все Name с помощью сочетания клавишных клавиш:
print ( KeyboardShortcuts . Name . allCases . filter { $0 . shortcut != nil } ) MASShortcut ?Этот пакет:
NSMenuItem .NSMenu открыт (например, приложения Bar Menu). MASShortcut :
HotKey ? HotKey хороша для добавления сочетания клавиш с жесткой кодировкой, но для пользователя не предоставляет компонент пользовательского интерфейса, чтобы выбрать свои собственные сочетания клавиш.
Carbon ? Разве это не устарело?Большинство углеродных API были устарели много лет назад, но осталось некоторые, которые Apple никогда не отправляла современные замены. Это включает в себя регистрацию глобальных сочетания клавиатуры. Тем не менее, вам не нужно беспокоиться об этом. Apple наверняка отправит новые API, прежде чем выпустить углеродные API, используемые здесь.
Нет.
Это за пределами масштаба этого пакета. Вы можете использовать NSEvent.addLocalMonitorForEvents , NSMenuItem с сочетанием клавиш (он может быть даже скрыт), либо модификатор Swiftui View#keyboardShortcut() .
Нет, так как это не будет работать для приложений с песочницей. Если ваше приложение не песочницы, вы можете использовать MediaKeyTap .
Однако нет ничего, что не помешает вам использовать Swift Package Manager только для этого пакета, даже если вы обычно используете кокопод или Карфаген.