Skip to content
iOS IPA Inspector

IPA Inspector: open any iOS build without installing it

Drop an .ipa to read its bundle ID, version, frameworks, and provisioning — plus a full security analysis. Entirely in your browser.

On-device parsing No upload required

100% client-side

Parsed with JSZip in your browser. Nothing is uploaded, logged, or stored on a server.

Inspect + analyze

Bundle ID, version, frameworks and provisioning, plus a one-click security analysis tab.

Security scan

Findings, hardcoded secrets, Mach-O binary protections, and a full privacy-permission audit.

Frequently asked questions

How do I open an IPA file online?

Drop the .ipa on the inspector above and it is parsed in your browser. You get the bundle identifier, version and build, minimum iOS version, device families, architectures, frameworks and the embedded provisioning profile without installing the app or owning a Mac. An .ipa is also an ordinary zip archive, so renaming it to .zip and unarchiving it gives you the Payload/YourApp.app bundle to browse by hand.

What is inside an IPA file?

A Payload/ folder containing exactly one .app bundle — the directory iOS installs on the device. Inside it are the compiled Mach-O executable, a binary Info.plist holding the app's metadata, Assets.car with the compiled images and icons, a Frameworks/ folder for embedded frameworks and dylibs, _CodeSignature/ with a hash for every resource, and embedded.mobileprovision, the provisioning profile the build was signed with.

Is my IPA uploaded to a server?

No. The archive is unpacked and parsed in the page with JavaScript, so the file never leaves your machine and nothing is logged or stored. That also means you can inspect a build under NDA without it touching anyone's server. The practical ceiling is 250 MB per file, which is where in-browser parsing stops being comfortable.

How do I find an app's bundle ID, version and minimum iOS version?

All three live in the Info.plist inside the .app bundle, which Xcode writes as a binary plist, so a text editor shows mostly gibberish. The inspector decodes it and reports CFBundleIdentifier as the bundle ID, CFBundleShortVersionString with CFBundleVersion as the version and build number, and MinimumOSVersion as the oldest iOS release the build will run on.

Why won't my IPA install on a tester's iPhone?

Usually because that device is not in the provisioning profile the build was signed with. Ad Hoc and Development profiles only install on devices whose UDIDs are listed in the profile, so check the profile's device count and expiry date, then check the minimum iOS version against the tester's phone. Adding a device means registering its UDID in the Apple Developer portal and rebuilding. Re-signing the existing .ipa is not required if you can build again.

Can I see the entitlements and provisioned devices in an IPA?

The inspector summarises the embedded profile: its type (Development, Ad Hoc, Enterprise or App Store), the team it belongs to, the expiry date with days remaining, how many devices it covers and how many entitlements it grants. For the full UDID list and the complete entitlement dictionary, take embedded.mobileprovision out of the bundle and open it in BetaDrop's provisioning profile decoder.

Does the IPA inspector check app security?

Yes. The Security Analysis tab runs a static pass in your browser: App Transport Security configuration, potential hardcoded secrets in bundled plists and text resources, Mach-O binary protections (PIE, ARC, stack canary, 64-bit, FairPlay encryption) and an audit of every privacy permission the app declares. It is fast triage, not a replacement for a full security review. A clean report is not a guarantee, and a flag is not always exploitable.

betadrop · ipa-inspector files never leave your browser

What an .ipa file actually is

An .ipa is a zip archive with a fixed shape: a Payload/ folder holding exactly one .app bundle, which is the directory iOS installs on the device. Rename the file to .zip and any unarchiver will open it. The inspector above does the same thing in the page and then reads the parts that matter, so you do not have to dig through the bundle by hand, or own a Mac to look inside a build at all.

Inside Payload/YourApp.app there are six things worth knowing about:

  • The Mach-O executable is the compiled app, named by CFBundleExecutable. Its header records which CPU architectures the build contains and which hardening features the compiler applied.
  • Info.plist is the bundle's metadata dictionary: identifier, version, minimum iOS version, device families, permission strings, URL schemes. Xcode writes it as a binary plist, which is why opening it in a text editor shows mostly gibberish.
  • Assets.car is the compiled asset catalogue holding icons and images, and usually one of the two largest files in the bundle.
  • Frameworks/ holds embedded .framework bundles and .dylib files: your own dynamic frameworks, third-party SDKs, and on older deployment targets a copy of the Swift runtime.
  • _CodeSignature/CodeResources is a manifest of hashes covering every resource in the bundle. Edit one file after signing and its hash no longer matches, so iOS refuses the install.
  • embedded.mobileprovision is the provisioning profile the build was signed with, wrapped in a signed container. This is the file that decides which devices may install the app.

One thing that surprises people: a build you exported yourself is not encrypted. FairPlay encryption is applied when Apple distributes an app through the App Store, not by Xcode. Your own ad-hoc export is a readable zip, which is why a browser can take it apart, and why anyone you send the file to can do the same. Treat an .ipa as legible to whoever holds it.

What the inspector reads, and why each field matters

Dropping a build in unpacks the archive, decodes the binary Info.plist, reads the Mach-O header of the executable and summarises the embedded profile. Here is what each headline field is for.

