Xcode-Lauf ohne Handgriffe: Version, Profile, Luftweg
Drei Schritte, die bisher am Entwickler hingen, laufen jetzt im Bau mit: - Versionsnummer aus der manifest.json ins Info.plist. Capacitors Vorlage setzt 1.0/1 und laesst es dabei - zwei nacheinander aufgespielte .ipa waren auf dem Geraet nicht zu unterscheiden. - Zwischengespeicherte Bereitstellungsprofile dieser App wegraeumen. -allowProvisioningUpdates zieht ein neues Profil nur, wenn kein passendes herumliegt; ein vorhandenes wird stillschweigend weiterbenutzt, auch wenn sich die Berechtigungen geaendert haben. Genau daran ist am 2026-08-29 eine Installation gescheitert, und mit der neuen App-Gruppe der Share-Erweiterung ist derselbe Fall wieder eingetreten. Entfernt wird nur, was zu dieser App gehoert; --profile-behalten ueberspringt es. - ios-luftweg.sh haengt am Ende des Baus. manifest.plist und Icons landen damit ohne zweiten Aufruf in auslieferung/, und der Schluss nennt die itms-services-Adresse zum Oeffnen in Safari. Ausserdem die Reihenfolge im Skript geradegezogen: der Kommentar zur Standort-Berechtigung stand ueber dem Share-Block statt ueber seinem eigenen Code. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -94,6 +94,17 @@ npx cap sync ios
|
||||
# Nur "WhenInUse": berechnet wird der Abstand zum geparkten Fahrzeug, waehrend
|
||||
# jemand die Standort-Seite ansieht. Hintergrundortung braucht die App nicht,
|
||||
# und was sie nicht braucht, soll sie auch nicht erfragen.
|
||||
echo "==> Standort-Berechtigung eintragen"
|
||||
PLIST="ios/App/App/Info.plist"
|
||||
GRUND="Zeigt auf der Standort-Karte, wie weit du vom geparkten Fahrzeug entfernt bist."
|
||||
if ! /usr/libexec/PlistBuddy -c "Set :NSLocationWhenInUseUsageDescription $GRUND" "$PLIST" 2>/dev/null; then
|
||||
/usr/libexec/PlistBuddy -c "Add :NSLocationWhenInUseUsageDescription string $GRUND" "$PLIST"
|
||||
fi
|
||||
/usr/libexec/PlistBuddy -c "Print :NSLocationWhenInUseUsageDescription" "$PLIST" >/dev/null || {
|
||||
echo "FEHLER: NSLocationWhenInUseUsageDescription liess sich nicht setzen." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Share-Erweiterung ins Xcode-Projekt haengen.
|
||||
#
|
||||
# Aus demselben Grund wie die Team-Kennung und der Standort-Schluessel oben:
|
||||
@@ -108,15 +119,55 @@ npx cap sync ios
|
||||
echo "==> Share-Erweiterung einrichten"
|
||||
node scripts/ios-teilen-einrichten.mjs
|
||||
|
||||
echo "==> Standort-Berechtigung eintragen"
|
||||
PLIST="ios/App/App/Info.plist"
|
||||
GRUND="Zeigt auf der Standort-Karte, wie weit du vom geparkten Fahrzeug entfernt bist."
|
||||
/usr/libexec/PlistBuddy -c "Set :NSLocationWhenInUseUsageDescription $GRUND" "$PLIST" 2>/dev/null \
|
||||
|| /usr/libexec/PlistBuddy -c "Add :NSLocationWhenInUseUsageDescription string $GRUND" "$PLIST"
|
||||
/usr/libexec/PlistBuddy -c "Print :NSLocationWhenInUseUsageDescription" "$PLIST" >/dev/null || {
|
||||
echo "FEHLER: NSLocationWhenInUseUsageDescription liess sich nicht setzen." >&2
|
||||
exit 1
|
||||
}
|
||||
# Versionsnummer aus der manifest.json in die App schreiben.
|
||||
#
|
||||
# Capacitors Vorlage setzt 1.0/1 und laesst es dabei - zwei nacheinander
|
||||
# aufgespielte .ipa sind auf dem Geraet dadurch nicht zu unterscheiden, und
|
||||
# man weiss nicht, welche gerade drauf ist. Dieselbe Zahl, die schon Panel,
|
||||
# OTA-Buendel und __APP_VERSION__ tragen (siehe VERSIONIERUNG.md): eine
|
||||
# Quelle, kein zweiter Ort zum Vergessen.
|
||||
echo "==> Versionsnummer eintragen"
|
||||
VERSION="$(node -p "require('../custom_components/audi_dashboard/manifest.json').version")"
|
||||
[ -n "$VERSION" ] || { echo "FEHLER: keine Version in der manifest.json." >&2; exit 1; }
|
||||
if ! /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $VERSION" "$PLIST" 2>/dev/null; then
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string $VERSION" "$PLIST"
|
||||
fi
|
||||
echo " $VERSION"
|
||||
|
||||
# Zwischengespeicherte Bereitstellungsprofile dieser App wegraeumen.
|
||||
#
|
||||
# `-allowProvisioningUpdates` zieht ein neues Profil nur, wenn kein passendes
|
||||
# herumliegt - ein vorhandenes wird stillschweigend weiterbenutzt, auch wenn
|
||||
# sich seither die Berechtigungen geaendert haben. Genau daran ist am
|
||||
# 2026-08-29 eine Installation gescheitert ("Integritaet konnte nicht
|
||||
# geprueft werden"): das eingebettete Profil kannte ein Geraet, das Team
|
||||
# hatte inzwischen zwei. Mit der App-Gruppe der Share-Erweiterung ist
|
||||
# derselbe Fall erneut eingetreten - jedes vor dem 2026-08-31 gezogene
|
||||
# Profil kennt sie nicht.
|
||||
#
|
||||
# Weggeraeumt wird nur, was zu dieser App gehoert (Bundle-ID im entpackten
|
||||
# Profil gesucht), nicht der ganze Ordner - dort liegen auch die Profile
|
||||
# anderer Projekte. Mit --profile-behalten laesst sich der Schritt
|
||||
# ueberspringen.
|
||||
if [ "${1:-}" != "--profile-behalten" ]; then
|
||||
echo "==> Alte Bereitstellungsprofile wegraeumen"
|
||||
PROFILE="$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles"
|
||||
if [ -d "$PROFILE" ]; then
|
||||
ANZAHL=0
|
||||
for datei in "$PROFILE"/*.mobileprovision; do
|
||||
[ -e "$datei" ] || continue
|
||||
if security cms -D -i "$datei" 2>/dev/null | grep -qF "app.datametric360"; then
|
||||
rm -f "$datei"
|
||||
ANZAHL=$((ANZAHL + 1))
|
||||
fi
|
||||
done
|
||||
echo " $ANZAHL entfernt - xcodebuild zieht sie gleich neu"
|
||||
else
|
||||
echo " keine vorhanden"
|
||||
fi
|
||||
else
|
||||
echo "==> Bereitstellungsprofile bleiben (--profile-behalten)"
|
||||
fi
|
||||
|
||||
echo "==> Archiv bauen und signieren (Team $TEAM)"
|
||||
rm -rf "$AUSGABE"
|
||||
@@ -161,7 +212,30 @@ xcodebuild -exportArchive \
|
||||
mkdir -p "$APP/auslieferung"
|
||||
cp "$AUSGABE/App.ipa" "$APP/auslieferung/App.ipa"
|
||||
|
||||
# Auslieferung ueber die Luft gleich mitschreiben.
|
||||
#
|
||||
# manifest.plist und die Installationsseite hingen bisher an einem zweiten,
|
||||
# von Hand aufzurufenden Skript - und ohne sie ist die frische .ipa auf dem
|
||||
# Telefon nicht installierbar, obwohl sie fertig im Repo liegt. Ein Schritt,
|
||||
# den man vergessen kann, gehoert in den Bau.
|
||||
#
|
||||
# Die Basis-Adresse ist die des Gitea-Repos: es liefert die Dateien bereits
|
||||
# ueber HTTPS mit oeffentlich vertrauenswuerdigem Zertifikat aus, was iOS
|
||||
# fuer diesen Weg zwingend verlangt (siehe ios-luftweg.sh). Ueberschreibbar
|
||||
# ueber LUFTWEG_BASIS, falls der Weg einmal ueber einen eigenen Host geht.
|
||||
echo "==> Auslieferung ueber die Luft vorbereiten"
|
||||
LUFTWEG_BASIS="${LUFTWEG_BASIS:-https://gitea.nothaft.cloud/paul/audi-app/raw/branch/main/companion-app/auslieferung}"
|
||||
bash "$HIER/ios-luftweg.sh" "$LUFTWEG_BASIS" auslieferung
|
||||
|
||||
echo
|
||||
echo "Fertig: $APP/auslieferung/App.ipa"
|
||||
echo "Ueber die Luft: bash scripts/ios-luftweg.sh https://<host>"
|
||||
echo "Per Kabel: xcrun devicectl device install app --device <UDID> $APP/auslieferung/App.ipa"
|
||||
echo "Version: $VERSION"
|
||||
echo
|
||||
echo "Noch zu tun:"
|
||||
echo " 1. git add companion-app/auslieferung && git commit && git push"
|
||||
echo " (die .ipa und manifest.plist muessen im Repo liegen, sonst kann"
|
||||
echo " das Telefon sie nicht laden)"
|
||||
echo " 2. Auf dem iPhone in Safari oeffnen:"
|
||||
echo " itms-services://?action=download-manifest&url=$LUFTWEG_BASIS/manifest.plist"
|
||||
echo
|
||||
echo "Per Kabel stattdessen: xcrun devicectl device install app --device <UDID> $APP/auslieferung/App.ipa"
|
||||
|
||||
Reference in New Issue
Block a user