I've had more fragmentation problems with iOS/iPhone than with Android

There has been a great deal of talk about the issues Android has with fragmentation and the problems that presents developers. However over the last few months I have had more iPhone/iOS fragmentation problems than I've ever had with Android.
It's not rocket science
I have both iOS and Android versions of my mobile app iDealyzer. It's a utility app for tracking many of the hundreds of daily deals. All versions share the same server side application that scrapes and consolidates the daily deals. The mobile part of the apps read this consolidated data and display it. So this is not rocket science but there is a reasonable amount of complexity that I hope is hidden from the user. The iOS versions have been live for approximately 18 months and the Android for a little less than a year. During most of that time they have been coexisting nicely.
People are not happy
The problem started when I updated iDealyzer Pro for iOS to support the iPad. After much work I released it into the wild excited for some positive feedback on what I thought was a great update. But what happened was a flurry of negative feedback from users saying they updated and now iDealyzer crashed on startup. Not good. After a little while it became clear that all the users reporting this issue where still on iOS 3.1.3 either because they didn't want to or couldn't upgrade. From looking through the app store I could see these users and many others where experiencing the same kind of problems with other apps. The reason for the epidemic of problems was that with the current version of Xcode it was no longer possible to test in the simulator with iOS 3.1.3. Also I suspect like me most developers eagerly upgraded their devices so they could verify their apps would work on the newer released.
Fixing it
So although I had followed Apple's documentation for coding an app that plays nicely on iPad's and iPhones/iPod Touches I had a problem on my hands that I needed to fix fast. I first tried downgrading a device to 3.1.3. I spent many hours/days trying that before I gave that up. So I had to find another device that hadn't been upgraded. So I put the word out that I was looking for a 1st gen iPhone or iPod touch. In the mean time with the help of google I found some potential problems in my app, fixed them and posted an update for Apple's approval. My plan was I could get through some of the approval wait time while I found a 3.1.3 device and reject the update if it failed testing. Of course this was a time when Apple approved an update fast and it went out before I could test and I had not fixed all the issues. Unhappy users again, not good.
I later found someone that was kind enough to loan me a 1st gen iPhone. I was able to test and fix all the issues and post an update for approval to Apple. At last, no more bad reviews and some users even came back to update their reviews and say thanks for the fix. All was good.
Broken again
Later I worked on another update to add TapZilla support to the app. By this time I had returned the 1st gen iPhone. So I did not test this update on a 3.1.3 device. Can you see where this is going? I was not worried about breaking it again as the changes in this update did not touch anything that had issues before. I posted the update for Apple approval, it went live and once again bad reviews about the updated app crashing. So I went back to my 1st gen iPhone wielding friend did some more testing and found I had lost my previous fixes. I must have fumbled in the SVN check in. So I fixed it again submitted it to Apple and with some prompting they approved it. Problem solved again but now there are even more bad reviews lingering.
Lessons learned
I am now buying that 1st gen iPhone and I'll be testing all updates on it for the foreseeable future. In general I'll make sure anything I do is tested on the base version I'm deploying for. That won't be a problem for Android as I can always test in whichever OS version I want with the emulator. I've also got around to importing iTunes reviews into getidealyzer.com so I can respond to the many questions people post in them. That will be going live once I'm done with adding the responses. However the best thing I learned was from those bad reviews. People where angry because they use iDealyzer on a daily basis and where very frustrated that it was not working for them.


