# iOS Share Extension — Xcode Setup Die Quellen unter `ios/Share Extension/` müssen einmalig in Xcode als **Share Extension Target** verdrahtet werden — analog zur `TimetableWidgetExtension`. Erst danach taucht „Marianum Fulda" im System-Share-Sheet auf. ## Schritt 1 — Share-Extension-Target anlegen 1. `ios/Runner.xcworkspace` in Xcode öffnen. 2. Projekt-Sidebar → `Runner` (Projekt-Root) → **+ Add Target** unten links. 3. **iOS → Share Extension** wählen. 4. Eigenschaften: - Product Name: `Share Extension` (mit Leerzeichen, exakt so — der Ordnername und Podfile-Eintrag matchen). - Bundle Identifier: `eu.mhsl.marianum.mobile.client.Share-Extension`. - Language: Swift. - Embed in: Runner. 5. Beim Activate-Scheme-Dialog auf **Cancel** klicken. 6. Deployment Target = mind. iOS 12.0 (Plugin-Mindestanforderung). ## Schritt 2 — Vorhandene Quelldateien ins Target ziehen Xcode legt Dummy-Dateien an. Diese **löschen** (Move to Trash). Dann: 1. Sidebar → Rechtsklick auf den Ordner `Share Extension` → **Add Files to "Runner"…** 2. Im File-Picker zu `ios/Share Extension/` navigieren und folgende Dateien selektieren: - `ShareViewController.swift` - `Info.plist` - `MainInterface.storyboard` - `Share Extension.entitlements` 3. **Wichtig**: bei „Add to targets" nur `Share Extension` ankreuzen, **nicht** Runner. ## Schritt 3 — App Group aktivieren Beide Targets brauchen die App-Group-Berechtigung, damit die Extension geteilte Dateien für die Hauptapp im gemeinsamen Container ablegen kann. 1. **Runner**-Target → **Signing & Capabilities** → **+ Capability** → **App Groups**. - Group-ID hinzufügen: `group.eu.mhsl.marianum.mobile.client.share` (zusätzlich zur bereits existierenden Widget-Group). 2. Dasselbe für **Share Extension**-Target — mit derselben Group-ID `group.eu.mhsl.marianum.mobile.client.share`. Im Apple-Developer-Portal muss diese App-Group bei beiden App-IDs eingetragen sein, sonst schlägt das Provisioning fehl. ## Schritt 4 — User-Defined Build Setting `CUSTOM_GROUP_ID` Beide Targets brauchen das User-Defined Setting, das in `Runner/Info.plist` und `Share Extension/Info.plist` als `$(CUSTOM_GROUP_ID)` referenziert wird. 1. **Runner** → Build Settings → `+` (oben links) → **Add User-Defined Setting**. - Name: `CUSTOM_GROUP_ID` - Wert: `group.eu.mhsl.marianum.mobile.client.share` 2. Dasselbe für **Share Extension**-Target. ## Schritt 5 — Entitlements verlinken 1. **Runner** → Build Settings → `CODE_SIGN_ENTITLEMENTS` zeigt bereits auf `Runner/Runner.entitlements` (jetzt mit beiden Groups). 2. **Share Extension** → Build Settings → `CODE_SIGN_ENTITLEMENTS` → auf `Share Extension/Share Extension.entitlements` setzen. ## Schritt 6 — Info.plist-Pfad **Share Extension** → Build Settings → `INFOPLIST_FILE` → auf `Share Extension/Info.plist` setzen. ## Schritt 7 — Build Phases reorder Damit das Plugin-Modul vom Extension-Target gefunden wird: 1. **Runner**-Target → **Build Phases**. 2. `Embed Foundation Extensions` per Drag-and-Drop **vor** `Thin Binary` ziehen. ## Schritt 8 — Pods installieren ```bash cd ios && pod install ``` Der Podfile-Eintrag (`target 'Share Extension' do inherit! :search_paths end`) ist bereits vorhanden. ## Schritt 9 — Build & Run 1. Scheme `Runner` wählen → Run auf Device oder Simulator (≥ iOS 12). 2. Foto in der Fotos-App auswählen → Teilen → „Marianum Fulda" sollte erscheinen. 3. Auswahl → App öffnet sich, ShareTargetPage erscheint. ## Troubleshooting - **Error: No such module 'receive_sharing_intent'** → Schritt 7 (Build Phases reorder) wurde übersprungen. - **Error: ‚Frameworks' not allowed in extension** → In Build Settings der Share Extension `Other Linker Flags` und `Framework Search Paths` leeren (nur die geerbten Pod-Pfade behalten). - **Share-Sheet zeigt App nicht an** → `NSExtensionActivationRule`-Limits in `Share Extension/Info.plist` zu klein? Werte testweise erhöhen. Außerdem: App muss **mindestens einmal nach Install** geöffnet worden sein, sonst wird die Extension von iOS nicht registriert. - **Files kommen mit `nil` Pfad an** → App-Group nicht konsistent. Prüfen, dass `CUSTOM_GROUP_ID` in beiden Targets identisch ist und die Entitlement-Files dieselbe Group enthalten. ## Was am Mac noch zu tun ist - Schritte 1–8 oben (~15 Min). - Auf physischem iPhone testen — Simulator-Share-Sheet ist eingeschränkt.