Erweiterung wurde ohne Programm gebaut - Quelle hing in keiner Sources-Phase

An der fertigen .ipa gemessen: DataMetric360Share.appex enthielt nur
Info.plist, Signatur und Profil - keine ausfuehrbare Datei, obwohl
CFBundleExecutable eine versprach. Xcode meldet dabei nichts, der Bau gilt
als erfolgreich. Das Teilen-Blatt haette schlicht nicht funktioniert.

Ursache: addSourceFile() legt die Datei nur in die uebergebene Gruppe, wenn
man ihm eine mitgibt - an eine Sources-Phase haengt es sie dann nicht. Der
PBXBuildFile-Eintrag existierte, war aber verwaist, und alle Sources-Phasen
des Ziels blieben leer.

Die Quelle wird jetzt direkt beim Anlegen der Sources-Phase uebergeben.
Belegt am neu erzeugten Projekt: zwei Sources-Phasen, die der App mit
AppDelegate/SceneDelegate, die der Erweiterung mit ShareViewController.
This commit is contained in:
Paul Nothaft
2026-09-02 14:55:04 +02:00
parent 25aa118e4b
commit e04f97c247
@@ -139,12 +139,26 @@ try {
// Eigene Build-Phasen: ohne sie hat das Ziel keine Quelldateien und keine
// Ressourcen, und Xcode baut ein leeres Bündel.
projekt.addBuildPhase([], "PBXSourcesBuildPhase", "Sources", ziel.uuid)
//
// Die Quelle gehoert hier hinein und nicht in ein spaeteres addSourceFile:
// reicht man diesem eine Gruppe mit, legt es die Datei nur in die Gruppe
// (Navigator) und haengt sie an keine Sources-Phase. Das Ergebnis war ein
// .appex ganz ohne Programm - nur Info.plist und Signatur, obwohl
// CFBundleExecutable eines versprach (2026-09-02 an der fertigen .ipa
// gemessen). Xcode meldet dabei nichts; der Bau gilt als erfolgreich.
projekt.addBuildPhase(
["ShareViewController.swift"],
"PBXSourcesBuildPhase",
"Sources",
ziel.uuid,
)
projekt.addBuildPhase([], "PBXResourcesBuildPhase", "Resources", ziel.uuid)
projekt.addBuildPhase([], "PBXFrameworksBuildPhase", "Frameworks", ziel.uuid)
// Nur zur Anzeige in Xcode. Die Quelle ist oben bereits der Sources-Phase
// zugeordnet und steht deshalb hier nicht noch einmal.
const gruppe = projekt.addPbxGroup(
["ShareViewController.swift", "Info.plist", `${ZIEL_NAME}.entitlements`],
["Info.plist", `${ZIEL_NAME}.entitlements`],
ZIEL_NAME,
ZIEL_NAME,
)
@@ -154,8 +168,6 @@ try {
)
if (wurzel) projekt.addToPbxGroup(gruppe.uuid, wurzel)
projekt.addSourceFile("ShareViewController.swift", { target: ziel.uuid }, gruppe.uuid)
// Einstellungen, die `addTarget` nicht selbst setzt.
const konfigs = projekt.pbxXCBuildConfigurationSection()
for (const schluessel of Object.keys(konfigs)) {