#!/usr/bin/env bash # Bereitet die Installation ueber die Luft vor: legt neben der signierten .ipa # die manifest.plist und eine kleine Installationsseite ab. # # bash scripts/ios-luftweg.sh https://mein-mac.tailnetname.ts.net # # Warum das noetig ist: iOS installiert eine App nur dann ueber die Luft, wenn # ein itms-services-Link auf eine manifest.plist zeigt, die wiederum die # Adresse der .ipa enthaelt. Beide Adressen muessen ueber **HTTPS mit einem # oeffentlich vertrauenswuerdigen Zertifikat** erreichbar sein - einfaches HTTP # und selbstsignierte Zertifikate lehnt iOS kommentarlos ab. Home Assistant # unter /local/ genuegt dafuer nicht, das laeuft im Tailnet unverschluesselt. # # Passend dazu und ohne offenen Port: `tailscale serve` liefert ein echtes # Let's-Encrypt-Zertifikat auf ..ts.net aus. Voraussetzung # ist, dass in der Tailscale-Verwaltung HTTPS-Zertifikate aktiviert sind. # # tailscale serve --bg ios/build/luftweg # # Danach den ausgegebenen Link auf dem iPhone in **Safari** oeffnen (andere # Browser reichen itms-services nicht an das System weiter). set -euo pipefail if [ $# -lt 1 ]; then echo "Aufruf: bash scripts/ios-luftweg.sh [zielordner]" >&2 echo "Beispiel: bash scripts/ios-luftweg.sh https://mein-mac.tailnetname.ts.net" >&2 echo "Gitea: bash scripts/ios-luftweg.sh \\" >&2 echo " https://gitea.nothaft.cloud/paul/audi-app/raw/branch/main/companion-app/auslieferung \\" >&2 echo " auslieferung" >&2 exit 1 fi BASIS="${1%/}" if [ "${BASIS#https://}" = "$BASIS" ]; then echo "FEHLER: Die Basis-Adresse muss mit https:// beginnen." >&2 echo "iOS verweigert die Installation ueber die Luft ueber unverschluesseltes HTTP." >&2 exit 1 fi HIER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" APP="$(dirname "$HIER")" IPA="$APP/auslieferung/App.ipa" # Zweites Argument erlaubt es, direkt in den versionierten Ordner zu schreiben - # noetig, wenn nicht ein eigener Host ausliefert, sondern das Repository selbst. ZIEL="$APP/${2:-ios/build/luftweg}" [ -f "$IPA" ] || { echo "FEHLER: $IPA fehlt - erst scripts/ios-signieren.sh laufen lassen." >&2; exit 1; } # Version aus der .ipa selbst lesen statt sie hier zu wiederholen: zwei Quellen # fuer dieselbe Angabe waeren eine zu viel. AUSPACK="$(mktemp -d)" trap 'rm -rf "$AUSPACK"' EXIT unzip -q "$IPA" -d "$AUSPACK" PLIST="$(find "$AUSPACK/Payload" -maxdepth 2 -name Info.plist | head -1)" KENNUNG="$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "$PLIST")" VERSION="$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$PLIST")" mkdir -p "$ZIEL" [ "$IPA" -ef "$ZIEL/App.ipa" ] || cp "$IPA" "$ZIEL/App.ipa" cp "$APP/public/symbol-192.png" "$ZIEL/symbol-192.png" cp "$APP/public/symbol-512.png" "$ZIEL/symbol-512.png" # Die Adressen tragen die Version als Anhaengsel (?v=...). Sie zeigen sonst bei # jedem Bau auf dieselbe Zeichenkette, und der Installations-Dienst von iOS haelt # eine einmal geholte .ipa dann fuer schon bekannt - sichtbar als Wolke mit Pfeil, # die nie fertig wird, oder als "kann nicht installiert werden". Dieselbe Vorsorge # trifft das Panel seit jeher fuer sein eigenes Buendel (siehe ota.ts). cat > "$ZIEL/manifest.plist" < items assets kindsoftware-package url$BASIS/App.ipa?v=$VERSION kinddisplay-image url$BASIS/symbol-192.png?v=$VERSION kindfull-size-image url$BASIS/symbol-512.png?v=$VERSION metadata bundle-identifier$KENNUNG bundle-version$VERSION kindsoftware titleDataMetric360 PLISTENDE # Das kaufmaennische Und muss in HTML maskiert werden, sonst schneidet Safari # den Link hinter dem url-Parameter ab. cat > "$ZIEL/index.html" < DataMetric360 installieren

DataMetric360

Version $VERSION

Installieren

In Safari oeffnen. Nach dem Antippen fragt iOS einmal nach,
danach erscheint die App auf dem Startbildschirm.

HTMLENDE echo "Ordner fertig: $ZIEL" echo echo "Wenn ein eigener Host ausliefert:" echo " tailscale serve --bg $ZIEL" echo " dann auf dem iPhone in Safari oeffnen: $BASIS/" echo # Gitea liefert rohe Dateien grundsaetzlich als text/plain aus - die # index.html wird dort also als Quelltext angezeigt statt gerendert. Deshalb # hier zusaetzlich der fertige Link zum Einfuegen in die Safari-Adresszeile; # der funktioniert unabhaengig davon, ob eine Seite drumherum existiert. echo "Ohne Seite (z. B. aus dem Repository heraus) direkt in Safari einfuegen:" echo " itms-services://?action=download-manifest&url=$BASIS/manifest.plist"