Debugger kann sich wieder anhängen: Neusignieren war überflüssig
Xcode meldete beim Start "Could not attach to pid — ensure that scarriffle has permission to debug Onyx". Ursache war mein eigener Build-Schritt: er signierte die App mit Onyx.entitlements neu, und darin fehlt get-task-allow — die Entitlement, die das Anhängen eines Debuggers überhaupt erlaubt. Xcode setzt sie im Debug-Build selbst; mein Neusignieren entfernte sie stillschweigend wieder. Die Reihenfolge im Bauprotokoll zeigt, dass der Schritt gar nicht nötig war: CodeSign OnyxHelper (Zeile 943) PhaseScriptExecution (Zeile 1092) CodeSign Onyx.app (Zeile 1743) Xcode signiert die App als Letztes, nach dem Skript. Damit repariert es das Siegel von selbst, das durch das Einbetten des Helfers bricht — mein Neusignieren war ein Nachbau von etwas, das ohnehin passiert, nur ohne die Entitlements, die Xcode beilegt. Der Schritt kopiert jetzt nur noch und signiert ausschließlich den Helfer, der sein eigenes Siegel braucht. Nachgeprüft: App-Siegel gültig, get-task-allow im Debug vorhanden, Helfer trägt den richtigen Bezeichner und weiterhin keine Entitlements. Dass get-task-allow auch im Release-Build steht, ist kein Fehler: Xcode legt sie bei jedem mit einem Development-Zertifikat signierten Build bei. Mit einem Developer-ID-Zertifikat entfällt sie — das kommt in Phase 9 mit der Notarisierung.
This commit is contained in:
@@ -307,7 +307,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "APP=\"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH\"\nmkdir -p \"$APP/MacOS\" \"$APP/Library/LaunchDaemons\"\ncp \"$BUILT_PRODUCTS_DIR/OnyxHelper\" \"$APP/MacOS/OnyxHelper\"\ncp \"$SRCROOT/OnyxHelper/com.scarriffleservices.onyx.helper.plist\" \\\n \"$APP/Library/LaunchDaemons/\"\n# Der Helfer wird eigenständig signiert — die Signatur der App deckt\n# ihn nicht ab, und ohne gültige eigene Signatur lehnt launchd ihn ab.\n#\n# `-i` ist Pflicht: Xcode signiert Kommandozeilenprogramme sonst mit\n# dem Produktnamen (\"OnyxHelper\") als Bezeichner. Die App prüft aber\n# auf com.scarriffleservices.onyx.helper und würde ihren eigenen\n# Helfer ablehnen.\ncodesign --force --options runtime --timestamp=none \\\n -i com.scarriffleservices.onyx.helper \\\n --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" \"$APP/MacOS/OnyxHelper\"\n\n# Das Kopieren passiert nach Xcodes Signatur und bricht damit das\n# Siegel des App-Bundles (\"nested code is modified or invalid\").\n# Deshalb zum Schluss die App selbst neu signieren — mit denselben\n# Entitlements, sonst verliert sie App-Group, WeatherKit und die\n# TCC-Berechtigungen.\ncodesign --force --options runtime --timestamp=none \\\n --entitlements \"$SRCROOT/Onyx/Onyx.entitlements\" \\\n --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" \\\n \"$BUILT_PRODUCTS_DIR/$WRAPPER_NAME\"\n";
|
shellScript = "APP=\"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH\"\nmkdir -p \"$APP/MacOS\" \"$APP/Library/LaunchDaemons\"\ncp \"$BUILT_PRODUCTS_DIR/OnyxHelper\" \"$APP/MacOS/OnyxHelper\"\ncp \"$SRCROOT/OnyxHelper/com.scarriffleservices.onyx.helper.plist\" \\\n \"$APP/Library/LaunchDaemons/\"\n# Der Helfer wird eigenständig signiert — die Signatur der App deckt\n# ihn nicht ab, und ohne gültige eigene Signatur lehnt launchd ihn ab.\n#\n# `-i` ist Pflicht: Xcode signiert Kommandozeilenprogramme sonst mit\n# dem Produktnamen (\"OnyxHelper\") als Bezeichner. Die App prüft aber\n# auf com.scarriffleservices.onyx.helper und würde ihren eigenen\n# Helfer ablehnen.\ncodesign --force --options runtime --timestamp=none \\\n -i com.scarriffleservices.onyx.helper \\\n --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" \"$APP/MacOS/OnyxHelper\"\n\n# Kein Neusignieren der App hier: Xcode signiert sie als letzten\n# Schritt, nach diesem Skript. Das repariert das Siegel von selbst\n# und legt im Debug-Build auch get-task-allow bei, ohne die im\n# Skript nachzubauen wäre — nachgemessen an der Reihenfolge im\n# Bauprotokoll (PhaseScriptExecution vor CodeSign Onyx.app).\n";
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,109 @@
|
|||||||
{
|
{
|
||||||
"sourceLanguage" : "en",
|
"sourceLanguage" : "en",
|
||||||
"strings" : {
|
"strings" : {
|
||||||
"mixer.name" : { "localizations" : {
|
"" : {
|
||||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Audio-Mixer" } },
|
|
||||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Audio mixer" } } } },
|
},
|
||||||
"mixer.on" : { "localizations" : {
|
"%lld %%" : {
|
||||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Mixer einschalten" } },
|
"comment" : "A row of controls for adjusting the volume and muting a process.",
|
||||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Turn mixer on" } } } },
|
"isCommentAutoGenerated" : true
|
||||||
"mixer.off" : { "localizations" : {
|
},
|
||||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Mixer ausschalten" } },
|
"mixer.name" : {
|
||||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Turn mixer off" } } } },
|
"localizations" : {
|
||||||
"mixer.off.explain" : { "localizations" : {
|
"de" : {
|
||||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Regelt die Lautstärke einzelner Programme, auch über 100 %." } },
|
"stringUnit" : {
|
||||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Sets the volume of individual apps, including above 100%." } } } },
|
"state" : "translated",
|
||||||
"mixer.off.warning" : { "localizations" : {
|
"value" : "Audio-Mixer"
|
||||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Dafür greift Onyx in den Tonweg der ausgewählten Programme ein. Beim Ausschalten wird der ursprüngliche Zustand sofort wiederhergestellt." } },
|
}
|
||||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Onyx intercepts the audio path of the selected apps to do this. Turning it off restores the original state immediately." } } } },
|
},
|
||||||
"mixer.noProcesses" : { "localizations" : {
|
"en" : {
|
||||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Kein Programm gibt gerade Ton aus" } },
|
"stringUnit" : {
|
||||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "No app is playing audio" } } } }
|
"state" : "translated",
|
||||||
|
"value" : "Audio mixer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mixer.noProcesses" : {
|
||||||
|
"localizations" : {
|
||||||
|
"de" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Kein Programm gibt gerade Ton aus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "No app is playing audio"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mixer.off" : {
|
||||||
|
"localizations" : {
|
||||||
|
"de" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Mixer ausschalten"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Turn mixer off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mixer.off.explain" : {
|
||||||
|
"localizations" : {
|
||||||
|
"de" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Regelt die Lautstärke einzelner Programme, auch über 100 %."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Sets the volume of individual apps, including above 100%."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mixer.off.warning" : {
|
||||||
|
"localizations" : {
|
||||||
|
"de" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Dafür greift Onyx in den Tonweg der ausgewählten Programme ein. Beim Ausschalten wird der ursprüngliche Zustand sofort wiederhergestellt."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Onyx intercepts the audio path of the selected apps to do this. Turning it off restores the original state immediately."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mixer.on" : {
|
||||||
|
"localizations" : {
|
||||||
|
"de" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Mixer einschalten"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Turn mixer on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"version" : "1.0"
|
"version" : "1.1"
|
||||||
}
|
}
|
||||||
14
project.yml
14
project.yml
@@ -119,15 +119,11 @@ targets:
|
|||||||
-i com.scarriffleservices.onyx.helper \
|
-i com.scarriffleservices.onyx.helper \
|
||||||
--sign "$EXPANDED_CODE_SIGN_IDENTITY" "$APP/MacOS/OnyxHelper"
|
--sign "$EXPANDED_CODE_SIGN_IDENTITY" "$APP/MacOS/OnyxHelper"
|
||||||
|
|
||||||
# Das Kopieren passiert nach Xcodes Signatur und bricht damit das
|
# Kein Neusignieren der App hier: Xcode signiert sie als letzten
|
||||||
# Siegel des App-Bundles ("nested code is modified or invalid").
|
# Schritt, nach diesem Skript. Das repariert das Siegel von selbst
|
||||||
# Deshalb zum Schluss die App selbst neu signieren — mit denselben
|
# und legt im Debug-Build auch get-task-allow bei, ohne die im
|
||||||
# Entitlements, sonst verliert sie App-Group, WeatherKit und die
|
# Skript nachzubauen wäre — nachgemessen an der Reihenfolge im
|
||||||
# TCC-Berechtigungen.
|
# Bauprotokoll (PhaseScriptExecution vor CodeSign Onyx.app).
|
||||||
codesign --force --options runtime --timestamp=none \
|
|
||||||
--entitlements "$SRCROOT/Onyx/Onyx.entitlements" \
|
|
||||||
--sign "$EXPANDED_CODE_SIGN_IDENTITY" \
|
|
||||||
"$BUILT_PRODUCTS_DIR/$WRAPPER_NAME"
|
|
||||||
# Bewusst ohne outputFiles: mit ihnen überspringt Xcode den Schritt,
|
# Bewusst ohne outputFiles: mit ihnen überspringt Xcode den Schritt,
|
||||||
# solange die Plist unverändert ist — auch wenn sich das Programm oder
|
# solange die Plist unverändert ist — auch wenn sich das Programm oder
|
||||||
# die Signaturvorgaben geändert haben.
|
# die Signaturvorgaben geändert haben.
|
||||||
|
|||||||
Reference in New Issue
Block a user