4.5 KiB
4.5 KiB
iOS Widget Extension — Xcode Setup
Die Swift-Quellen unter ios/TimetableWidgetExtension/ müssen einmalig in Xcode als Widget Extension Target verdrahtet werden — ohne diesen Schritt bleibt der Code unkompiliert.
Schritt 1 — Widget-Extension-Target anlegen
ios/Runner.xcworkspacein Xcode öffnen.- Projekt-Sidebar →
Runner(Projekt-Root) → + Add Target unten links. - iOS → Widget Extension wählen.
- Eigenschaften:
- Product Name:
TimetableWidgetExtension - Bundle Identifier:
eu.mhsl.marianum.mobile.client.TimetableWidgetExtension - Language: Swift
- Include Configuration Intent: OFF (StaticConfiguration reicht)
- Embed in: Runner
- Product Name:
- Beim Activate-Scheme-Dialog auf Cancel klicken.
Schritt 2 — Vorhandene Quelldateien ins Target ziehen
Xcode hat zunächst Dummy-Dateien (TimetableWidgetExtension.swift, TimetableWidgetExtensionBundle.swift) angelegt. Diese löschen (Move to Trash). Dann:
- Sidebar → Rechtsklick auf den Ordner
TimetableWidgetExtension→ Add Files to "Runner"… - Im File-Picker zu
ios/TimetableWidgetExtension/navigieren und alle.swift-Dateien, dieInfo.plist,TimetableWidgetExtension.entitlementsund denAssets.xcassets-Ordner selektieren (mitmarianum_m-Asset darin — gleicher Asset-Name wie auf Android-Seite). - Wichtig: bei „Add to targets" nur
TimetableWidgetExtensionankreuzen, nicht Runner.
Schritt 3 — App Group aktivieren
Beide Targets brauchen die App-Group-Berechtigung, damit Hauptapp und Widget über UserDefaults(suiteName:) schreiben/lesen können.
- Runner-Target → Signing & Capabilities → + Capability → App Groups.
- Group-ID hinzufügen:
group.eu.mhsl.marianum.mobile.client.widget
- Group-ID hinzufügen:
- Dasselbe für TimetableWidgetExtension — mit derselben Group-ID.
Im Apple-Developer-Portal muss die App-Group bei beiden App-IDs eingetragen sein, sonst schlägt das Provisioning fehl.
Schritt 4 — Entitlements verlinken
- Runner → Build Settings →
CODE_SIGN_ENTITLEMENTSsollte bereits aufRunner/Runner.entitlementszeigen. - TimetableWidgetExtension → Build Settings →
CODE_SIGN_ENTITLEMENTS→ aufTimetableWidgetExtension/TimetableWidgetExtension.entitlementssetzen.
Schritt 5 — Info.plist + Deployment Target
- TimetableWidgetExtension → Build Settings →
INFOPLIST_FILE→ aufTimetableWidgetExtension/Info.plistsetzen. - Build Settings →
IPHONEOS_DEPLOYMENT_TARGET≥ 16.0 (Code gated.containerBackgroundmitif #available(iOS 17, *), läuft also auch auf 16).
Schritt 6 — Build & Run
- Scheme
Runner(nicht das Widget-Scheme) wählen → Run. - Auf Home-Screen langes Drücken → Widget hinzufügen → "Marianum · Heute" / "Marianum · Woche".
- Widget-Tap öffnet die App im zuletzt sichtbaren Tab. Eine Tab-Navigation auf den Stundenplan ist bewusst nicht implementiert (Android nutzt Intent-Extras, iOS würde dafür ein URL-Scheme oder AppIntent brauchen — beides bewusst ausgespart).
Troubleshooting
- Widget zeigt „Lade…" auch nach Refresh: App-Group greift nicht. Prüfen, ob beide Targets dieselbe Group-ID haben und das Provisioning aktualisiert wurde.
- Stale-Daten nach Logout:
WidgetSync.clear()schreibtwidget_data_logged_in_v1 = false; Widget zeigt dann den Login-Placeholder. - Lessons um 1–2 Stunden verschoben: Date-Parser-Bug. Sollte gefixt sein in
WidgetData.swift::parseDartDate— verifizieren, dass die ISO-8601-Strings ohne Z-Suffix alsTimeZone.currentgeparsed werden. - App-Store-Submit später:
Runner.entitlementsaps-environmentvondevelopmentaufproductionumbiegen.
Was bereits im Repo erledigt ist
- Alle Swift-Quellen, Info.plist, Entitlements liegen unter
ios/TimetableWidgetExtension/. - App-Group-ID konsistent zwischen Dart (
WidgetSync.iosAppGroupId), Swift (WidgetDataKey.appGroupId) und der Entitlements-Datei. home_widget-Plugin auf der Dart-Seite konfiguriert; ruftHomeWidget.setAppGroupIdbeim ersten Sync.containerBackgroundfür iOS 17+ gegated, fällt auf iOS 16 sauber zurück.- Date-Parser fixt das fehlende Z-Suffix (Dart schreibt lokale Zeit ohne TZ-Marker).
Was am Mac noch zu tun ist
- Schritte 1–5 oben in Xcode durchklicken (10–15 Min).
flutter pub get+cd ios && pod install.- Auf physischem Gerät oder iOS-Simulator (≥ 16.0) bauen.
- Widget aufs Home-Screen ziehen, prüfen dass Lesson-Zeiten korrekt rendern.