README: Aufbau, Bauanleitung und die Entscheidungen, die man sonst für Fehler hält
This commit is contained in:
87
README.md
Normal file
87
README.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# Onyx
|
||||
|
||||
**Notch-Erweiterung für macOS.** Beim Überfahren der Notch fährt ein Panel mit
|
||||
eigenen Widgets aus — Kalender, Wetter, Medien, Hardware, Netzwerk, Audio-Mixer,
|
||||
Ablage und AirDrop.
|
||||
|
||||
Zielgerät: MacBook Pro mit Apple Silicon, macOS 26+.
|
||||
|
||||
---
|
||||
|
||||
## Bauen
|
||||
|
||||
```bash
|
||||
xcodegen generate # erzeugt Onyx.xcodeproj aus project.yml
|
||||
open Onyx.xcodeproj # dann ⌘R
|
||||
```
|
||||
|
||||
Voraussetzungen: Xcode 26, [XcodeGen](https://github.com/yonaskolb/XcodeGen),
|
||||
Signierung mit Team `PP34X97WS3`.
|
||||
|
||||
Tests laufen ohne Xcode:
|
||||
|
||||
```bash
|
||||
cd Packages/OnyxKit && swift test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Aufbau
|
||||
|
||||
Die Projektdefinition liegt als `project.yml` vor, nicht als handgepflegte
|
||||
`.xcodeproj` — so ist im Diff lesbar, was sich an den Build-Einstellungen ändert.
|
||||
|
||||
```
|
||||
Onyx/ App-Target (nicht sandboxed, Hardened Runtime)
|
||||
Packages/OnyxKit/ Alle Module als lokales Swift-Package
|
||||
OnyxCore Einzelinstanz-Sicherung
|
||||
OnyxDesign Farben, Maße, Bewegung — einzige Quelle
|
||||
OnyxNotch Panel-Fenster, Geometrie, Zustandsmaschine
|
||||
OnyxWidgetKit Widget-Protokoll, Layout-Engine, Persistenz
|
||||
OnyxMenuBar Modul-Protokoll für Menüleisten-Elemente
|
||||
CalendarProvider EventKit (und später Calendarr)
|
||||
WeatherProvider WeatherKit + CoreLocation
|
||||
MediaProvider MediaRemote-Adapter, AppleScript, Medientasten
|
||||
Vendor/ Fremdcode im Quellzustand (siehe unten)
|
||||
Spikes/ Wegwerf-Werkzeuge zur API-Verifikation
|
||||
docs/spikes/ Was dabei herauskam — auch die Sackgassen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Entscheidungen, die man sonst für Fehler hält
|
||||
|
||||
**Keine App-Sandbox.** Sie ist mit dem privilegierten Helper, mit IOKit und mit
|
||||
dem MediaRemote-Adapter unvereinbar. Der App-Group-Container für Calendarr
|
||||
bleibt trotzdem erreichbar — auf macOS ist er von der Sandbox unabhängig.
|
||||
Nachgemessen in [docs/spikes/D-appgroup.md](docs/spikes/D-appgroup.md).
|
||||
|
||||
**TCC-Entitlements trotz fehlender Sandbox.** Bei aktivierter Hardened Runtime
|
||||
verlangt macOS `com.apple.security.personal-information.*` auch ohne Sandbox.
|
||||
Fehlt eine davon, erscheint der Berechtigungsdialog gar nicht erst — ohne
|
||||
Fehlermeldung. Das hat einen halben Abend gekostet:
|
||||
[docs/spikes/E-tcc-hardened-runtime.md](docs/spikes/E-tcc-hardened-runtime.md).
|
||||
|
||||
**`ENABLE_DEBUG_DYLIB = NO`.** Xcode lagert im Debug-Build den Programmcode in
|
||||
eine eigene dylib aus. TCC ordnet Berechtigungsanfragen dann dem verbleibenden
|
||||
Rumpf zu, der weder Info.plist noch Entitlements trägt.
|
||||
|
||||
**Eigenes Einstellungsfenster.** SwiftUIs `Settings`-Szene öffnet über einen
|
||||
privaten Selektor, der bei Apps ohne Menüleiste unzuverlässig ankommt.
|
||||
|
||||
**Der MediaRemote-Adapter wird nicht gelinkt.** Er wird von `/usr/bin/perl`
|
||||
geladen, einem berechtigten Systemprogramm — im eigenen Prozess greift Apples
|
||||
Entitlement-Prüfung und es käme nichts an.
|
||||
|
||||
---
|
||||
|
||||
## Fremdcode
|
||||
|
||||
`Vendor/mediaremote-adapter` — [ungive/mediaremote-adapter](https://github.com/ungive/mediaremote-adapter),
|
||||
BSD-3-Clause. Als Quellcode eingebettet und beim Bauen kompiliert, nicht als
|
||||
fertige Binary: so ist nachvollziehbar, was läuft. Stand siehe
|
||||
`ONYX-VERSION.txt`.
|
||||
|
||||
---
|
||||
|
||||
© 2026 Scarriffleservices
|
||||
1
bright.svg
Normal file
1
bright.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><path fill="#c3c3c3" d="m461.481 384.169-56.77-221.599a16.3 16.3 0 0 0-1.355-3.512L256.001 0 108.707 158.934a16.2 16.2 0 0 0-1.416 3.636L50.52 384.169a10.8 10.8 0 0 0 .081 5.665l126.344 121.391c1.267.507 2.631.775 4.021.775h150.07c1.389 0 2.753-.268 4.019-.774l126.292-121.217c.569-1.866.635-3.883.134-5.84" opacity="1" data-original="#a6e7f0" class=""></path><path fill="#f3f5f6" d="m461.481 384.169-56.77-221.599a16.3 16.3 0 0 0-1.355-3.512L256.001 0a10.78 10.78 0 0 0-8.035 3.584l-3.811 4.233 133.203 147.924a16.2 16.2 0 0 1 3.659 6.829l56.77 221.599a10.81 10.81 0 0 1-3.015 10.511L314.801 509.015a10.8 10.8 0 0 1-7.46 2.985h23.694c1.389 0 2.753-.268 4.019-.774l126.292-121.217c.57-1.866.636-3.883.135-5.84" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#f3f5f6" d="M401.051 155.741 264.035 3.584A10.77 10.77 0 0 0 256.001 0v188.536l62.219 54.012 85.136-83.491a15.8 15.8 0 0 0-2.305-3.316" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#d6d6d6" d="M377.357 155.741a16.2 16.2 0 0 1 3.659 6.829l3.766 14.701 18.573-18.213a15.8 15.8 0 0 0-2.305-3.317L264.035 3.584A10.77 10.77 0 0 0 256.001 0v20.972z" opacity="1" data-original="#2ed1e2" class=""></path><path fill="#d6d6d6" d="M247.966 3.584 110.95 155.741a15.9 15.9 0 0 0-2.302 3.319l85.1 83.456L256 188.537V0a10.77 10.77 0 0 0-8.034 3.584" opacity="1" data-original="#d4f2f6" class=""></path><path fill="#c3c3c3" d="M256.001 0a10.77 10.77 0 0 0-8.035 3.584l-3.811 4.233 11.846 13.155z" opacity="1" data-original="#a6e7f0" class=""></path><path fill="#f3f5f6" d="M357.937 371.972 299.07 419.94l35.985 91.286.012-.001a10.7 10.7 0 0 0 3.428-2.209L458.467 394.68a10.74 10.74 0 0 0 2.879-4.671z" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#d6d6d6" d="m461.346 390.009-23.276-4.06a10.8 10.8 0 0 1-3.298 8.731L328.891 495.587l6.163 15.639.012-.001a10.7 10.7 0 0 0 3.428-2.209L458.467 394.68a10.74 10.74 0 0 0 2.879-4.671" opacity="1" data-original="#2ed1e2" class=""></path><path fill="#f3f5f6" d="m149.944 371.907-99.298 18.091a10.8 10.8 0 0 0 2.888 4.683l119.971 114.336a10.8 10.8 0 0 0 3.439 2.209l35.965-91.22z" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#a5a5a5" d="m209.819 418.393-57.237-42.83a7.57 7.57 0 0 1-2.612-8.553l42.606-122.127a10.8 10.8 0 0 1 2.969-4.468l55.387-49.932a7.57 7.57 0 0 1 10.138 0l55.257 49.814a10.8 10.8 0 0 1 3.071 4.777l38.574 122.228a7.57 7.57 0 0 1-2.482 8.183l-53.224 42.684a10.82 10.82 0 0 1-6.767 2.379h-79.203a10.8 10.8 0 0 1-6.477-2.155" opacity="1" data-original="#eaf9fa" class=""></path></g></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
36
outline.svg
Normal file
36
outline.svg
Normal file
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" width="512" height="512">
|
||||
<g>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 		M197.235,67.578L115.2,158.68c-1.702,1.89-2.922,4.165-3.553,6.629L56.541,380.415c-0.943,3.68,0.176,7.582,2.926,10.203 		l116.456,110.985c1.952,1.86,4.545,2.897,7.241,2.897h145.672c2.696,0,5.289-1.036,7.241-2.896l116.456-110.986 		c2.75-2.621,3.869-6.523,2.926-10.203l-55.107-215.106c-0.631-2.464-1.851-4.739-3.553-6.629l-133-147.698 		c-4.169-4.63-11.43-4.63-15.599,0l-27.346,30.366"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="256" y1="190.51" x2="256" y2="7.5"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="399.03" y1="161.9" x2="316.4" y2="242.94"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="195.57" y1="242.91" x2="112.97" y2="161.9"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="455.33" y1="386.08" x2="354.95" y2="368.57"/>
|
||||
|
||||
<polyline style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" points=" 		297.8,415.14 332.74,503.75 332.75,503.75 	"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="214.18" y1="415.2" x2="179.26" y2="503.75"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="153.05" y1="368.51" x2="56.66" y2="386.07"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 		M344.163,329.755l10.821,34.288c0.912,2.891-0.044,6.047-2.409,7.943l-51.664,41.433c-1.863,1.494-4.181,2.31-6.568,2.31h-76.882 		c-2.267,0-4.474-0.734-6.289-2.092l-55.56-41.575c-2.565-1.919-3.591-5.278-2.536-8.302l41.358-118.549 		c0.581-1.665,1.572-3.156,2.882-4.337l53.764-48.468c2.796-2.52,7.046-2.52,9.841,0l53.638,48.355 		c1.389,1.252,2.418,2.853,2.981,4.637l16.211,51.366"/>
|
||||
</g>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
Reference in New Issue
Block a user