Minimum iOS version support for RoboVM - ios

I just tried launching an App I'm building with RoboVM on my iPod Touch (2ng gen) using the "iOS Device App" launch configuration. It did a full build for the "thumbv7" target, uploaded some files, and during the VerifyingApplication step, it stopped with the following message:
'Launching ...' has encountered a problem.
An internal error occurred during: "Launching ...".
DeviceOSVersionTooLow
My iPod is running iOS v4.2.1 (8C148) and my app (at least the parts I wrote) only use functions available starting iOS 3.1 or earlier (CADisplayLink is the most "advanced" feature I use).
This leaves me with the following questions:
How are the iOS version requirements for my app determined? Is it specified in some config file (commenting out the UIRequiredDeviceCapabilities section in Info.plist.xml didn't help) or does RoboVM analyze my code and figure it out from there?
Does RoboVM itself have a minimum version requirement? If so, can I tweak it somehow?

After some more digging and testing, I have now come up with (what I believe to be) a practically complete answer to this question.
A quick disclaimer: I am still using RoboVM v1.5 and Xcode v6.4, since they work beautifully for my needs and I'm a strong believer in "if it ain't broke, don't fix it". So, some info here may be outdated.
There are two factors at play: Support for a specific device platform (ARMv6, ARMv7, ...) and support for a specific version of iOS.
RoboVM dropped compiler support for ARMv6 pretty early on, so other than compiling a version of an app with an old installation of RoboVM, there is not much that can be done to support ARMv6 devices now-a-days.
iOS version support is more flexible than that:
As of v1.0 beta 4, RoboVM's Info.plist.xml supports an entry called MinimumOSVersion like:
<key>MinimumOSVersion</key>
<string>5.0</string>
This entry determines whether the app is allowed to be installed on a device or not. If you set it higher than the device OS version and try to execute the app on the device, you will get the following error message during launch:
Launch failed. Check the RoboVM console for more information.
DeviceOSVersionTooLow
As such, I assume that this setting also determines whether the app is offered in the iTunes store for a specific device.
If you do not specify this key, it used to default to 5.0, but to fix some issue with XCode 7, the default was changed to 6.0 in September last year.
Note that this setting obviously does not guarantee that the app will run on a given device.
So much for the theory. Now for some actual experiments:
I was able to downgrade an iPhone 3GS to iOS v4.1.1 and tried to run the simplest possible RoboVM hello world app on it with MinimumOSVersion set to 4.1. The app would install fine, but would crash immediately without any debug log to the Eclipse console when launched. After upgrading the phone back to iOS v6.1.6, the app runs fine. So, v4.1.1 (and likely lower) is not supported any more by RoboVM v1.5 (and higher, I'd assume), even on an ARMv7 device.
I also got my hands on an iPad 1 running iOS v5.1.1, i.e. the latest available version of iOS for this device. With MinimumOSVersion set to 5.1.1, my full game app installs and runs fine on the device. But, when RoboVM tries to launch the app from the IDE, the launch fails with the following exception after installing the app on the device:
AppLauncher failed with an exception:
java.lang.RuntimeException: Launch failed: Unexpected response '' to command 'QListThreadsInStopReply'
at ...
I can run then the app by clicking its icon, though, and it works without a hitch, just debugging it (like seeing System.out in the Eclipse console) doesn't work.
Conclusion:
By setting MinimumOSVersion to 5.1.1 in Info.plist.xml, RoboVM v1.5 paired with Xcode v6.4 can support all iOS devices with an ARMv7 or better processor, provided they run iOS v5.1.1 or better (iOS v5.1.1 is available for all ARMv7 or better devices).
So, this setup can support all iOS devices released in 2009 or later, which only excludes the first two iPhones (1 and 3G) and iPod Touchs (1st and 2nd gen). iPhones can be supported starting with iPhone 3GS, iPod Touchs can be supported starting with the 3rd generation and all iPads can be supported.
For a great overview of iOS devices, you can take a look at the iOSSupportMatrix.

As Mario Zechner explains in the linked post, RoboVM supports iOS 7 and up at this time, and can also informally support iOS 6.
https://groups.google.com/d/msg/robovm/u6hk8kSFfuY/XEtQayXW6_sJ

Related

Built iOS app for iOS 10.0, but Testflight claims it requires iOS 12.1

I recently built an (universal) app for iOS in XCode 11.7 with deployment target set to iOS 10.0 (as per the Build Settings tab in XCode). Then I deployed that app to Testflight and was able to download and use it on a newer iPhone with the latest iOS.
However, when I tried to testflight it on my other iDevice (and old iPad 4th Gen that only runs iOS 10.3), Testflight told me that the app is only compatible with iOS 12.1 or higher. However, I've recently tested another app on Testflight built with (as far as I can tell) the exact same build settings using same MacBook and the same XCode, and that app installed on my iPad via Testflight without problems.
It sounds like the problem in App not compatible on iPhone 4s and 5 in Testflight and related posts, but my settings for "Build Active Architecture Only" are already set to "No" for Release.
I've already checked the Apple Compatiblity Matrix https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html but I am not using any special features.
There are only few things left I can think of
I implicitly (and without meaning to) use some feature of the newer iPhones that are not included in iOS 12.1 or below
I checked in the appstore that the app contains "medical information" (it's just anatomy drawings for students), so maybe this triggered an implicit requirement of Apple Health Kit (which does not run on iPad 4t Gen). This seems unlikely, however, as I only stated this in the App Store listing, not in XCode.
Somewhere in the settings, there is still one remaining switch left to "only support iOS 12.1 or higher" and I just have not found it, If so, please point out where that might be
The app that successfully installed on Testflight is an update for an older app that was published in late 2019, so maybe Apple forces new Apps to require iOS 12.1 or higher (since all apps have to be built against SDK 12.1 now) regardless of built settings, but updates for already existing apps are still allowed to run on lower iOS versions. Is this the case?
Or am I missing something entirely different?

What's the correct way in making an iOS 9 app backward compatible with iOS 6?

I am trying to create a simple webview. The person wants it to run on devices starting with iOS 6. I've set iOS Deployment Target at 6.1 and my base SDK is 9.3. I have it code-signed, provisions, etc.
I used a program called Deploymate to check if any conflicts would exist across the iOS versions. It passed.
I uploaded the IPA to Diawi. However, it crashes on my device (iOS 9) and says it "Could not be installed at this time". The simulator had no problems.
Is there anyway to diagnose this problem or have I skipped a step? I've seen other questions, but they pertain to iOS 7.

Cannot simulate any iOS scheme other than 7.0.3 in Simulator

I think the problem first occurred after I updated Xcode to version 5.0.2:
Whichever scheme I set in Xcode - whether it's iOS 5.0, 5.1 or 7.0 - when I build and run the project the simulator always launches my app in an iOS 7.0.3 environment (that's what the simulator's windows title states). So there is no way to test my app for downwards compatibility.
What's the problem here?
Is there some other trick that I need to perform in order to simulate my app in an iOS 5.1 environment?
After searching for solutions for hours I finally found the reason why I cannot select other iOS versions in the Simulator:
It's Mavericks!
In this post in the Apple Developer Forums (Developer account needed to access the forum!) an Apple employee states:
The iOS 5 simulators do not work on OS X 10.9 (Mavericks).
and he says the reason for that is:
The iOS simulator does not duplicate some of the low-level parts of iOS. For example, it uses the host OS X's kernel instead of trying to virtualize the iOS kernel. The iOS simulator requires that these subsystems look sufficiently similar between the simulated iOS and the host OS X. When a new host OS X changes too much it can break old simulators. At that point somebody makes an engineering and cost decision to either update the old simulator or drop support for it.
So if you have installed Mavericks (and do not downgrade if that's even possible) you have no option to run the Simulator with iOS versions < 6.
(If you want to test your app in the Simulator with iOS 6 and 6.1 SDK proceed as the other replies and comments on this page suggest: Go to XCode > Preferences > Downloads and download the corresponding simulator version in the section "Components".)
Check if YourTarget->Build Settings->Deployment->iOS Deployment Target is set to iOS7.0. If so, you need to decrease this value.
You must download to Xcode the iOS 5 SDK for the simulator.
Go:
XCode -> Preferences -> Downloads -> Components
And there you have the option of download the previous simulator.
After that, restart Xcode and before running is just select the version of iOS you want the simulator use:

XCode 4.2 and ipod 2nd generation

I'm trying to run my application on my old 2nd generation iPod Touch running iOS 4.2.1 to test it on a non-retina device.
It seems that I have all the certificates and provisioning profiles setup properly, everything works with my iPod Touch 4th generation running iOS 5.0.
However, it neither shows my app on the iPod's screen nor the iPod's installed applications list in Xcode. Without any explicit warning from Xcode.
Could you tell me if I should downgrade to Xcode 3 in order to run and test my application on the old device, or am I doing something wrong? Where should I check?
Thanks!
#borrrden is correct that such a device is fine (just tested on one myself, in fact, using Xcode 4.3.x).
My first guess (though it seems odd you wouldn't get an error) is that you are only building for armv7, which at some point became the default in Xcode (don't recall whether this was in 4.2 or 4.3). You need to make sure that your "valid architectures" and related build settings include both armv6 and armv7 if you are targeting that range of hardware.

switching from xcode3 to xcode4 - can't load programs onto older iPod Touch [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
iPhone app does not run on old device (3G, 3GS, …)
I've got a similar problem to this (iPhone app does not run on old device (3G, 3GS, ...)) but the workaround on that page doesn't do anything for me. I have been developing iOS apps on XCode3 and testing on an older second generation iPod Touch running iOS 4.2.1. Been trying the last couple of days to use XCode4 instead.
I'm able to build and run apps under XCode4 using the simulator, both ones that I initially developed under XCode3, as well as brand new XCode4 created "Hello World" type ones. However, when I try to put one on the actual hardware, it fails with little in the way of error messages. The debug window in XCode4 doesn't show anything amiss. The activity/status indicator in the top middle of XCode goes from "Building [AppName]" straight to "Finished Running [AppName]" but the app never is transferred or run on the device.
If I look at the iPod's console via Organizer I see a bunch of errors like:
Thu Jun 16 15:17:56 unknown lockdownd[16] <Error>: 2ff68000 handle_connection: Could not receive USB message #6 from Xcode. Killing connection
Thu Jun 16 15:17:56 unknown com.apple.mobile.lockdown[16] <Notice>: Could not receive size of message
and I'm guessing it's related to that. I've tried unplugging all other USB devices from my Mac but makes no difference. Tried rebooting both the device and the Mac, but again no difference.
I have adjusted the iOS deployment target to 4.2, so I don't think there's any problem there. The device shows up in Organizer with the green dot and a valid unexpired provisioning profile. Under code signing properties it looks like:
Code Signing Entity Don't Code Sign
Debug Don't Code Sign
Any iOS SDK iPhone Developer (currently matches...[profile I have installed])
Release Don't Code Sign
Any iOS SDK iPhone Developer (currently matches...[profile I have installed])
The device itself is showing up in the Schemes dropdown as:
[DeviceName] (4.2.1 overriding Base SDK to 5.0)
Anyone else running into a similar problem or have any suggestions?
Just to promote Thomas' comment to an answer, this can be caused by targeting a CPU architecture that your device doesn't support. The iPhone and iPhone 3G (along with iPod touches of the same generation) don't support armv7. Set the "Archiectures" build setting to include "armv6" to ensure the resulting fat binary contains armv6 code.
I had the same problem with XCode 4.1.1 and an Ipod Touch 2nd gen. I started with one of the templates and couldn't run it on my hardware. Found all the answers here on stackoverflow, but it's better to have all necessary steps in one spot:
You have to add armv6 to Architectures in your project settings (Build Settings tab). You can set it to "armv6 $(ARCHS_STANDARD_32_BIT)" or "armv6 armv7", it doesn't matter. $(ARCHS_STANDARD_32_BIT) is just a variable which equals "armv7" in the newest XCode.
Don't change the Base SDK, "Latest iOS (iOS5.0)" is fine. Under "Summary" change "Deployment Target" to 4.0 or whatever iOS version you want to have as a minimum version.
The newer templates in Xcode 4 have a standard setting in your Info.plist which you have to change. Search "Required device capabilities" and delete "armv7".
If you're doing steps 1+2 but forgot step 3, you get the "Could not receive USB message" errors in the device log and no error message otherwise in XCode. Why it does that, instead of showing you an error message that hints you to "Required device capabilities" is a different question.
In Short: Apple started to drop support for the armv6 platform with the update to iOS 4.3. Newer hardware runs with a different instruction set, armv7. If you want to support iOS 4 with XCode 4, you should really make sure that you also build your project for armv6 correctly with the steps above.
It looks like you have iOS 5.0 SDK installed. Am I reading that right? If so, that is governed by Apple Developer NDA and should not be discussed here. I would post in the developer forums.
Do you have other devices running 4.2.1 that DO work with your installation of Xcode? Do you have any other devices at all that DO work with your installation of Xcode?
Please be aware that apparently the architecture setting is case-sensitive.
I manually added 'Armv6' and nothing still worked.
Changing this to 'armv6' did the trick.

Resources