PBXProj Unsigned Release

ID

swift.pbxproj_unsigned_release

Severity

high

Remediation Complexity

trivial

Remediation Risk

low

Remediation Effort

low

Resource

Reliability

Language

Swift

Tags

build-config, reliability

Description

Reports an Xcode project whose Release configuration leaves CODE_SIGN_IDENTITY empty or sets it to the literal "Don’t Code Sign". Shipping an unsigned binary defeats every downstream integrity check Apple’s distribution chain relies on — provisioning validation, notarisation, App Store ingestion, and on-device code-signature verification at launch.

// project.pbxproj
... /* Release */ = {
    isa = XCBuildConfiguration;
    buildSettings = {
        CODE_SIGN_IDENTITY = "";                   // FLAW (empty)
        CODE_SIGN_IDENTITY = "Don't Code Sign";    // FLAW (explicit)
        CODE_SIGN_IDENTITY = "Apple Distribution"; // OK
    };
    name = Release;
};

Rationale

The Xcode UI hides this setting under "Signing & Capabilities". A developer who selects "Don’t Code Sign" while debugging a provisioning issue can accidentally commit that as the Release default. The bug only surfaces at distribution time; in CI it surfaces when a build pipeline skips signing because the certificate is missing in the runner.

Every Release-named configuration in the file is inspected — projects that rename Release to something else (e.g. AppStore) are not covered.

Remediation

Set CODE_SIGN_IDENTITY to the appropriate signing identity for the target (typically "Apple Distribution" for App Store and ad-hoc builds, "Apple Development" only for Debug). Verify under Project → Target → Signing & Capabilities that the Release entry has a real team and certificate selected.