iOS-Signierung vorbereiten: Skript, Nachweis des Gerätebaus, offener Punkt
Phase 10 Schritt 7 lässt sich nicht abschließen, aber alles bis zur Signatur ist gebaut und belegt: Simulator- und Gerätebau (arm64, Release) laufen fehlerfrei durch, 146/146 Tests grün, Typecheck sauber. Die Signatur scheitert allein daran, dass dem Entwicklerteam kein Gerät bekannt ist -- Apple erzeugt ein Development-Profil nur für konkrete UDIDs. Kein iPhone angeschlossen, keins je mit diesem Mac gepaart, kein App-Store-Connect-Schlüssel zum Nachtragen. Neu: companion-app/scripts/ios-signieren.sh macht Bauen, Synchronisieren, Signieren und den .ipa-Export zu einem Befehl. Nötig, weil ios/ absichtlich gitignored ist und jede in Xcode geklickte Signatureinstellung beim nächsten npx cap add ios wieder verschwinden würde -- die Team-Kennung braucht eine versionierte Heimat. Bewusst nicht getan: eine unsignierte .ipa als Platzhalter einchecken. Sie wäre nicht installierbar und läge als Binärdatei dauerhaft in der Historie.
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
# AGENTS.md — Project state, review findings, open items, and working rules
|
||||
|
||||
**Last updated: 2026-08-23** (merged the `umsetzung-datametric360` branch — companion app phases
|
||||
**Last updated: 2026-08-29** (iOS signing prepared end to end — device build verified, signature
|
||||
blocked on a device registration at Apple, see section AI; 2026-08-23: merged the
|
||||
`umsetzung-datametric360` branch — companion app phases
|
||||
1–10 done, see `UMSETZUNGSPLAN.md`; 2026-08-13: cleaned up remaining EU Data Act residue, fixed
|
||||
oversized toggle switches, and fixed a desktop-layout audit (settings button / rings logo / popups
|
||||
overflowing past the capped content column) — see `DESIGN_AUDIT_2026-08-13.md`; 2026-08-16: fixed
|
||||
@@ -4594,6 +4596,57 @@ via log (single `audi_dashboard` loader warning, no traceback).
|
||||
|
||||
---
|
||||
|
||||
## AI. iOS signing prepared, and the one thing that blocks it (2026-08-29)
|
||||
|
||||
Task was: build the iOS app, sign it, commit the result — `UMSETZUNGSPLAN.md` Phase 10 step 7, the
|
||||
last open item of that phase. **Result: everything except the signature itself is done and
|
||||
verified; the signature is blocked on a fact about the Apple account, not on this repo.**
|
||||
|
||||
What was verified on this machine (Xcode 26.4, Node 22.20, `main` at `2026.8.28.18`):
|
||||
|
||||
- `npm run typecheck` clean, `npm test` 146/146 green, `npm run build` clean, `npx cap sync ios`
|
||||
clean (both plugins found: secure-storage 8.0.0, capgo/updater 8.51.14).
|
||||
- **Simulator build (Release) succeeds.**
|
||||
- **Device build (Release, `generic/platform=iOS`, arm64) succeeds** with signing switched off —
|
||||
8.5 MB `App.app`. So the code, the plugins and the Swift-package graph are all fine on device;
|
||||
nothing but provisioning is missing.
|
||||
|
||||
**The blocker, verbatim from Apple:** `Communication with Apple failed: Your team has no devices
|
||||
from which to generate a provisioning profile.` The developer account authenticates fine (Xcode
|
||||
reached Apple and got a real answer, not an auth error) — team `RMACS9VLS4`, certificate
|
||||
`Apple Development: paul.nothaft@me.com (C9L892Z59P)`, valid until 2027-07-17. Apple issues a
|
||||
development profile only for **named devices**, and this team has none registered. No iPhone is
|
||||
connected (`xcrun devicectl list devices` → none), no device was ever paired with this Mac (no
|
||||
`~/Library/Developer/CoreDevice`, no iOS DeviceSupport), and no App Store Connect API key exists
|
||||
to register one remotely. There is no route around this from a machine with no phone attached:
|
||||
|
||||
- development / ad-hoc profiles both require registered UDIDs;
|
||||
- an App-Store-method export needs no devices but produces an IPA that iOS refuses to sideload;
|
||||
- a locally `codesign`-ed `.app` without an embedded profile will not install either.
|
||||
|
||||
**What to do (owner, one minute, once):** connect the iPhone by cable and tap "Trust", then run
|
||||
the script below — Xcode registers the UDID itself via `-allowProvisioningUpdates`. Alternative if
|
||||
the phone is elsewhere: add its UDID under developer.apple.com → Certificates, Identifiers &
|
||||
Profiles → Devices. After that the device stays registered and the step never repeats.
|
||||
|
||||
**What was built instead of a hand-clicked Xcode signature:** `companion-app/scripts/ios-signieren.sh`
|
||||
— build → `cap sync` → signed archive → `.ipa` export, one command. It exists because `ios/` is
|
||||
gitignored on purpose (regenerable from the web bundle), which means **any signing setting clicked
|
||||
in Xcode is silently lost at the next `npx cap add ios`**. A versioned script is the only place the
|
||||
team ID can survive. `APPLE_TEAM_ID` overrides it; output lands in `ios/build/App.ipa` (already
|
||||
covered by the `ios/` ignore, no build artifact enters git). Verified by running it end to end: it
|
||||
passes build, sync and archive setup and stops exactly at Apple's device requirement, nowhere else.
|
||||
|
||||
Deliberately **not** done: committing an unsigned `.ipa` as a stand-in. It is not what was asked
|
||||
for, it cannot be installed as-is, and a per-build ~6 MB binary would sit in the git history
|
||||
forever. The OTA path already covers "new UI without Xcode" (section above) — Xcode is only needed
|
||||
when native code or the signature itself changes.
|
||||
|
||||
Phase 10 step 7 therefore stays **unchecked** in `UMSETZUNGSPLAN.md`: the app is not on the phone
|
||||
yet, and marking it done would be exactly the silent staleness this project keeps designing against.
|
||||
|
||||
---
|
||||
|
||||
## Working conventions (observed — keep them)
|
||||
|
||||
- German is the project language: identifiers, comments, commits, UI texts. Exceptions:
|
||||
|
||||
+14
-1
@@ -423,6 +423,13 @@ nicht ein Riesencommit.
|
||||
> echte Daten. `CapacitorHttp` umgeht die CORS-Beschränkung der WebView.
|
||||
> Offen bleibt allein das Signieren aufs eigene Gerät — das braucht das
|
||||
> angeschlossene iPhone und die Apple-ID des Besitzers.
|
||||
>
|
||||
> **2026-08-29:** Schritt 7 vorbereitet, aber nicht abschließbar. Der Gerätebau
|
||||
> (arm64, Release) läuft fehlerfrei durch, das Signieren scheitert
|
||||
> ausschließlich daran, dass dem Team `RMACS9VLS4` **kein Gerät** bekannt ist:
|
||||
> Apple erzeugt ein Development-Profil nur für konkrete UDIDs. Der ganze
|
||||
> Ablauf steckt jetzt in `companion-app/scripts/ios-signieren.sh` und läuft
|
||||
> bis genau zu diesem Punkt. Details in `AGENTS.md` Abschnitt AI.
|
||||
|
||||
**Ziel:** Die App läuft auf dem iPhone. Zwei Stufen — erst PWA (sofort nutzbar), dann Capacitor
|
||||
(Keychain + QR-Scan).
|
||||
@@ -449,7 +456,13 @@ nicht ein Riesencommit.
|
||||
(Offline-JS-QR-Bibliothek, keine Netzabfrage) als QR anzeigt. Inhalt des QR: JSON
|
||||
`{"url": "...", "token": "..."}`. Wenn das zusammen > 1 Tag Aufwand wird: weglassen —
|
||||
manuelles Einfügen ist die beschlossene, ausreichende Lösung.
|
||||
7. **iOS-Sideload:** `npx cap open ios`, in Xcode Signing mit eigener Apple-ID, aufs Gerät bauen.
|
||||
7. **iOS-Sideload:** statt Xcode von Hand jetzt `bash companion-app/scripts/ios-signieren.sh`
|
||||
(baut Webbündel, synchronisiert die Hülle, archiviert signiert, exportiert die `.ipa`).
|
||||
Die Team-Kennung steht im Skript, weil `ios/` gitignored ist und jede in Xcode geklickte
|
||||
Einstellung beim nächsten `npx cap add ios` verschwinden würde.
|
||||
⚠️ **Einmalige Voraussetzung, die kein Skript herstellen kann:** das iPhone muss dem Team
|
||||
bekannt sein — Kabel anschließen und vertrauen, oder UDID unter developer.apple.com
|
||||
eintragen. Sonst: „Your team has no devices from which to generate a provisioning profile".
|
||||
⚠️ Entscheidungspunkt für den Besitzer: mit kostenlosem Apple-Konto läuft die Signatur nach
|
||||
**7 Tagen** ab (App neu aufspielen); ein bezahltes Entwicklerkonto (99 €/Jahr) macht 1 Jahr.
|
||||
Bei 7-Tage-Schmerz ist die PWA-Stufe die Alltagslösung, Capacitor das Extra für Keychain/QR.
|
||||
|
||||
@@ -76,6 +76,11 @@ dort niemals Markendateien ablegen.
|
||||
(Keychain/Keystore) ist dagegen bereits vollständig angebunden
|
||||
(`src/api/ablageNativ.ts`, von `main.tsx` aktiviert) und wird automatisch
|
||||
aktiv, sobald die Hülle existiert
|
||||
- Signierte `.ipa`: `scripts/ios-signieren.sh` baut und signiert in einem
|
||||
Durchlauf, **sobald das iPhone dem Entwicklerteam bekannt ist** (Kabel
|
||||
anschließen und vertrauen, oder UDID unter developer.apple.com eintragen).
|
||||
Vorher bricht Apple den Profilabruf ab - das ist die einzige verbleibende
|
||||
Hürde, der Gerätebau selbst läuft fehlerfrei durch
|
||||
- QR-Einrichtung als Alternative zum Einfügen des Tokens
|
||||
- Live-Ansicht der laufenden Fahrt: gebaut, aber über
|
||||
`src/funktionen.ts` abgeschaltet, bis der FMM003 echte Werte liefert
|
||||
|
||||
Executable
+75
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
# Baut die native iOS-Huelle und signiert sie zu einer installierbaren .ipa.
|
||||
# Nur auf einem Mac mit Xcode lauffaehig. Siehe ../../UMSETZUNGSPLAN.md Phase 10.
|
||||
#
|
||||
# Warum es dieses Skript gibt: `ios/` ist absichtlich gitignored (aus dem
|
||||
# Webbuendel jederzeit wiederherstellbar). Damit verschwindet aber auch jede
|
||||
# Signatureinstellung, die man in Xcode von Hand setzt, beim naechsten
|
||||
# `npx cap add ios` wieder. Die Team-Kennung gehoert deshalb hierher - in eine
|
||||
# versionierte Datei - und wird dem Build von aussen mitgegeben.
|
||||
#
|
||||
# Voraussetzung, die dieses Skript nicht herstellen kann: das iPhone muss dem
|
||||
# Entwicklerteam bekannt sein. Apple erzeugt ein Development-Profil nur fuer
|
||||
# konkrete Geraete. Also entweder das iPhone per Kabel anschliessen und
|
||||
# vertrauen (Xcode meldet die Geraetekennung dann selbst an), oder die UDID
|
||||
# unter developer.apple.com/account eintragen. Ohne das bricht der Archivschritt
|
||||
# mit "Your team has no devices" ab - das ist kein Fehler im Projekt.
|
||||
set -euo pipefail
|
||||
|
||||
HIER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
APP="$(dirname "$HIER")"
|
||||
TEAM="${APPLE_TEAM_ID:-RMACS9VLS4}"
|
||||
AUSGABE="$APP/ios/build"
|
||||
ARCHIV="$AUSGABE/DataMetric360.xcarchive"
|
||||
|
||||
cd "$APP"
|
||||
|
||||
echo "==> Webbuendel bauen"
|
||||
npm run build
|
||||
|
||||
echo "==> Native Huelle synchronisieren"
|
||||
if [ ! -d ios ]; then
|
||||
echo "==> ios/ fehlt, wird neu erzeugt"
|
||||
npx cap add ios
|
||||
fi
|
||||
npx cap sync ios
|
||||
|
||||
echo "==> Archiv bauen und signieren (Team $TEAM)"
|
||||
rm -rf "$AUSGABE"
|
||||
mkdir -p "$AUSGABE"
|
||||
xcodebuild \
|
||||
-project ios/App/App.xcodeproj \
|
||||
-scheme App \
|
||||
-configuration Release \
|
||||
-destination 'generic/platform=iOS' \
|
||||
-archivePath "$ARCHIV" \
|
||||
-allowProvisioningUpdates \
|
||||
DEVELOPMENT_TEAM="$TEAM" \
|
||||
archive
|
||||
|
||||
# Die Exportart heisst seit Xcode 16 offiziell "debugging"; "development" ist
|
||||
# weiterhin als Synonym gueltig und funktioniert auch mit aelteren Xcode-
|
||||
# Versionen, deshalb bleibt es hier stehen.
|
||||
cat > "$AUSGABE/ExportOptions.plist" <<PLIST
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>method</key><string>development</string>
|
||||
<key>teamID</key><string>$TEAM</string>
|
||||
<key>signingStyle</key><string>automatic</string>
|
||||
<key>stripSwiftSymbols</key><true/>
|
||||
</dict>
|
||||
</plist>
|
||||
PLIST
|
||||
|
||||
echo "==> .ipa exportieren"
|
||||
xcodebuild -exportArchive \
|
||||
-archivePath "$ARCHIV" \
|
||||
-exportOptionsPlist "$AUSGABE/ExportOptions.plist" \
|
||||
-exportPath "$AUSGABE" \
|
||||
-allowProvisioningUpdates
|
||||
|
||||
echo
|
||||
echo "Fertig: $AUSGABE/App.ipa"
|
||||
echo "Aufs Geraet: xcrun devicectl device install app --device <UDID> $AUSGABE/App.ipa"
|
||||
Reference in New Issue
Block a user