Warum die Shortcuts meiner selbstgebauten Mac-App lautlos starben
Alle Kürzel eingestellt, trotzdem tot. Drei versteckte Schichten aus Code-Signing und macOS-Berechtigungen. Ein halber Tag Diagnose, hier in zehn Minuten.
Ich baue meine Diktier-App selbst aus dem Quellcode, statt die fertige Version zu kaufen. Alles lief: Aufnahme, Transkription, Modelle. Nur die Tastenkürzel für die Modi standen sichtbar in den Einstellungen und taten schlicht nichts. Kein Absturz, keine Log-Zeile. Genau diese lautlose Sorte Bug, die einen Tag frisst.
Der erste Reflex ist, den Shortcut-Code zu verdächtigen. Falsch. Der Code war die ganze Zeit korrekt. Das Problem lag eine Ebene tiefer, in der Art, wie macOS Tastatur-Events ausliefert, und es hatte drei unabhängige Schichten, die alle stimmen müssen.
Die drei Schichten
1. Ad-hoc-Signatur, stille Rechte-Neubewertung. Ein lokaler Build ist nur ad-hoc signiert. Bei jedem Neubau ändert sich die Code-Identität, macOS bewertet die Berechtigung neu und scheitert lautlos. Der Tastatur-Tap wird erstellt, empfängt aber nie ein Event. Diagnose-Tell: Startet man das Binary direkt, geht es; über den Finder gestartet nicht.
2. Bedienungshilfen liefern nur Modifier-Tasten. Mit „Bedienungshilfen“ bekommt der Tap Modifier-Events. Die Aufnahme-Taste (ein reiner Modifier) ging also, was den Fehler maskierte und aussehen ließ, als seien nur manche Shortcuts kaputt.
3. Echte Tastendrücke brauchen Eingabeüberwachung. Für jeden Tastendruck mit Zeichen braucht der Tap zusätzlich „Eingabeüberwachung“, eine separate Berechtigung neben den Bedienungshilfen. Ohne sie kommen Modifier an, echte Tasten nie. Der Schlussstein.
Wie ich es eingegrenzt habe
Der entscheidende Test: ein winziges eigenes Programm mit einem listenOnly-Tap, das dieselben Events mithört. Es sah die Tastendrücke problemlos, die App nicht. Damit war bewiesen, dass die Tasten das System sauber erreichen und das Problem allein in den Berechtigungen der App-Identität liegt, nicht am Layout und nicht am Code.
Die Lösung
Mit einer stabilen, selbst signierten Identität signieren statt ad-hoc, dann beide Berechtigungen erteilen. Nach jedem Signaturwechsel die alten Freigaben gezielt zurücksetzen, damit macOS sie an die neue Identität bindet:
# beide zuruecksetzen, dann in den Systemeinstellungen neu erteilen
tccutil reset Accessibility com.example.app # Bedienungshilfen
tccutil reset ListenEvent com.example.app # Eingabeueberwachung
Der Kern in einem Satz: Ein globaler Tastatur-Tap in einer selbstgebauten App braucht drei Dinge gleichzeitig, stabile Signatur, Bedienungshilfen und Eingabeüberwachung. Fehlt eines, sterben die Kürzel lautlos.
Die Diagnose-Signatur, die es verriet: Die Modifier-Aufnahme-Taste funktionierte, aber jedes zeichenbasierte Kürzel war tot. Genau dieses Muster heißt: Bedienungshilfen ja, Eingabeüberwachung fehlt. Jetzt kennst du es.