> I was not worried about breaking it again as the changes in this update did not touch anything that had issues before...I must have fumbled in the SVN check in.
Even if this wasn't the case, it's always possible that some new chunk of code you're adding requires a library that doesn't exist on down-level OS versions. Or the new code doesn't properly check existing libraries for the availability of classes or methods (e.g. some UIKit classes only exist in iOS 4.0 and up. To ensure that your app doesn't crash on older versions, you need to test for the existence of the class you want to instantiate). If any of these conditions hold true, crash city.
I own every iPhone that Apple has released, and I keep my original iPhone on 3.1.3 for precisely this kind of scenario. In fact, just yesterday I had to fix a couple iOS 3.1.3-specific bugs, and couldn't have done it without that original iPhone.
Long story short: if you're going to claim you support a particular platform, you better test on it. If you can't or won't test on it, then don't support that platform as a deployment target.
Some things that may have helped him not get into issues with Android -
You can create AVDs (Android Virtual Device) that have different hardware capabilities (RAM, Camera, SDCard, Screen Sizes etc.) and run different versions of Android - 1.6 to 2.3 as of now. This makes testing your app very easy - you just set a minimum SDK version and if your app doesn't do weird things (uses features that don't work on a version of Android and declares support for that version)- most times it works very well.
More than anything though - the developer can just push a beta in the Market and receive excellent feedback from users - user submitted stack traces, device info, feedback etc. can be very valuable in identifying and fixing compat issues.
How is this a tale about fragmentation on either operating system's ecosystems? It reads more like a story about how the developer has a faulty approach to releasing software. He made the mistake of making an assumption that turned out to be erroneous, and then had an issue with his version control. He fixed the issues and everything was good with the world. Once again, how is this fragmentation? If he where complaining that the review process takes too long, then point taken and I agree, but this has more to do with user error than with the ecosystem itself.
The problem is that Apple deprecates their SDK really quickly. As developers, that makes it really tough to test old versions of iOS when installing an updated SDK REMOVES previous versions!! Even if you select an older "OS Deployment Target", you're out of luck unless you have a device to test it on. The Simulator is always running the latest version.
I guess they assume everyone will upgrade, but a lot of people don't or can't.
> The Simulator is always running the latest version.
Actually this appears to be false now. I just fired up my iOS Simulator, and in the "Hardware" menu I can select which OS version I want, either 3.2, 4.0.2, 4.1, or 4.2.
Just install Xcode 3.2.2, which does include support for the Simulator 3.1.3.
You can get it from http://connect.apple.com/ - select Developer Tools, find 3.2.2. in the page, download it, and install it to a directory other than the default /Developer, so your existing tools won't be affected. You might want to skip the installation of the developer utilities, since the ones from the current Xcode will be more up to date.
But you still are missing an important point. The Simulator is not an emulator. It does not run the same instruction set as the device itself. So the best way to test is still with actual devices running the versions of the OS you are interested in testing.
I absolutely I agree testing on a device is necessary. In fact I use push notifications which cannot be tested at all in the simulator. It is also true with the Android emulator. As an emulator it is closer to a device but still not the same.
However the bugs I had would have been picked up in the simulator.
Thanks for the pointer for the older version of Xcode. That would have been great but at this point I may as well do my 3.1.3 testing on the device.
How is this a major fragmentation problem? This is a story trying to point out fragmentation issues but only points to one problem (testing on iOS 3.1.3). There are many more fragmentation issues with Android than this one story.
The reason people bring Android fragmentation as a negative is because they claim it's hard for developers to support all different Android devices.
This post shows that iPhone has the same problem: every iOS version is a fragmentation point. If you want to support version X1, X2, X3, X4 etc. of iOS you have to make sure it works on all those versions, just like if you want to support version X1, X2, X3, X4 etc. of Android, you have to make sure it works on all those versions.
The post shows another thing: that while Google makes it easy for developers to support all OS versions by providing decent development tools (i.e. emulator that supports older OS versions) and providing developer-friendly phones (so that you can install different versions on the device).
In contrast Apple makes it difficult by forbidding developers to downgrade their phones for testing or providing emulators for older devices so developers have to jump through major hoops to make sure that their software runs on devices that are still being used by a nontrivial amount of users.
To summarize: in practice supporting multiple version of Apple's iOS is harder than supporting multiple versions of Android due to Apple's shitty developer tools and their general shitty attitude to developers, at least according to that one developer.
No, the problem here isn't supporting _devices_ but OSes. If you flag your app as v4 (correctly) anyone who wants to use it can upgrade to v4 and use it. No fragmentation. Under Android it's a dog's breakfast just on that point, forget screen resolutions etc.
Have you developed for Android and released a useful app? What are you basing your dog breakfast story on? That doesn't ring true at all for anyone who has developed for Android.
Well, they also claim "Fragmentation on the device side is not a huge problem"[1]. They do say ecosystem fragmentation is a problem. The problem addressed in your link is more underpowered devices than fragmentation. Sure, Android's ability to be slapped on any hardware leads the problems of underpowered devices, but it isn't really fragmentation.
Do you actually have any specifics about Android fragmentation causing a problem? If you do, ESR has been trying to find any specifics to back up the generic claims of fragmentation, and has said he has not found any reasonable evidence of such problems. Same question for all you apparent Apple fanboys who voted this comment up so much, any specifics? If you have any here's the thread where ESR's been requesting them - http://esr.ibiblio.org/?p=2835.
I program for both platforms. A couple things that annoy me the most often, aside from devices shipping with old versions of Android:
- Resolution differences, and no real scalable interface APIs.
- HTC vs Blur vs Samsung's distribution of Android. They all dick with stuff their own way.
- Physical buttons on each device. Some are overly sensitive capacitive buttons, clicky buttons, or high latency. Each require model specific code.
You can verify this by searching the release notes for apps in the Market. There's commonly caveats for certain models.
Avoid fragmentation by just dropping support for older versions of the OS?
Keep in mind, Apple occasionally charges for iOS upgrades, so requiring an upgrade effectively increases the cost of your application by a nontrivial amount. Not all users want to upgrade, especially when upgrades degrade performance and have limited new features for older devices.
"Keep in mind, Apple used to charge for iOS upgrades, so requiring an upgrade effectively increases the cost of your application by a nontrivial amount." [FTFY]
Apple attributed the fee to strange accounting rules (something dealing with when revenue is recognized - I don't exactly recall off hand) - rules which were recently changed. Just an excuse to milk some more cash out of iPod touch users? Maybe - I won't argue with you on that. But as of iOS 4.0, Apple no longer charges iPod touch users for updates.
"Not all users want to upgrade, especially when upgrades degrade performance and have limited new features for older devices."
Here is the real roadblock to updating. 4.0 has rendered my 3G frustratingly unusable. In my mind, those who haven't updated fall into three camps:
1. Those who jailbroke and haven't gone through the hassle of updating
2. Those who could care less about new features/aren't aware there is an update
3. As you mentioned, those who have older devices and don't want to update because of performance or development reasons
Every developer who has ever used the Android VM should know that testing on it IS NOT a bulletproof test. Sometimes things work on the device which aren't working in the VM even if it is the same version, resolutions and so on.
Sometimes things will work in the VM and not on the device.
You don't believe me? Go on and try to stream a video on a Android 1.6 VM.
BTW: I'm developing a iPhone App in my spare times and a Android at work.
For some of the apps I've written (status: trying to get the frame-rate up) the constantly changing screensizes of the devices is a frickin' nightmare.
I'm currently really only supporting iPad because of that... but of course Apple will change the screen size on iPad 2.0 when that comes out. Aargh.
Went and bought an iPod-touch so I can test the 960x640 res if I ever get enthusiastic enough about it....
...then it turns out that Apple's implementation of multi-tasking is going to be a nightmare of a whole new dimension... lovely.
Look, this guy is right on from an OS fragmentation perspective (which is what he is talking about). Both iOS and Android have OS version fragmentation in the real world and the fact is that Google makes it easier to test for and Apple makes it very hard. I have an app(game) written for both and dealing with the iOS side of things for this is always harder then on Android.
Developer error/ignorance is cross-platform and runs on both Android and iOS. You can't blame the fact that you didn't test on the version you released for, know how to install older OS versions to test with, or check documentation on Apple OR Google.
Use TinyUmbrella or Saurik's MITM server to save your device's SHSH hash for each new iOS version that comes out. Allows downgrading to any version you had installed previously
So it's not fragmentation, Apple just doesn't let you test in previous versions. This was an easy fix for all you needed was only one phone. Unlike Android who has over 100 different versions of Android, yes you have the emulator for each base version but you can't guarantee for every phone.
I had an iPod Touch with 3.1.3 on it but by then I'd upgraded to to 4.x with no way to downgrade it. Sure I could have bought another sooner but this is not something I was expecting as up till that point I could always test in the simulator for any version.
It has been a few months since I tried to downgrade but I certainly did try and killed too much time in the process. Could you point me in the direction of some instructions?
It's fairly easy, just save your old SHSH blobs (I always jailbreak my device so I'm not sure if jailbreak is required, there's a tool called TinyUmbrella to do it), then you can downgrade to whatever version you want.
You're right. It would be so much easier if Netscape had just stayed dead, and IE was the only web browser that I had to develop for.
Also:
* It would be so much easier choosing an ISP if AOL was the only ISP in America.
* It would be so much easier being a mechanic if the only automobiles were Fords, and they only made 2 models.
* It would be so much easier developing video games if people weren't allow to configure their own systems. Then I wouldn't have to worry about all sorts of machines with various levels of beefiness in the hardware department.
Whining about Android fragmentation while praising lack of choice with Apple as 'simplicity' just seems childish.
You don't have to test on 5+ actual Android devices - emulator supports creating specific devices with different hardware and software versions. Plus you can alway push your beta in the market and let lots of users with actual devices do the real testing for you.
Don't you have to test on an iPad? For that matter - testing on couple real Android devices is equally effective - Galaxy Tab and Optimus S or G1/ADP and Nexus One.
My point was that you don't need to test on ALL different Android devices - just a few which seems to be similar with iOS from what you said. If you want to test lots of real devices - it's actually easy with Android - push the beta in the Market and let users do the compatibility testing.
When you say "multiple" and "easy" what exactly is the implication there? Worrying about 5-6 revisions of an API or 30-70 variances of the same problem on multiple pieces of hardware with multiple variances of platform debauchery forced upon you by a given mobile carrier?
It just isn't possible to make the case that this aspect of android doesn't make things harder and still retain any semblance of honesty or credibility.
Read the Android developer docs. API Levels document especially. Also play around with the emulator and that will clear up your misconceptions. It isn't hard at all unless you want to convince yourself that it is ;)
Even if this wasn't the case, it's always possible that some new chunk of code you're adding requires a library that doesn't exist on down-level OS versions. Or the new code doesn't properly check existing libraries for the availability of classes or methods (e.g. some UIKit classes only exist in iOS 4.0 and up. To ensure that your app doesn't crash on older versions, you need to test for the existence of the class you want to instantiate). If any of these conditions hold true, crash city.
I own every iPhone that Apple has released, and I keep my original iPhone on 3.1.3 for precisely this kind of scenario. In fact, just yesterday I had to fix a couple iOS 3.1.3-specific bugs, and couldn't have done it without that original iPhone.
Long story short: if you're going to claim you support a particular platform, you better test on it. If you can't or won't test on it, then don't support that platform as a deployment target.