FieldRead fromWhy it matters
Bundle identifierCFBundleIdentifier in Info.plistHas to match the App ID on the profile that signed the build. It is also the app's identity on the device: a second build sharing the identifier replaces the first rather than installing beside it.
Version and buildCFBundleShortVersionString, CFBundleVersionThe version is what testers quote in bug reports; the build number is what actually distinguishes the four different binaries you all call “1.4”.
Minimum iOS versionMinimumOSVersionA device running an older iOS than this cannot install the build. First thing to check when one tester in five reports a failure and the rest are fine.
Device familiesUIDeviceFamilyWhich hardware the build targets: iPhone, iPad, Apple TV, Apple Watch, Mac Catalyst or Vision Pro.
ArchitecturesMach-O header of the executablearm64 and arm64e are device slices. An x86_64-only binary is almost always a simulator build, which will never install on a phone no matter what you do to the profile.
Provisioning profileembedded.mobileprovisionType (Development, Ad Hoc, Enterprise or App Store), team, expiry date and how many devices it covers. This is what decides whether a given tester can install at all.
EntitlementsEntitlements dictionary in the profileThe capabilities the signature grants: push notifications, app groups, keychain sharing, associated domains. The inspector counts them; the profile decoder lists them.
Privacy permissionsNS…UsageDescription keys in Info.plistEvery permission the app can ask for, with the sentence the user is shown. iOS terminates an app that requests a permission whose usage string is missing.
URL schemesCFBundleURLTypesThe deep-link entry points any other app on the device can invoke. Worth reading on a build you did not compile yourself.
Size by directoryZip entry tableWhere the megabytes went (asset catalogue, embedded frameworks or the binary), plus install size against compressed download size.

The two fields most people need in a hurry are the bundle identifier and the build number: the first because it has to match the App ID on the signing profile, the second because “1.4” means nothing once four builds of 1.4 exist. Both are one click to copy.

Provisioned devices decide whether a tester can install

The most common reason a perfectly good .ipa refuses to install is that the tester's device is not in the provisioning profile. Ad Hoc and Development profiles carry a list of UDIDs, one per registered device. At install time iOS compares the device's UDID against that list, and if it is missing the install fails with a message that never names the real cause.

The other profile shapes behave differently, which is why the inspector labels which of the four it found. An Enterprise (In-House) profile provisions all devices and carries no list at all: that is what makes enterprise builds install anywhere, and why Apple restricts the programme to internal employee distribution. An App Store profile has no device list either, because the store re-signs the app on the way out. A Development profile lists devices too, but is meant for the machines your team debugs on.

Two things on the profile card are worth checking every time. The device count tells you how far the build can reach: Apple caps ad-hoc registrations at 100 devices per product type per membership year, and slots only free up at renewal. The expiry date tells you how long the build stays usable: when a profile expires, copies already installed stop launching, not just new installs.

The inspector reports the profile type, team, expiry with days remaining, and how many devices and entitlements it covers. To read the actual UDID list or the full entitlement dictionary, take embedded.mobileprovision out of the bundle and open it in the provisioning profile decoder, which lists and copies every device. To collect a tester's UDID in the first place, send them the UDID checker; it takes a couple of taps on their phone.

Questions an inspection answers

Most people open an .ipa because something has already gone wrong. These are the usual cases and where to look.

One tester cannot install the build
Check the minimum iOS version against their phone, then the profile's device count and expiry. Between them those two account for most failures.
The app installs but will not launch
An expired profile is the usual cause. Development and enterprise builds also need their signing identity trusted once on the device, under Settings → General → VPN & Device Management.
The build installs on nothing at all
Check that a code signature is present and that the architectures are device slices. A simulator build (zipped up and renamed, say) carries no _CodeSignature directory and cannot be installed over the air by any route.
Someone sent you an .ipa and you do not know what it is
Bundle identifier, display name, icon, version and build number identify it in seconds without installing anything or trusting the sender.
The download is much bigger than expected
The size breakdown attributes every byte to a directory, so you can see whether the weight is in Assets.car, in Frameworks/, or in the binary itself.
You need to know what a third-party build does
Declared privacy permissions, custom URL schemes, embedded frameworks and App Transport Security settings are all readable without running the app once.

Beyond the metadata, the Security Analysis tab runs a static pass over the bundle: App Transport Security configuration, potential hardcoded secrets in bundled plists and text resources, Mach-O protections (PIE, ARC, stack canary, 64-bit, FairPlay encryption) and an audit of every privacy permission the app declares. It is triage rather than a penetration test (a clean report is not a guarantee and a flag is not always exploitable), but it catches the obvious problems, an API key committed into a bundled JSON file being the most common of them.

Everything runs in your browser

The inspector does not upload your build. The archive is unpacked and parsed in the page with JavaScript, so the file stays on your machine: you can inspect a client's build under NDA without it touching anyone's server, and there is no account to create. The practical limit is 250 MB per file, which is where in-browser parsing stops being comfortable. If the summary does not cover what you need, the Explorer tab browses the complete file tree with text and hex viewers.

Once the build checks out

The next step is usually getting it onto a tester's phone. BetaDrop turns a signed .ipa into an over-the-air install link and QR code: it generates the itms-services manifest iOS needs, so the tester installs straight from Safari with no App Store review and no tester account. If you are unsure whether your build is signed the right way for that, can you sign an IPA online? covers when re-signing is genuinely needed and when rebuilding is the shorter road. For the Android half of the same job, the APK inspector reads the binary AndroidManifest.xml the same way: package name, SDK levels, permissions, components and native ABIs.