Comments
From one end user's standpoint
What is more surprising to me is that based on this report Apple has forgotten or would like to ignore legacy support altogether. Now I am a user, not a developer, from my stand point it just seems that a Dev has to jump through a lot of hoops and employ a relatively hacky work around to get the job done right. I find this to be a little out of character for a company like Apple that is consistently lauded for covering all of the angles and providing an end to end experience that anyone can enjoy. If a Dev has to "use Google to locate the many examples of other developers who have posted solutions to" the multiple SDK version issue, I think that in and of itself is a hot cup of fail for the people that control the development platform. The solution seems so simple so why wouldn't Apple just do it and keep it simple? I understand they want to move forward but end users lock into a new handset for two years so there is always going to be some of the old hardware out there. While running an update is not rocket science there are a number of people out there that just don't want to make the move, are worried that something bad will happen or don't know what their phone is telling them when an update is available. I would think that going back one major release would be encouraged even required.
Well the Smartphone OS market is moving so dang fast I bet most people do not even think about it until it bites them in the butt a little bit. Apple went from 3.1.3 in Feb of 2010 to 4.0 in June of 2010 to 4.2.1 in November so everybody should be running in the 4.0s right? The people that bought the last of the 3G and 3GS they got a hefty discount so they can't expect much can they. If you are hanging onto something older than that you may as well break out your Razr and just give up.
I think you are right Apple
I think you are right Apple wants to encourage adoption of the newer versions. But don't forget that anyone with a 1st gen device can't upgrade even if they want to. They have to go out and buy another device. For the users that can upgrade but are worried of the effects it may have not being able to downgrade adds to that anxiety.
I seriously thought about dropping support for 3.1.3 after the first failed update but half of my revenue comes from use of the app. So I don't think that would be a smart move business wise.
Minimum version?
Can you specify to the App Store that your app is only for >=4.0? It would reduce the potential market, but at least mean that you could be sure you were only selling it to people with a tested OS.
Yes I could have done that.
Yes I could have done that. With the first failed release I did not realize the discrepancy. I considered not supporting 3.1.3 for subsequent updates but I now realize how many people out there are still on that version. So I really want to support those users.
Yes, he could've marked it 4.0 and higher.
And if he was a competent dev, that's exactly what he would've done.
The reality is that this has nothing to do with fragmentation and everything to do with the dev being an incompetent moron who didn't test his app on a particular version, didn't read the SDK to verify that functions were present, didn't write robust code that failed gracefully when they weren't present, and after taking exactly *zero* steps to make sure the app worked on 3.1, released it marked as good on 3.1.
Stupid.
Yes, he could've not sold to all of the install base...
Your comment is stupid. Yes, we could all just ignore OS fragmentation on any device (including Android) by changing deployment settings, but then we would all not get the sales and revenue needed now would we.
Advice
Please try being less of a tool.
Criticisms by Anonymous
Such biting criticism never comes from someone who develops code and releases commercial product, and never anonymously.
Only an idiot puts their real
Only an idiot puts their real name on forum posts and plenty of revs would and do say the same thing
But no good ones would.
But no good ones would.
Incorrect
Your comment is far dumber than anything he did or wrote because you missed the whole point of the post. Apple doesn't allow you to write apps for current iOS versions while testing on older devices because you're only allowed one SDK install; if you want to develop for iOS 4.1, you must delete all previous iOS SDKs. This is their design decision to make, and has its strengths and weaknesses, but here's the point of the post: many of their policies such as that one are flat-out stupid when their message is one of integration vs. fragmentation, because those policies exacerbate fragmentation in ways frustrating for developers
That you can't even downgrade a test device (I've tried it too) is patently absurd. You can't run apps on old simulators because you're not allowed old SDKs. But another kicker is the App Store: it requires approval, and while we don't need to reprise the familiar refrain of arbitrary, pointless rejections, remember they are supposed to be a price that developers bear so consumers don't get hit with bad apps, or apps with undesirable properties. Even if the author made a mistake and included functions not present in previous iOS versions, shouldn't the App Store reviewer run the app on iOS 3.x, given that the app wasn't marked iOS 4.x only? Especially since, as stated above, it's essentially impossible to test on previous iOS versions unless you have that lucky, magical friend who didn't update?
And he didn't write code that degraded gracefully because he had no idea there was anything wrong with it (yes, he should have checked, but what ended up being wrong with it should have been caught by Apple's Reviewers). But the problem is with Apple, advertising integrated while making it impossible for you to test this. Moron :-p
Wrong, you can have multiple version of Xcode
I have had at least 3 before, you just change the installed folder from Developer to Developer3.1 or something, nothing could be easier. And they all work, no problems.
Or, you can set the iOs deployment flag to 4.0, and then all the old users will keep using their current version of the app, and people on iOS>4.0 will get the updates.
Still, this is a problem, I understand Apples reasoning (they want developers to move to the latest OS), but it can cause issues. However, this is nothing like the fragmentation issue that Android faces, and google will probably fix in the next OS.
Nonsense claims
"You're only allowed one SDK install" I would like to see a reference to back up this ignorant claim.
Apple provides copies of legacy versions of Xcode for download at http://connect.apple.com/ . Your ignorance about the existence of a resource does not mean that you are not allowed to use that resource.
If "you're only allowed one" I wonder why Apple tell developers to download and install multiple versions of Xcode in different directories?
No support for developer
The reason for the epidemic of problems was that with the current version of Xcode it was no longer possible to test in the simulator with iOS 3.1.3.
Just how is he supposed to test it with iOS 3 when Apple doesn't offer a way to do so other than spending more money on an outdated device, which is harder to debug on than an emulator/simulator? That's the problem. The only options that the Apple Dictatorship have given him are 1) Drop support for iOS < 4; 2) Buy more hardware for *old* users (a declining market share) that you didn't used to need.
While he perhaps should have done more testing before releasing the app, Apple certainly shares some blame for making it harder than it should be to do said testing.
Just use Xcode 3.2.2.
Just download Xcode 3.2.2 from http://connect.apple.com/ and install it in its own directory so it doesn't touch your existing Xcode. Now test on it. It includes a 3.1.3 Simulator. Problem solved.
Apple Could Just Continue to Allow it...
Or, how about Apple wake up and support it by default in their new versions of Xcode? The point here is that Android/Google has built in support for testing on older versions in a decent way. Apple asks you to jump through a series of hoops to just test it in their "simulator" which is nothing like a real device.
I develop for both, and dealing with OS fragmentation is far easier in Android then iOS. Sorry, it just is. If Apple would just admit they have OS fragmentation as well and then support the developers who have to deal with it better, then this would be a non-issue.
But that would have required
But that would have required using Google to locate the many examples of other developers who have posted solutions to this...
Thanks for the support
Thanks for the support Anonymous. In a perfect I would not make any mistakes. However I did and I'm just being honest here.
sweet
Nice, i knew i bought that $50 2g iphone for a reason. Now maybe i can sell it and get rich.