Shipping a macOS app that opens on someone else’s Mac
It ran perfectly here and refused to launch there. Two separate causes were stacked on top of each other, and each one hid the other.
The build worked. It launched, it ran, it did everything it was supposed to. Then it went to a friend's Mac and would not open at all.
It took two rounds to fix, because there were two independent failures stacked on top of each other. Fixing the first one changed the error message but not the outcome — which is exactly the kind of thing that makes you doubt the first fix.
Cause one: the wrong certificate
The app was signed with an Apple Development certificate. That certificate is valid on machines that hold it. On any other Mac, Gatekeeper sees a signature it cannot trace to a distribution identity and refuses:
"ProTools" cannot be opened because the developer cannot be verified.
The fix is a different certificate entirely — Developer ID Application — plus notarization, which means uploading the signed build to Apple, waiting for their automated scan, and then stapling the resulting ticket to the file so it verifies even offline.
One detail matters more than it looks: codesign without --deep does not sign the frameworks and dylibs nested inside the bundle. Sign only the outer app and notarization comes back Invalid with no useful explanation. Everything nested has to be signed first, inside out, each with a hardened runtime and a secure timestamp. Only then the outer app, with entitlements.
Cause two: the transfer flattened the bundle
With the signature fixed, the error changed:
The application "ProTools" can't be opened. (-10810)
Different failure, different cause. A .app is a folder full of symlinks and files that must keep their executable bit. Send that folder through a chat app, or let a zip tool repack it, and the executable bit and the symlinks quietly do not survive. What arrives looks like an app and is not one.
The answer is to send a .dmg. A disk image is a single file; its contents cannot be reorganised in transit. Open it, drag the app to Applications, done.
Why the Mac it was built on never revealed any of this
This is the part worth remembering.
Files created locally do not carry the com.apple.quarantine attribute. Gatekeeper's full path only runs on files that have it. So a locally built app gets a much softer check than a downloaded one — and "it works on my machine" is not evidence of anything at all.
The way to actually test is to add the attribute yourself before shipping:
xattr -w com.apple.quarantine \
"0081;$(printf '%x' "$(date +%s)");Safari;$(uuidgen)" ProTools.app
spctl --assess --type execute -vv ProTools.app
If that passes, the Mac on the other end will accept it too.
What the error message tells you
Ask for a screenshot. The wording narrows the cause immediately:
| Message | Cause |
|---|---|
| "damaged" / "cannot be verified" | signing or notarization |
| "can't be opened" (-10810) | they were sent a .app, not a .dmg |
| "requires macOS ..." | their system is older than the minimum |
Three sentences, three completely different fixes. Knowing which one you are looking at saves an afternoon.
ProTools

