iOS

    How do I find the missing 'sealed resource' (ITMS-90035)?

    A 2026 terminal running codesign verify on an iOS app bundle, printing a file modified line that names the exact sealed resource inside an embedded framework that broke the signature

    ITMS-90035 tells you a sealed resource is missing or invalid, but it does not always make clear which file broke the signature. The good news is that you do not have to guess: a single codesign command names the exact file that was added, removed, or modified after signing. Here is how to find it and what usually put it there.

    Short answer

    ITMS-90035, "a sealed resource is missing or invalid", means a file inside your signed app bundle changed after it was signed. To find the exact file, run codesign with verbose verification on the .app, which prints a line naming the modified, added, or missing resource. Per Apple's guidance on the Invalid Signature rejection, the cause is something altering the bundle after the signing step. Common offenders are a stray .DS_Store, an Info.plist edited by a build script, a file generated at runtime, or an extra file in an embedded framework, which is why hybrid frameworks trigger it most.

    What you should know

    • The seal covers every file: signing records a hash of each resource, so any later change invalidates it.
    • codesign names the file: verbose verification prints the exact modified, added, or missing resource.
    • CodeResources is the manifest: the bundle's _CodeSignature/CodeResources lists every sealed file and hash.
    • Hybrid frameworks are common culprits: copying web assets, plugins, or frameworks after signing breaks the seal.
    • The fix is a clean re-sign: correct the step that changed the bundle, then rebuild and re-sign.

    How do you find the exact missing or modified resource?

    Run verbose verification against the app bundle. The codesign tool checks every sealed file and, when one does not match, prints exactly which file and how it failed:

    codesign --verify --verbose=4 MyApp.app
    

    When the seal is broken, the output names the resource and the reason, for example:

    MyApp.app: a sealed resource is missing or invalid
    file modified: .../MyApp.app/Frameworks/SomeKit.framework/Info.plist
    

    The keywords to read are file modified, file added, and file missing. Each points at the exact path, so you go straight to the file rather than searching blind. You can also open the bundle's _CodeSignature/CodeResources, a plist that lists every sealed file with its hash, to see what the signature expected.

    What kinds of files break the seal?

    Anything that changes the bundle after signing. The table lists the usual offenders and how to handle each.

    File that breaks the sealWhy it happensFix
    A .DS_Store inside the bundleFinder added it, or a copy step included itRemove it and exclude it from copy phases
    A modified Info.plistA build script edited it after signingStop the post-sign edit
    A file generated at runtime in ResourcesThe app wrote it on first launchWrite generated files outside the app bundle
    An extra or unsigned file in a frameworkCopied in after the framework was signedKeep frameworks pristine and set them to Embed and Sign
    A non-standard framework layoutThe bundle structure is not what codesign expectsUse a standard framework bundle structure

    A quick way to catch the most common one is to search the bundle for stray metadata files:

    find MyApp.app -name '.DS_Store'
    

    Why do hybrid frameworks trigger it most?

    Because their build steps move files around after the app is signed. Cordova and Capacitor copy web assets and plugins into the bundle, Flutter ships its engine and an App.framework, and React Native bundles its own frameworks, and any step that writes into the .app after the signing phase changes a sealed resource. A framework that was signed separately and then had a file added, or an asset folder rewritten by a packaging script, produces the same missing-or-invalid result. The artwork and code are usually fine; it is the order of operations in the build that breaks the seal.

    How do you fix it once you find the file?

    Correct what changed the bundle, then re-sign cleanly. If the named file should not be there, such as a .DS_Store or a leftover artifact, remove it and stop the step that added it. If it is a file your app generates at runtime, move that output outside the bundle so it is not part of the signed contents. If it is inside a framework, set the framework to Embed and Sign so Xcode signs it during the build, and avoid editing it afterward. Then clean the build folder, rebuild the Release target, and export through Xcode's Organizer so Xcode re-signs the whole bundle from a clean state rather than you patching it by hand.

    What to watch out for

    The trap is re-signing the broken bundle by hand to make the error go away. That hides the cause and often creates new mismatches between the app and its nested frameworks, so fix the step that modified the bundle instead. Watch for build phases that run after signing and for tools that touch the .app during packaging, since those are the usual source. Code signing is part of build integrity, so a pre-submission scan such as PTKD.com (https://ptkd.com) reads the compiled IPA against OWASP MASVS and confirms the binary is properly signed, alongside its other checks. The limit is that the scan reports the signing state; codesign is the tool that names the specific file, and Xcode is where you correct it.

    What to take away

    • ITMS-90035 means a file in your signed bundle changed after signing; run codesign with verbose verification to name the exact file.
    • Read the file modified, file added, or file missing line, and check _CodeSignature/CodeResources for what the seal expected.
    • Common culprits are a stray .DS_Store, a post-sign Info.plist edit, a runtime-generated file, or an extra file in a framework, which is why hybrid builds hit it most.
    • Fix the step that changed the bundle, set frameworks to Embed and Sign, rebuild and re-sign through Xcode, and confirm with a pre-submission scan such as PTKD.com.
    • #itms-90035
    • #sealed-resource
    • #code-signing
    • #codesign
    • #hybrid-frameworks
    • #app-store-connect
    • #ios

    Frequently asked questions

    How do I find which sealed resource is missing or invalid?
    Run codesign with verbose verification against the app bundle, using the verify option at verbose level four. When a sealed file does not match, codesign prints the exact path and whether it was modified, added, or missing. You can also open the bundle's _CodeSignature/CodeResources plist, which lists every sealed file and its expected hash, to compare against what is actually in the bundle.
    What is the CodeResources file?
    It is the seal's manifest. Inside the bundle at _CodeSignature/CodeResources, it is a plist that records every file the signature covers along with a hash of each. When verification runs, codesign compares the current files against this list, and a mismatch is what produces the sealed resource missing or invalid error. Reading it shows you exactly which files the signature expected to find unchanged.
    Why do hybrid frameworks cause this error so often?
    Because their build steps write into the bundle after signing. Cordova and Capacitor copy web assets and plugins, Flutter ships an engine and App.framework, and React Native bundles its own frameworks, and any step that modifies the .app after the signing phase changes a sealed resource. A framework that had a file added after it was signed, or an asset folder rewritten by a packaging script, produces the same result.
    Can I just delete the offending file by hand?
    Only if the file should not be there, such as a .DS_Store or a leftover artifact, and even then you must re-sign afterward so the seal matches again. Hand-editing a signed bundle without re-signing leaves it broken, and patching the signature by hand tends to create new mismatches. The reliable path is to remove the cause, then rebuild and re-sign cleanly through Xcode.
    Does fixing a sealed-resource error require a new build?
    Yes. The signature covers the compiled bundle, so removing a stray file, stopping a post-sign edit, or re-signing a framework all change the build, and you re-sign and upload a new one. Clean the build folder, rebuild the Release target, and export through Xcode's Organizer so the whole bundle is signed from a clean state rather than patched after the fact.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free