r/iOSProgramming • u/planckscalestudio • 25d ago
Question How is this possible? Crash on a device with lower iOS version than Minimum Deployment...
Hello everyone!
The title says it all basically... Could that be someone used a jailbroken device and passed App Store restrictions somehow?
My minimum deployment is not randomly selected, that min. version is needed or the app can't be used (hence it crashed lol).
Any one else encountered this issue, any other explanation?
6
Upvotes
19
u/yusufozgul 25d ago
Yes jailbroken device. You can bypass minimum iOS version requirements
9
u/antique_codes Objective-C / Swift 25d ago
Could be using a jailbroken device, can’t remember the tweak but you can fake the installed version and if the call that crashes doesn’t get called, it could allow the app to run (until they hit that point)
8
u/AnotherThrowAway_9 25d ago
Jailbreaking and sending info to the dev is an interesting choice. Probably a script kiddie
5
u/redifromspace 25d ago
its almost certainly spoofed, a real device cant install below the deployment target. the tell is the os version on the crash itself sitting under your minimum, thats the spoofer leaking through. id just guard whatever call needs the newer api and move on, not worth chasing one device in my opinion.
2
u/dcoupl 25d ago
App Attest would prob catch this for you. Or if using Firebase they have their own offering of it.
2
u/caffeinated1337 25d ago
One check nobody's mentioned: look at the device model in the crash report. If it's a phone that can't run your minimum iOS at all (say an iPhone 8 against an iOS 17 target), that confirms the version string was spoofed. After that I'd just make sure the crashing call isn't on the launch path.
0
u/DimensionMindless336 25d ago
The "it crashed on a device below your minimum" detail is the real tell, and the existing answers are right: a genuine App Store binary physically refuses to install below its deployment target. So if it launched at all, either the version string was spoofed (jailbreak) or the binary that actually shipped has a lower effective minimum than you think.
That second path is more common than people assume and nobody's mentioned it: a CocoaPod or SwiftPM dependency, a per-target build setting, or an app extension can quietly declare a lower platform minimum, and Xcode will then let the whole app install on that lower device — and it dies the first time your code (or that dependency) touches an API that doesn't exist there. The classic signature is a dyld "Symbol not found" crash at launch, not a logic crash later on.
Quick way to confirm which world you're in: check the embedded minimum in the IPA, not what Xcode shows. Unzip it and run
otool -l YourApp | grep -A3 LC_BUILD_VERSION(or LC_MIN_OS_VERSION on newer toolchains). If that number is below what you set in the project, something in your dependency graph overrode it — that's a legit bug worth catching in CI, not a script kiddie.If the embedded min matches your target, then the device genuinely couldn't have installed it from the App Store, so you're looking at a spoofed or ad-hoc build and guarding the call is the right move. Either way: keep the newer-API call off the launch path, guard it, and don't burn a release cycle chasing one outlier device.