94 lines
4.4 KiB
Markdown
94 lines
4.4 KiB
Markdown
# 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.
|